2009-10-23 123 views
2

我已經繼承了一個使用jBPM和Spring的應用程序,並試圖弄清楚它是否按照應有的方式配置。jBPM + Spring交易共享和範圍

第一個問題:默認情況下,jBPM是否在同一轉換中的多個操作之間跨越單個JTA(JDBC和/或Hibernate)事務? 如果沒有,是否可以配置? 所以在下面的例子中,有一種跨越Action1和Action2跨越事務的方法。

此項目中的jBPM操作從Spring上下文中檢索服務或DAO(JDBC)。 對於下面描述的配置,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="[email protected]" /> 

    <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> 

相關的Spring配置:

<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"/> 

回答

3

我知道這是一個遲到的回覆(1歲的問題),但也許它會幫助來自Google或網站搜索的其他人。

您還沒有指定您正在使用的JBPM的版本,所以我假設4.x的,因爲5不準備再回來;)

JBPM在它自己的事務中運行的每個命令(任務)默認情況下使用它自己的事務管理器來完成這項工作。因此,爲了使用Spring,您必須對jbpm.cfg.xml進行一些更改,即注入<spring-transaction-interceptor /><hibernate-session current="true" />

本博客文章應該幫助配置這一切,雖然: http://blog.aparnachaudhary.net/2010/08/19/jbpm4-4-with-spring3/