[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