понедельник, 25 апреля 2011 г.

Получение текущих даты/времени с миллисекундами в Oracle SOA Suite


Oracle BPEL - составная часть Oracle SOA Suite - содержит функцию xp20:current-dateTime(), возвращающую текущую дату и время в формате ISO (пространство имен xp20 соответствует http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20). Однако, данная функция возвращает время с точностью до секунды, т.е. без миллисекунд, которые зачастую бывают нужны. Таким образом возникает задача получения строки, представляющей собой текущие дату и время в формате ISO с точностью до миллисекунды.

Для решения данной задачи воспользуемся оператором Oracle BPEL под названием Embedded Java. Как видно из названия, данный оператор предназначен для включения в BPEL процесс участков Java-кода. Прежде всего нам нужно определить необходимые импорты. Для конвертации даты в строку мы будем использовать класс XMLGregorianCalendar, а для манипуляций с датой/временем - GregorianCalendar:

  <bpelx:exec import="java.util.Date"/>  

  <bpelx:exec import="java.util.GregorianCalendar"/>  

  <bpelx:exec import="javax.xml.datatype.DatatypeConfigurationException"/>  

  <bpelx:exec import="javax.xml.datatype.DatatypeFactory"/>  

  <bpelx:exec import="javax.xml.datatype.XMLGregorianCalendar"/>          


Импорты необходимо вставить непосредственно в исходный код BPEL-процесса перед директивой partnerLinks.

Теперь можно создать переменную типа xsd:string, в которую мы будем записывать текущие дату и время. Для создания переменной необходимо открыть окно Variables...:



... и нажать кнопку Create (изображена в виде знака сложения):



В появившемся окне нужно задать название переменной - startDateTime и выбрать тип Simple Type -> string:



После нажатия на кнопку OK переменная будет создана.

Теперь можно поместить в BPEL-процесс оператор Embedded Java, перетащив его с палитры компонентов, и отредактировать непосредственно Java-код. Для редактирования кода нужно два раза щелкнуть по изображению оператора:



Появится окно редактирования кода, в которое необходимо написать следующее:



В данном коде мы сначала создаем экземпляр класса GregorianCalendar и заполняем его значениями текущих даты и времени. Затем, с помощью DatatypeFactory, строим объект класса XMLGregorianCalendar. Метод toXMLFormat() данного класса возвращает строковое представление календаря в формате ISO.

Метод setVariableData является частью API Oracle BPEL и служит для изменения значения переменной BPEL-процесса или ее части.

В виде исходного кода на языке BPEL данный оператор будет выглядеть следующим образом:

<bpelx:exec name="SetStartTime" version="1.5" language="java">

      <![CDATA[try {

            GregorianCalendar gcalendar = new GregorianCalendar();

            gcalendar.setTimeInMillis((new Date()).getTime());

         

            DatatypeFactory       factory  = DatatypeFactory.newInstance();

            XMLGregorianCalendar  calendar = factory.newXMLGregorianCalendar(gcalendar);

       

          setVariableData("startDateTime", calendar.toXMLFormat());  

        }

        catch(DatatypeConfigurationException e) {

            e.printStackTrace();

        }]]>

</bpelx:exec>


Результат выполнения оператора может быть следующим:

<startDateTime>2011-04-25T20:44:43.355+04:00</startDateTime>

 


UPD 24.06.2010 Конечно же есть гораздо более простой способ получить текущую дату и время в заданном формате - использовать функцию ora:getCurrentDateTime(format?), однако описанный в статье пример можно рассматривать как пример использования активности EmbeddedJava в BPEL-процессе.

Понравилось сообщение - подпишитесь на блог

5 комментариев:

dmatsynin комментирует...

Павел, спасибо за интересные статьи!
Кажется перед тем как "Теперь можно отредактировать непосредственно Java-код, исполняемый оператором Embedded Java" его собственно нужно бросить на BPEL процесс, а то не понятно, откуда он берется.

Pavel Samolisov комментирует...

Да, спасибо за замечание, поправил.

Скажите, какие темы по Oracle BPEL/Oracle SOA Suite еще могут быть интересны?

dmatsynin комментирует...

Интересно почитать про взаимодействие с WorkFlow Framework, как создавать кастомизированные web приложения с Human Task'ами.

Pavel Samolisov комментирует...

Мне самому это интересно, но к сожалению совсем не было времени разобраться. Придется выкраивать.

Unknown комментирует...

Если позволите небольшое дополнение, указанное объявление классов сработает только для BPEL 1.1.
Для BPEL 2.0 объявление классов выглядит чуть иначе:

Отправить комментарий

Любой Ваш комментарий важен для меня, однако, помните, что действует предмодерация. Давайте уважать друг друга!