2009-10-23 77 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/