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"/>
<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>
<![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 комментариев:
Павел, спасибо за интересные статьи!
Кажется перед тем как "Теперь можно отредактировать непосредственно Java-код, исполняемый оператором Embedded Java" его собственно нужно бросить на BPEL процесс, а то не понятно, откуда он берется.
Да, спасибо за замечание, поправил.
Скажите, какие темы по Oracle BPEL/Oracle SOA Suite еще могут быть интересны?
Интересно почитать про взаимодействие с WorkFlow Framework, как создавать кастомизированные web приложения с Human Task'ами.
Мне самому это интересно, но к сожалению совсем не было времени разобраться. Придется выкраивать.
Если позволите небольшое дополнение, указанное объявление классов сработает только для BPEL 1.1.
Для BPEL 2.0 объявление классов выглядит чуть иначе:
Отправить комментарий
Любой Ваш комментарий важен для меня, однако, помните, что действует предмодерация. Давайте уважать друг друга!