Совместное использование и объем транзакций jBPM + Spring

StackOverflow https://stackoverflow.com/questions/1612340

Вопрос

Я унаследовал приложение, используя jBPM и Spring, и пытаюсь выяснить, настроено ли оно так, как должно быть.

Первый вопрос: охватывает ли jBPM одну транзакцию JTA (JDBC и / или Hibernate) между несколькими действиями в одном переходе по умолчанию? Если нет, можно ли его настроить? Таким образом, в приведенном ниже примере есть способ охватить транзакцию между Action1 и Action2.

Действия jBPM в этом проекте извлекают службы или DAO (JDBC) из контекста Spring. Для конфигурации, описанной ниже, инкапсулированы ли действия jBPM и методы обслуживания / DAO, которые они вызывают, в одну транзакцию? DAO и сервисные методы аннотируются самим @Transactional.

Определение состояния:

<state name="SomeState">
    <event type="node-enter">
    <action class="SomeAction"/>
    </event>
    <transition name="transition1" to="finish">
    <action class="Action1"/>
    <action class="Action2"/>
    </transition>
    <transition name="transition.stop" to="finish"/>
</state>

Моя конфигурация jBPM:

<jbpm-configuration>

    <jbpm-context>
        <!--<service name="persistence" factory="org.jbpm.persistence.db.DbPersistenceServiceFactory" />-->
    <service name="persistence">
        <factory>
            <bean class="org.jbpm.persistence.jta.JtaDbPersistenceServiceFactory">
                <field name="isTransactionEnabled">
                    <false />
                </field>
            </bean>
        </factory>
    </service>
    <service name="tx" factory="org.jbpm.tx.TxServiceFactory" />
    <service name="message" factory="org.jbpm.msg.db.DbMessageServiceFactory" />
    <service name="scheduler" factory="org.jbpm.scheduler.db.DbSchedulerServiceFactory" />
    <service name="logging" factory="org.jbpm.logging.db.DbLoggingServiceFactory" />
    <service name="authentication" factory="org.jbpm.security.authentication.DefaultAuthenticationServiceFactory" />
    </jbpm-context>

    <!-- configuration property used by persistence service impl org.jbpm.persistence.db.DbPersistenceServiceFactory -->
    <string name="resource.hibernate.cfg.xml" value="hibernate.jbpm.cfg.xml" />

    <!-- configuration resource files pointing to default configuration files in jbpm-{version}.jar -->
    <string name="resource.business.calendar" value="org/jbpm/calendar/jbpm.business.calendar.properties" />
    <string name="resource.default.modules" value="org/jbpm/graph/def/jbpm.default.modules.properties" />
    <string name="resource.converter" value="org/jbpm/db/hibernate/jbpm.converter.properties" />
    <string name="resource.action.types" value="org/jbpm/graph/action/action.types.xml" />
    <string name="resource.node.types" value="org/jbpm/graph/node/node.types.xml" />
    <string name="resource.parsers" value="org/jbpm/jpdl/par/jbpm.parsers.xml" />
    <string name="resource.varmapping" value="org/jbpm/context/exe/jbpm.varmapping.xml" />
    <string name="resource.mail.templates" value="jbpm.mail.templates.xml" />

    <int name="jbpm.byte.block.size" value="1024" singleton="true" />
    <bean name="jbpm.task.instance.factory" class="org.jbpm.taskmgmt.impl.DefaultTaskInstanceFactoryImpl" singleton="true" />
    <bean name="jbpm.variable.resolver" class="org.jbpm.jpdl.el.impl.JbpmVariableResolver" singleton="true" />
    <string name="jbpm.mail.smtp.host" value="localhost" />
    <bean name="jbpm.mail.address.resolver" class="org.jbpm.identity.mail.IdentityAddressResolver" singleton="true" />
    <string name="jbpm.mail.from.address" value="jbpm@noreply" />

    <bean name="jbpm.job.executor" class="org.jbpm.job.executor.JobExecutor">
    <field name="jbpmConfiguration"><ref bean="jbpmConfiguration" /></field>
    <field name="name"><string value="JbpmJobExecutor" /></field>
    <field name="nbrOfThreads"><int value="1" /></field>
    <field name="idleInterval"><int value="5000" /></field>
    <field name="maxIdleInterval"><int value="3600000" /></field> <!-- 1 hour -->
    <field name="historyMaxSize"><int value="20" /></field>
    <field name="maxLockTime"><int value="600000" /></field> <!-- 10 minutes -->
    <field name="lockMonitorInterval"><int value="60000" /></field> <!-- 1 minute -->
    <field name="lockBufferTime"><int value="5000" /></field> <!-- 5 seconds -->
    </bean>

</jbpm-configuration>

Соответствующая конфигурация пружины:

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"/>

<bean class="org.springframework.transaction.interceptor.TransactionAttributeSourceAdvisor">
    <property name="transactionInterceptor" ref="txInterceptor"/>
</bean>

<bean id="txInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
    <property name="transactionManager" ref="transactionManager"/>
    <property name="transactionAttributeSource">
    <bean class="org.springframework.transaction.annotation.AnnotationTransactionAttributeSource"/>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/>
Это было полезно?

Решение

Я знаю, что это поздний ответ (вопрос на 1 год), но, возможно, это поможет другим пользователям Google или поиска по сайту.

Вы не указали, какую версию JBPM вы используете, поэтому я предполагаю, что 4.x потому что 5 тогда еще не был готов;)

JBPM запускает каждую команду (задачу) в своей собственной транзакции по умолчанию и использует свой собственный менеджер транзакций для этой работы. Таким образом, для того, чтобы он использовал Spring, вы должны внести некоторые изменения в jbpm.cfg.xml, а именно inject <spring-transaction-interceptor /> и <hibernate-session current="true" />.

Это сообщение в блоге должно помочь настроить все это, хотя: http://blog.aparnachaudhary.net/2010/08/ 19 / jbpm4-4-с-spring3 /

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top