[jboss-svn-commits] JBL Code SVN: r34826 - in labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src: test/java/org/drools/container/spring and 5 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Sun Aug 22 09:34:38 EDT 2010
Author: eaa
Date: 2010-08-22 09:34:37 -0400 (Sun, 22 Aug 2010)
New Revision: 34826
Added:
labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/
labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/MyDroolsBean.java
labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/TestWorkItemHandler.java
labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/TimerFlowTest.java
labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/resources/org/drools/container/spring/timer/
labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/resources/org/drools/container/spring/timer/conf/
labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/resources/org/drools/container/spring/timer/conf/spring-conf.xml
labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/resources/org/drools/container/spring/timer/flow/
labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/resources/org/drools/container/spring/timer/flow/timer-flow.rf
Modified:
labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringJpaManager.java
labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringTransactionManager.java
Log:
JBRULES-2667: DroolsSpringJpaManager should use different Entity Managers for CMD and APP.
- Modified DroolsSpringJpaManager in order to use 2 different EM.
- Fixed a bug in DroolsSpringTransactionManager that prevented getStatus() to work properly.
- Added test scenario
Modified: labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringJpaManager.java
===================================================================
--- labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringJpaManager.java 2010-08-21 03:20:56 UTC (rev 34825)
+++ labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringJpaManager.java 2010-08-22 13:34:37 UTC (rev 34826)
@@ -24,22 +24,32 @@
import org.drools.runtime.EnvironmentName;
import org.springframework.orm.jpa.EntityManagerHolder;
import org.springframework.transaction.support.TransactionSynchronizationManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+/**
+ *
+ * @author Mark Proctor
+ * @author Esteban Aliverti
+ */
public class DroolsSpringJpaManager
implements
JpaManager {
+
+ Logger logger = LoggerFactory.getLogger( getClass() );
+
Environment env;
private EntityManagerFactory emf;
private EntityManager appScopedEntityManager;
-
+
private boolean internalAppScopedEntityManager;
-
+
public DroolsSpringJpaManager(Environment env) {
this.env = env;
this.emf = ( EntityManagerFactory ) env.get( EnvironmentName.ENTITY_MANAGER_FACTORY );
-
+
getApplicationScopedEntityManager(); // we create this on initialisation so that we own the EMF reference
// otherwise Spring will close it after the transaction finishes
}
@@ -51,51 +61,78 @@
if ( this.appScopedEntityManager != null && !this.appScopedEntityManager.isOpen() ) {
throw new RuntimeException("Provided APP_SCOPED_ENTITY_MANAGER is not open");
}
-
+
if ( this.appScopedEntityManager == null ) {
EntityManagerHolder emHolder = ( EntityManagerHolder ) TransactionSynchronizationManager.getResource( this.emf );
if ( emHolder == null ) {
this.appScopedEntityManager = this.emf.createEntityManager();
emHolder = new EntityManagerHolder( this.appScopedEntityManager );
- TransactionSynchronizationManager.bindResource( emf,
- emHolder );
+ TransactionSynchronizationManager.bindResource( this.emf,
+ emHolder );
+ internalAppScopedEntityManager = true;
} else {
this.appScopedEntityManager = emHolder.getEntityManager();
}
-
+
this.env.set( EnvironmentName.APP_SCOPED_ENTITY_MANAGER,
emHolder.getEntityManager() );
- internalAppScopedEntityManager = true;
- }
+ }
}
+ if (TransactionSynchronizationManager.isActualTransactionActive()){
+ this.appScopedEntityManager.joinTransaction();
+ }
return this.appScopedEntityManager;
}
public EntityManager getCommandScopedEntityManager() {
- return getApplicationScopedEntityManager();
+ return (EntityManager) this.env.get( EnvironmentName.CMD_SCOPED_ENTITY_MANAGER);
}
public void beginCommandScopedEntityManager() {
- this.env.set( EnvironmentName.CMD_SCOPED_ENTITY_MANAGER,
- this.appScopedEntityManager );
+ if ( this.getCommandScopedEntityManager() == null || !this.getCommandScopedEntityManager().isOpen() ) {
+ EntityManagerHolder emHolder = ( EntityManagerHolder ) TransactionSynchronizationManager.getResource( "cmdEM" );
+ EntityManager em = null;
+ if ( emHolder == null ) {
+ em = this.emf.createEntityManager();
+ emHolder = new EntityManagerHolder( em );
+ TransactionSynchronizationManager.bindResource( "cmdEM",
+ emHolder );
+ } else {
+ em = emHolder.getEntityManager();
+ }
+ this.env.set( EnvironmentName.CMD_SCOPED_ENTITY_MANAGER,
+ em );
+ }
+
+ this.getCommandScopedEntityManager().joinTransaction();
+ this.appScopedEntityManager.joinTransaction();
+
}
public void endCommandScopedEntityManager() {
- this.env.set( EnvironmentName.CMD_SCOPED_ENTITY_MANAGER,
- null );
+ if (TransactionSynchronizationManager.hasResource("cmdEM")){
+ TransactionSynchronizationManager.unbindResource("cmdEM");
+ if (getCommandScopedEntityManager() != null){
+ getCommandScopedEntityManager().close();
+ }
+
+ }
}
public void dispose() {
+ logger.trace("Disposing DroolsSpringJpaManager");
if ( internalAppScopedEntityManager ) {
- TransactionSynchronizationManager.unbindResource( this.emf );
+ //TransactionSynchronizationManager.unbindResource( "appEM" );
+ TransactionSynchronizationManager.unbindResource( this.emf );
if ( this.appScopedEntityManager != null && this.appScopedEntityManager.isOpen() ) {
this.appScopedEntityManager.close();
this.internalAppScopedEntityManager = false;
this.env.set( EnvironmentName.APP_SCOPED_ENTITY_MANAGER, null );
- this.env.set( EnvironmentName.CMD_SCOPED_ENTITY_MANAGER, null );
}
+ this.endCommandScopedEntityManager();
}
}
}
+
Modified: labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringTransactionManager.java
===================================================================
--- labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringTransactionManager.java 2010-08-21 03:20:56 UTC (rev 34825)
+++ labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/main/java/org/drools/container/spring/beans/persistence/DroolsSpringTransactionManager.java 2010-08-22 13:34:37 UTC (rev 34826)
@@ -23,11 +23,19 @@
import org.springframework.transaction.support.AbstractPlatformTransactionManager;
import org.springframework.transaction.support.DefaultTransactionDefinition;
import org.springframework.transaction.support.TransactionSynchronizationManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+/**
+ *
+ * @author Mark Proctor
+ * @author Esteban Aliverti
+ */
public class DroolsSpringTransactionManager
implements
TransactionManager {
+ Logger logger = LoggerFactory.getLogger( getClass() );
private AbstractPlatformTransactionManager ptm;
TransactionDefinition td = new DefaultTransactionDefinition();
@@ -36,7 +44,7 @@
public DroolsSpringTransactionManager(AbstractPlatformTransactionManager ptm) {
this.ptm = ptm;
}
-
+
private boolean localTransaction;
public void begin() {
@@ -46,7 +54,7 @@
currentTransaction = this.ptm.getTransaction( td );
localTransaction = true;
} else {
- localTransaction = false;
+ localTransaction = false;
}
}
@@ -55,12 +63,16 @@
// if we didn't begin this transaction, then do nothing
this.localTransaction = false;
this.ptm.commit( currentTransaction );
+ currentTransaction = null;
}
}
public void rollback() {
- this.localTransaction = false;
- this.ptm.rollback( currentTransaction );
+ if ( this.localTransaction ) {
+ this.localTransaction = false;
+ this.ptm.rollback( currentTransaction );
+ currentTransaction = null;
+ }
}
/**
@@ -71,6 +83,8 @@
if ( ptm == null ) {
return TransactionManager.STATUS_NO_TRANSACTION;
}
+
+ logger.debug("Current TX name (According to TransactionSynchronizationManager) : "+TransactionSynchronizationManager.getCurrentTransactionName());
if ( TransactionSynchronizationManager.isActualTransactionActive() ) {
TransactionStatus transaction = null;
try {
@@ -82,6 +96,7 @@
} else {
transaction = currentTransaction;
}
+ logger.debug("Current TX: "+transaction);
// If SynchronizationManager thinks it has an active transaction but
// our transaction is a new one
// then we must be in the middle of committing
Added: labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/MyDroolsBean.java
===================================================================
--- labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/MyDroolsBean.java (rev 0)
+++ labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/MyDroolsBean.java 2010-08-22 13:34:37 UTC (rev 34826)
@@ -0,0 +1,98 @@
+package org.drools.container.spring.timer;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+
+import org.drools.KnowledgeBase;
+import org.drools.KnowledgeBaseFactory;
+import org.drools.base.MapGlobalResolver;
+import org.drools.persistence.jpa.KnowledgeStoreService;
+
+import org.drools.runtime.Environment;
+import org.drools.runtime.EnvironmentName;
+import org.drools.runtime.StatefulKnowledgeSession;
+import org.springframework.orm.jpa.JpaTransactionManager;
+
+import org.slf4j.LoggerFactory;
+
+public class MyDroolsBean {
+
+ public static int TIMER_TRIGGER_COUNT;
+ private static int sessionId;
+ private EntityManagerFactory emf;
+ private KnowledgeBase kbase;
+ private KnowledgeStoreService kstore;
+ private JpaTransactionManager txm;
+
+ org.slf4j.Logger logger = LoggerFactory.getLogger( getClass() );
+
+
+ private TestWorkItemHandler workItemHandler = new TestWorkItemHandler();
+
+ public void initStartDisposeAndLoadSession() {
+ try {
+ EntityManager em = txm.getEntityManagerFactory().createEntityManager();
+ // create new ksession with kstore
+ StatefulKnowledgeSession ksession = kstore.newStatefulKnowledgeSession(kbase, null, getEnvironment());
+ sessionId = ksession.getId();
+
+ logger.info("\n\tSession id: "+sessionId+"\n");
+
+ ksession.getWorkItemManager().registerWorkItemHandler("testWorkItemHandler", workItemHandler);
+
+ ksession.startProcess("timer-flow", null);
+ Thread.sleep(4000);
+ ksession.dispose();
+ } catch (Exception ex) {
+ logger.error("Exception", ex);
+ }
+
+
+ }
+
+ public void endTheProcess() {
+ try {
+ StatefulKnowledgeSession ksession = kstore.loadStatefulKnowledgeSession(sessionId, kbase, null, getEnvironment());
+
+ //Sleep to check if the timer continues executing.
+ logger.info("\n\nSleeping to check that the timer is still running");
+ Thread.sleep(5000);
+
+ ksession.getWorkItemManager().completeWorkItem(TestWorkItemHandler.getWorkItem().getId(), null);
+
+ logger.info("\n\nSleeping to check that the timer is no longer running");
+ Thread.sleep(3000);
+ logger.info("Ok");
+
+
+ ksession.dispose();
+
+ } catch (InterruptedException ex) {
+ logger.error("Exception", ex);
+ }
+ }
+
+ private Environment getEnvironment() {
+ Environment environment = KnowledgeBaseFactory.newEnvironment();
+ environment.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
+ environment.set(EnvironmentName.TRANSACTION_MANAGER, txm);
+ environment.set(EnvironmentName.GLOBALS, new MapGlobalResolver());
+ return environment;
+ }
+
+ public void setEmf(EntityManagerFactory emf) {
+ this.emf = emf;
+ }
+
+ public void setKbase(KnowledgeBase kbase) {
+ this.kbase = kbase;
+ }
+
+ public void setKstore(KnowledgeStoreService kstore) {
+ this.kstore = kstore;
+ }
+
+ public void setTxm(JpaTransactionManager txm) {
+ this.txm = txm;
+ }
+}
Added: labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/TestWorkItemHandler.java
===================================================================
--- labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/TestWorkItemHandler.java (rev 0)
+++ labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/TestWorkItemHandler.java 2010-08-22 13:34:37 UTC (rev 34826)
@@ -0,0 +1,25 @@
+package org.drools.container.spring.timer;
+
+import org.drools.runtime.process.WorkItem;
+import org.drools.runtime.process.WorkItemHandler;
+import org.drools.runtime.process.WorkItemManager;
+
+public class TestWorkItemHandler implements WorkItemHandler {
+ private static WorkItem workItem = null;
+
+ public void abortWorkItem(WorkItem arg0, WorkItemManager arg1) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void executeWorkItem(WorkItem item, WorkItemManager manager) {
+ // TODO Auto-generated method stub
+ workItem = item;
+ System.out.println("**** Inside TestWorkItemHandler, suspending.... ****");
+ }
+
+ public static WorkItem getWorkItem() {
+ return workItem;
+ }
+
+}
Added: labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/TimerFlowTest.java
===================================================================
--- labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/TimerFlowTest.java (rev 0)
+++ labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/java/org/drools/container/spring/timer/TimerFlowTest.java 2010-08-22 13:34:37 UTC (rev 34826)
@@ -0,0 +1,58 @@
+package org.drools.container.spring.timer;
+
+import java.util.Properties;
+import static org.junit.Assert.*;
+import org.junit.Before;
+
+import org.junit.Test;
+import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+
+public class TimerFlowTest {
+
+ private static final Logger log = LoggerFactory.getLogger( TimerFlowTest.class );
+ private static final String TMPDIR = System.getProperty( "java.io.tmpdir" );
+
+ private ClassPathXmlApplicationContext ctx;
+
+ @Before
+ public void createSpringContext() {
+ try {
+ log.info( "creating spring context" );
+ PropertyPlaceholderConfigurer configurer = new PropertyPlaceholderConfigurer();
+ Properties properties = new Properties();
+ properties.setProperty( "temp.dir",
+ TMPDIR );
+ configurer.setProperties( properties );
+ ctx = new ClassPathXmlApplicationContext();
+ ctx.addBeanFactoryPostProcessor( configurer );
+ ctx.setConfigLocation( "org/drools/container/spring/timer/conf/spring-conf.xml" );
+ ctx.refresh();
+ } catch ( Exception e ) {
+ log.error( "can't create spring context",
+ e );
+ throw new RuntimeException( e );
+ }
+ }
+
+ @Test
+ public void doTest() throws Exception{
+
+
+ MyDroolsBean myDroolsBean = (MyDroolsBean) ctx.getBean( "myDroolsBean");
+
+ assertEquals(0,myDroolsBean.TIMER_TRIGGER_COUNT);
+
+ myDroolsBean.initStartDisposeAndLoadSession();
+
+ int n = myDroolsBean.TIMER_TRIGGER_COUNT;
+ assertTrue(n > 0);
+
+ myDroolsBean.endTheProcess();
+ assertTrue(myDroolsBean.TIMER_TRIGGER_COUNT > n);
+ }
+}
Added: labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/resources/org/drools/container/spring/timer/conf/spring-conf.xml
===================================================================
--- labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/resources/org/drools/container/spring/timer/conf/spring-conf.xml (rev 0)
+++ labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/resources/org/drools/container/spring/timer/conf/spring-conf.xml 2010-08-22 13:34:37 UTC (rev 34826)
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:drools="http://drools.org/schema/drools-spring"
+ xmlns:jee="http://www.springframework.org/schema/jee"
+ xmlns:util="http://www.springframework.org/schema/util"
+ xmlns:context="http://www.springframework.org/schema/context"
+ xmlns:tx="http://www.springframework.org/schema/tx"
+ xmlns:aop="http://www.springframework.org/schema/aop"
+ xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
+ http://drools.org/schema/drools-spring http://drools.org/schema/drools-spring.xsd
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
+ http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
+ http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
+ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
+ http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
+
+ <bean name="myDroolsBean" class="org.drools.container.spring.timer.MyDroolsBean">
+ <property name="emf" ref="entityManagerFactory" />
+ <property name="kbase" ref="knowledgeBase" />
+ <property name="kstore" ref="knowledgeStore" />
+ <property name="txm" ref="transactionManager" />
+ </bean>
+
+ <context:annotation-config/>
+
+ <drools:kstore id="knowledgeStore"/>
+
+ <drools:kbase id="knowledgeBase">
+ <drools:resources>
+ <drools:resource type="DRF"
+ source="classpath:org/drools/container/spring/timer/flow/timer-flow.rf" />
+ </drools:resources>
+ </drools:kbase>
+
+ <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
+ <property name="entityManagerFactory" ref="entityManagerFactory" />
+ </bean>
+
+ <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
+ <property name="driverClassName" value="org.h2.Driver" />
+ <property name="url" value="jdbc:h2:workflow" />
+ <property name="username" value="sa" />
+ <property name="password" value="" />
+ </bean>
+
+ <bean id="entityManagerFactory"
+ class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
+ <property name="persistenceUnitName" value="org.drools.persistence.jpa.local" />
+ <property name="dataSource" ref="datasource" />
+ <!--property name="jpaProperties">
+ <props>
+ <prop key="hibernate.connection.autocommit">false</prop>
+ <prop key="hibernate.max_fetch_depth">3</prop>
+ <prop key="hibernate.show_sql">false</prop>
+ <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
+ <prop key="hibernate.hbm2ddl.auto">create-drop</prop>
+ </props>
+ </property-->
+ </bean>
+
+
+ <!--aop:config>
+ <aop:pointcut id="timerFlowManagerMethods"
+ expression="execution(* org.drools.container.spring.timer.MyDroolsBean.*(..))"/>
+
+ <aop:advisor advice-ref="timerFlowManagerTxAdvice"
+ pointcut-ref="timerFlowManagerMethods"/>
+ </aop:config>
+
+ <tx:advice id="timerFlowManagerTxAdvice" transaction-manager="transactionManager">
+ <tx:attributes>
+ <tx:method name="initStartDisposeAndLoadSession" propagation="REQUIRED"/>
+ <tx:method name="endTheProcess" propagation="REQUIRED"/>
+ <tx:method name="*" propagation="REQUIRED" read-only="true"/>
+ </tx:attributes>
+ </tx:advice-->
+
+</beans>
Added: labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/resources/org/drools/container/spring/timer/flow/timer-flow.rf
===================================================================
--- labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/resources/org/drools/container/spring/timer/flow/timer-flow.rf (rev 0)
+++ labs/jbossrules/branches/5.1.x/drools-container/drools-spring/src/test/resources/org/drools/container/spring/timer/flow/timer-flow.rf 2010-08-22 13:34:37 UTC (rev 34826)
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<process xmlns="http://drools.org/drools-5.0/process"
+ xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
+ xs:schemaLocation="http://drools.org/drools-5.0/process drools-processes-5.0.xsd"
+ type="RuleFlow" name="timer-flow" id="timer-flow" package-name="drools.timer" >
+
+ <header>
+ <imports>
+ <import name="org.drools.container.spring.timer.MyDroolsBean" />
+ </imports>
+ </header>
+
+ <nodes>
+ <start id="1" name="Start" x="16" y="16" width="48" height="48" />
+ <end id="3" name="End" x="377" y="20" width="80" height="40" />
+ <workItem id="4" name="TestWorkItem" x="96" y="20" width="137" height="40" >
+ <work name="testWorkItemHandler" >
+ </work>
+ <onEntry>
+ <action type="expression" dialect="mvel" >System.out.println("**** Entering Test Work Item ****");</action>
+ </onEntry>
+ <onExit>
+ <action type="expression" dialect="mvel" >System.out.println("**** Exiting Test Work Item ****");</action>
+ </onExit>
+ <timers>
+ <timer id="1" delay="1000" period="2000" >
+ <action type="expression" dialect="java" >System.out.println("**** Timer Triggered ****");
+MyDroolsBean.TIMER_TRIGGER_COUNT++;</action>
+ </timer>
+ </timers>
+ </workItem>
+ </nodes>
+
+ <connections>
+ <connection from="1" to="4" />
+ <connection from="4" to="3" />
+ </connections>
+
+</process>
\ No newline at end of file
More information about the jboss-svn-commits
mailing list