Статьи

Уроки, извлеченные из интеграции jBPM 4 с Spring

Когда мне было поручено интегрировать процессный движок в один из моих проектов, я быстро принял решение в пользу Activiti . Activiti — это следующая версия jBPM 4 , совместимая с BPMN 2.0, хорошо документированная и имеющая готовый модуль для интеграции с Spring. К сожалению, во время жестокой судьбы я был отвергнут своей иерархией (по какой-то мелкой причине, я не смею здесь писать), и мне пришлось использовать jBPM. Эта статья пытается перечислить все уроки, которые я выучил в этом довольно эпическом путешествии.

Урок 1: документации jBPM недостаточно

Хотя в jBPM 4 имеется много доступной документации , когда вам приходится начинать с нуля, этого недостаточно, особенно по сравнению с собственной документацией Activiti . Например, нет подсказки о том, как загрузить jBPM в контексте Spring.

Сессия 2: это не потому, что нет документации, которой нет

jBPM 4 оборачивает все необходимые компоненты для начальной загрузки jBPM через Spring, несмотря на то, что он странно молчит о том, как это сделать. Google здесь не помогает, так как, кажется, все разработали свое собственное решение. Для любопытства вот как я наконец-то закончил делать это:
например, вот как я нашел некоторых объявленных bean-компонентов конфигурации jBPM:

<bean id="jbpmConfiguration" class="org.jbpm.pvm.internal.processengine.SpringHelper">
    <property name="jbpmCfg">
        <value>jbpm.cfg.xml</value>
    </property>
</bean>

Сначала я боялся использовать класс в пакете, который содержал страшное «внутреннее» слово, но, похоже, это единственный способ сделать это…

Урок 3: Google на самом деле не ваш друг здесь

… это было? На самом деле, я также нашел этот фрагмент конфигурации:

<bean id="jbpmConfiguration" class="org.jbpm.pvm.internal.cfg.SpringConfiguration">
    <constructor-arg value="jbpm.cfg.xml" />
</bean>

И я думаю, что если вы будете искать достаточно долго, вы найдете много других способов достижения конфигурации двигателя. Это проблема, когда не хватает документации: мы, разработчики, умные люди, поэтому мы найдем способ заставить ее работать, несмотря ни на что.

Урок 4: не забудьте настроить каркас регистрации

Этот не специфичен для jBPM, но, тем не менее, важен. Я потерял много (очень много) времени, потому что я по глупости проигнорировал сообщение, предупреждающее меня о том, что Log4J не может найти свой файл конфигурации. Создав эту проклятую вещь, я наконец смог прочитать важную информацию, которую получил при программном развертывании нового файла jPDL:

WARNING: no objects were deployed! Check if you have configured a correct deployer in your jbpm.cfg.xml file for the type of deployment you want to do.

Урок 5: правда в коде

Этот урок является прямым следствием предыдущего: так как я уже дважды проверил, что мой файл имеет расширение jbpm.xml и что в моей конфигурации правильно установлен jBPM-развертыватель, я должен был понять, что на самом деле делал код. В конце концов, это означало, что я должен был получить исходники и отладку в своей IDE, чтобы посмотреть, что произошло под прикрытием. Виновником была следующая строка:

repositoryService.createDeployment().addResourceFromInputStream("test", new FileInputStream(file));

Поскольку я использовал поток для файла, а не сам поток, мне пришлось предоставить вымышленное имя ресурса («тест»). Последний был проверен на расширение файла jpdl.xml и, конечно, с треском провалился. Это, однако, не было очевидным, прочитав сообщение об ошибке … Исправление было следующим:

repositoryService.createDeployment().addResourceFromFile(file);

Конечно, указанный файл имел правильное расширение jbpm.xml, и он работал как шарм.

Урок 6: не изобретай велосипед

В тесной связи с уроками 2 и 3 я нашел много фрагментов, полностью описывающих файл конфигурации jbpm.cfg.xml. Хотя и работает (ну, я надеюсь, что так как я не тестировал его), это излишне, подвержено ошибкам и, возможно, признак слишком большого использования Google (против использования мозга). Например, проект jbpm4-spring-demo, опубликованный в Google Code, предоставляет полноценный файл конфигурации . Благодаря длительному процессу проб и ошибок мне удалось добиться успеха с гораздо более коротким файлом конфигурации, в котором повторно использовались существующие фрагменты конфигурации:

<?xml version="1.0" encoding="UTF-8"?>
<jbpm-configuration xmlns="http://jbpm.org/xsd/cfg">
 
    <import resource="jbpm.default.cfg.xml" /><!-- Default configuration -->
    <import resource="jbpm.tx.spring.cfg.xml" /><!-- Use Spring transaction management -->
    <import resource="jbpm.jpdl.cfg.xml" /><!-- Can deploy jPDL files -->
 
</jbpm-configuration>

Урок 7: jPBM может получить доступ к контексту Spring

jBPM предлагает действие java для вызова некоторого произвольного кода Java: это может быть EJB, но мы также можем связать контекст Spring с jBPM, чтобы сделать первый доступным последним. Это легко сделать, изменив прежнюю конфигурацию:

<jbpm-configuration xmlns="http://jbpm.org/xsd/cfg">
 
    <import resource="jbpm.default.cfg.xml" />
    <import resource="jbpm.tx.spring.cfg.xml" />
    <import resource="jbpm.jpdl.cfg.xml" />
 
    <process-engine-context>
        <script-manager default-expression-language="juel"
            default-script-language="juel"
            read-contexts="execution, environment, process-engine, spring"
            write-context="">
            <script-language name="juel" factory="org.jbpm.pvm.internal.script.JuelScriptEngineFactory" />
        </script-manager>
    </process-engine-context>
</jbpm-configuration>

Обратите внимание, что я не нашел уже существующего фрагмента для этого, обратная связь приветствуется.

Урок 8: при необходимости используйте менеджер транзакций JTA

Вы, вероятно, закончите иметь бизнес-базу данных в базе данных jBPM В большинстве компаний администраторы базы данных попросят вас поместить их в разные схемы. В этом случае не забудьте использовать диспетчер транзакций JTA вместе с некоторыми источниками данных XA для использования двухфазной фиксации. В ваших тестах вам лучше использовать ту же схему, и вам будет достаточно простого менеджера транзакций на основе источника данных.

Для тех из вас, кому нужен еще один способ настройки интеграции с jBPM / Spring, вот источники, которые я использовал в формате Maven / Eclipse. Я надеюсь, что мой подход намного более прагматичен. Во всех случаях помните, что я новичок в этом продукте.