Когда мне было поручено интегрировать процессный движок в один из моих проектов, я быстро принял решение в пользу 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. Я надеюсь, что мой подход намного более прагматичен. Во всех случаях помните, что я новичок в этом продукте.