2009-10-23 5 views
2

J'ai hérité d'une application en utilisant jBPM et Spring et j'essaie de comprendre si elle est configurée comme elle devrait l'être.jBPM + partage de transactions Spring et portée

Première question: jBPM couvre-t-il une seule transaction JTA (JDBC et/ou Hibernate) sur plusieurs actions de la même transition par défaut? Si non, peut-il être configuré pour? Ainsi, dans l'exemple ci-dessous, il existe un moyen d'étendre une transaction entre Action1 et Action2. JBPM Les actions de ce projet récupèrent les services ou DAO (JDBC) à partir du contexte Spring. Pour la configuration décrite ci-dessous, les actions jBPM et les méthodes service/DAO invoquées sont-elles encapsulées dans une transaction? Les méthodes DAO et de service sont annotées avec @Transactional elles-mêmes.

définition État:

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

Mon jBPM config:

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

config printemps pertinent:

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

Répondre

3

Je sais qu'il est une réponse tardive (1 an de question), mais peut-être que cela aidera d'autres personnes venant de Google ou de la recherche de site.

Vous n'avez pas spécifié quelle version de JBPM que vous utilisez, donc je suppose que 4.x 5 était pas prêt à l'époque;)

JBPM exécute chaque commande (tâche) dans sa propre transaction par défaut et utilise son propre gestionnaire de transactions pour ce travail. Donc, pour qu'il utilise Spring, vous devez apporter quelques modifications au fichier jbpm.cfg.xml, à savoir injecter <spring-transaction-interceptor /> et <hibernate-session current="true" />.

Ce blog devrait vous aider à configurer tous, cependant: http://blog.aparnachaudhary.net/2010/08/19/jbpm4-4-with-spring3/

Questions connexes