[jboss-svn-commits] JBL Code SVN: r23658 - in labs/jbossrules/trunk: drools-core/src/main/java/org/drools/process/instance/timer and 3 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Fri Oct 31 13:06:12 EDT 2008
Author: KrisVerlaenen
Date: 2008-10-31 13:06:12 -0400 (Fri, 31 Oct 2008)
New Revision: 23658
Modified:
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManager.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/SignalManager.java
labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java
labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPASignalManager.java
labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java
labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java
labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java
Log:
JBRULES-1755: Add default process persistence / transaction support
- timers are now also executed as part of a transaction
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManager.java 2008-10-31 17:04:37 UTC (rev 23657)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/DefaultSignalManager.java 2008-10-31 17:06:12 UTC (rev 23658)
@@ -6,6 +6,7 @@
import java.util.concurrent.CopyOnWriteArrayList;
import org.drools.process.instance.EventListener;
+import org.drools.process.instance.ProcessInstance;
public class DefaultSignalManager implements SignalManager {
@@ -43,4 +44,8 @@
}
}
+ public void signalEvent(ProcessInstance processInstance, String type, Object event) {
+ processInstance.signalEvent(type, event);
+ }
+
}
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/SignalManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/SignalManager.java 2008-10-31 17:04:37 UTC (rev 23657)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/event/SignalManager.java 2008-10-31 17:06:12 UTC (rev 23658)
@@ -1,11 +1,14 @@
package org.drools.process.instance.event;
import org.drools.process.instance.EventListener;
+import org.drools.process.instance.ProcessInstance;
public interface SignalManager {
void signalEvent(String type, Object event);
+ void signalEvent(ProcessInstance processInstance, String type, Object event);
+
void addEventListener(String type, EventListener eventListener);
void removeEventListener(String type, EventListener eventListener);
Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java 2008-10-31 17:04:37 UTC (rev 23657)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/process/instance/timer/TimerManager.java 2008-10-31 17:06:12 UTC (rev 23658)
@@ -126,13 +126,13 @@
}
ctx.getTimer().setLastTriggered(new Date());
-
+
InternalProcessInstance processInstance = ( InternalProcessInstance ) workingMemory.getProcessInstance( processInstanceId );
// process instance may have finished already
if ( processInstance != null ) {
- processInstance.signalEvent( "timerTriggered", ctx.getTimer() );
+ workingMemory.getSignalManager().signalEvent(processInstance, "timerTriggered", ctx.getTimer());
}
-
+
if (ctx.getTimer().getPeriod() == 0) {
TimerManager.this.timers.remove(ctx.getTimer().getId());
}
Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPASignalManager.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPASignalManager.java 2008-10-31 17:04:37 UTC (rev 23657)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPASignalManager.java 2008-10-31 17:06:12 UTC (rev 23658)
@@ -4,13 +4,19 @@
import javax.persistence.EntityManager;
import javax.persistence.Query;
+import javax.transaction.xa.XAException;
+import org.drools.StatefulSession;
import org.drools.WorkingMemory;
+import org.drools.persistence.Persister;
+import org.drools.persistence.Transaction;
+import org.drools.process.instance.ProcessInstance;
import org.drools.process.instance.event.DefaultSignalManager;
public class JPASignalManager extends DefaultSignalManager {
private EntityManager manager;
+ private Persister<StatefulSession> persister;
private WorkingMemory workingMemory;
public JPASignalManager(WorkingMemory workingMemory) {
@@ -21,6 +27,10 @@
this.manager = manager;
}
+ public void setPersister(Persister<StatefulSession> persister) {
+ this.persister = persister;
+ }
+
public void signalEvent(String type, Object event) {
for (long id: getProcessInstancesForEvent(type)) {
workingMemory.getProcessInstance(id);
@@ -28,6 +38,23 @@
super.signalEvent(type, event);
}
+ public void signalEvent(ProcessInstance processInstance, String type, Object event) {
+ Transaction transaction = persister.getTransaction();
+ try {
+ transaction.start();
+ super.signalEvent(processInstance, type, event);
+ transaction.commit();
+ } catch (Throwable t) {
+ t.printStackTrace();
+ try {
+ transaction.rollback();
+ throw new RuntimeException("Could not execute command", t);
+ } catch (XAException e) {
+ throw new RuntimeException("Could not rollback transaction", e);
+ }
+ }
+ }
+
@SuppressWarnings("unchecked")
private List<Long> getProcessInstancesForEvent(String type) {
Query processInstancesForEvent = manager.createNamedQuery("ProcessInstancesWaitingForEvent");
Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java 2008-10-31 17:04:37 UTC (rev 23657)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/processinstance/JPAWorkItemManager.java 2008-10-31 17:06:12 UTC (rev 23658)
@@ -8,13 +8,13 @@
import javax.persistence.EntityManager;
import org.drools.WorkingMemory;
+import org.drools.process.instance.InternalWorkItemManager;
import org.drools.process.instance.ProcessInstance;
import org.drools.process.instance.WorkItem;
import org.drools.process.instance.WorkItemHandler;
-import org.drools.process.instance.WorkItemManager;
import org.drools.process.instance.impl.WorkItemImpl;
-public class JPAWorkItemManager implements WorkItemManager {
+public class JPAWorkItemManager implements InternalWorkItemManager {
private EntityManager manager;
private WorkingMemory workingMemory;
Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java 2008-10-31 17:04:37 UTC (rev 23657)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/main/java/org/drools/persistence/session/SingleSessionCommandService.java 2008-10-31 17:06:12 UTC (rev 23658)
@@ -36,6 +36,8 @@
.setEntityManager(((JPAPersister<StatefulSession>) persister).getEntityManager());
((JPASignalManager) ((InternalWorkingMemory) session).getSignalManager())
.setEntityManager(((JPAPersister<StatefulSession>) persister).getEntityManager());
+ ((JPASignalManager) ((InternalWorkingMemory) session).getSignalManager())
+ .setPersister(persister);
}
public Object execute(Command command) {
Modified: labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java
===================================================================
--- labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java 2008-10-31 17:04:37 UTC (rev 23657)
+++ labs/jbossrules/trunk/drools-process/drools-process-enterprise/src/test/java/org/drools/persistence/session/SingleSessionCommandServiceTest.java 2008-10-31 17:06:12 UTC (rev 23658)
@@ -380,4 +380,78 @@
return packageBuilder.getPackage();
}
+ public void testPersistenceTimer2() throws Exception {
+ Properties properties = new Properties();
+ properties.put(
+ "processInstanceManagerFactory",
+ "org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory");
+ properties.put(
+ "workItemManagerFactory",
+ "org.drools.persistence.processinstance.JPAWorkItemManagerFactory");
+ properties.put(
+ "processSignalManagerFactory",
+ "org.drools.persistence.processinstance.JPASignalManagerFactory");
+ RuleBaseConfiguration conf = new RuleBaseConfiguration(properties);
+ RuleBase ruleBase = RuleBaseFactory.newRuleBase(conf);
+ Package pkg = getProcessTimer2();
+ ruleBase.addPackage(pkg);
+
+ SingleSessionCommandService service = new SingleSessionCommandService(ruleBase);
+ StartProcessCommand startProcessCommand = new StartProcessCommand();
+ startProcessCommand.setProcessId("org.drools.test.TestProcess");
+ ProcessInstance processInstance = (ProcessInstance) service.execute(startProcessCommand);
+ System.out.println("Started process instance " + processInstance.getId());
+
+ service = new SingleSessionCommandService(ruleBase);
+ GetProcessInstanceCommand getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
+ processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+ assertNotNull(processInstance);
+
+ service = new SingleSessionCommandService(ruleBase);
+ Thread.sleep(2000);
+ getProcessInstanceCommand = new GetProcessInstanceCommand();
+ getProcessInstanceCommand.setProcessInstanceId(processInstance.getId());
+ processInstance = (ProcessInstance) service.execute(getProcessInstanceCommand);
+ assertNull(processInstance);
+ }
+
+ private Package getProcessTimer2() {
+ RuleFlowProcess process = new RuleFlowProcess();
+ process.setId("org.drools.test.TestProcess");
+ process.setName("TestProcess");
+ process.setPackageName("org.drools.test");
+ StartNode start = new StartNode();
+ start.setId(1);
+ start.setName("Start");
+ process.addNode(start);
+ TimerNode timerNode = new TimerNode();
+ timerNode.setId(2);
+ timerNode.setName("Timer");
+ Timer timer = new Timer();
+ timer.setDelay(0);
+ timerNode.setTimer(timer);
+ process.addNode(timerNode);
+ new ConnectionImpl(start, Node.CONNECTION_DEFAULT_TYPE, timerNode, Node.CONNECTION_DEFAULT_TYPE);
+ ActionNode actionNode = new ActionNode();
+ actionNode.setId(3);
+ actionNode.setName("Action");
+ DroolsConsequenceAction action = new DroolsConsequenceAction();
+ action.setDialect("java");
+ action.setConsequence("try { Thread.sleep(1000); } catch (Throwable t) {} System.out.println(\"Executed action\");");
+ actionNode.setAction(action);
+ process.addNode(actionNode);
+ new ConnectionImpl(timerNode, Node.CONNECTION_DEFAULT_TYPE, actionNode, Node.CONNECTION_DEFAULT_TYPE);
+ EndNode end = new EndNode();
+ end.setId(6);
+ end.setName("End");
+ process.addNode(end);
+ new ConnectionImpl(actionNode, Node.CONNECTION_DEFAULT_TYPE, end, Node.CONNECTION_DEFAULT_TYPE);
+
+ PackageBuilder packageBuilder = new PackageBuilder();
+ ProcessBuilder processBuilder = new ProcessBuilder(packageBuilder);
+ processBuilder.buildProcess(process, null);
+ return packageBuilder.getPackage();
+ }
+
}
More information about the jboss-svn-commits
mailing list