[jbpm-commits] JBoss JBPM SVN: r2546 - in jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm: ejb/impl and 2 other directories.

do-not-reply at jboss.org do-not-reply at jboss.org
Thu Oct 16 03:31:43 EDT 2008


Author: alex.guizar at jboss.com
Date: 2008-10-16 03:31:42 -0400 (Thu, 16 Oct 2008)
New Revision: 2546

Modified:
   jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/LocalTimerEntity.java
   jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/LocalTimerEntityHome.java
   jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/impl/CommandServiceBean.java
   jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/impl/ExecuteJobCommand.java
   jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/impl/TimerEntityBean.java
   jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/msg/jms/JmsMessageServiceFactoryImpl.java
   jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EjbSchedulerService.java
   jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EjbSchedulerServiceFactory.java
   jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EntitySchedulerService.java
   jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EntitySchedulerServiceFactory.java
   jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/ExecuteTimerCommand.java
   jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/LocalTimerService.java
   jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/TimerServiceBean.java
Log:
merged revisions 1492, 1925, 1948, 2114, 2134, 2169 and 2185 from https://svn.jboss.org/repos/jbpm/jbpm3/trunk/modules/enterprise/jar/src/main/java

Modified: jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/LocalTimerEntity.java
===================================================================
--- jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/LocalTimerEntity.java	2008-10-15 19:50:24 UTC (rev 2545)
+++ jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/LocalTimerEntity.java	2008-10-16 07:31:42 UTC (rev 2546)
@@ -4,15 +4,16 @@
 
 import org.jbpm.graph.exe.ProcessInstance;
 import org.jbpm.graph.exe.Token;
+import org.jbpm.job.Timer;
 
 public interface LocalTimerEntity extends EJBLocalObject {
 
-	public void cancelTimer();
+  public void createTimer(Timer timer);
 
-	public void createTimer(org.jbpm.job.Timer timer);
+  public void cancelTimer(Timer timer);
 
 	public void cancelTimersByName(String timerName, Token token);
 
-	public void deleteTimersForProcessInstance(ProcessInstance processInstance);
+	public void cancelTimersForProcessInstance(ProcessInstance processInstance);
 
 }
\ No newline at end of file

Modified: jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/LocalTimerEntityHome.java
===================================================================
--- jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/LocalTimerEntityHome.java	2008-10-15 19:50:24 UTC (rev 2545)
+++ jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/LocalTimerEntityHome.java	2008-10-16 07:31:42 UTC (rev 2546)
@@ -10,12 +10,10 @@
 
 	public LocalTimerEntity create() throws CreateException;
 
-	public LocalTimerEntity findByPrimaryKey(Long key) throws FinderException;
+	public LocalTimerEntity findByPrimaryKey(Long timerId) throws FinderException;
 
-	public Collection findByTokenId(Long key) throws FinderException;
-
-	public Collection findByTokenIdAndName(Long key, String name)
+	public Collection findByNameAndTokenId(String name, Long tokenId)
 			throws FinderException;
 
-	public Collection findByProcessInstanceId(Long key) throws FinderException;
+	public Collection findByProcessInstanceId(Long processInstanceId) throws FinderException;
 }

Modified: jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/impl/CommandServiceBean.java
===================================================================
--- jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/impl/CommandServiceBean.java	2008-10-15 19:50:24 UTC (rev 2545)
+++ jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/impl/CommandServiceBean.java	2008-10-16 07:31:42 UTC (rev 2546)
@@ -63,7 +63,7 @@
  * </td>
  * </tr>
  * <tr>
- * <td><code>ejb/LocalTimerEntityBean</code></td>
+ * <td><code>ejb/TimerEntityBean</code></td>
  * <td>EJB Reference</td>
  * <td>Link to the local {@linkplain TimerEntityBean entity bean} that
  * implements the scheduler service. Required for processes that contain

Modified: jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/impl/ExecuteJobCommand.java
===================================================================
--- jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/impl/ExecuteJobCommand.java	2008-10-15 19:50:24 UTC (rev 2545)
+++ jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/impl/ExecuteJobCommand.java	2008-10-16 07:31:42 UTC (rev 2546)
@@ -1,5 +1,8 @@
 package org.jbpm.ejb.impl;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.jbpm.JbpmContext;
@@ -9,10 +12,10 @@
 
 public class ExecuteJobCommand implements Command {
 
+  private final long jobId;
+
   private static final long serialVersionUID = 1L;
-  
-  long jobId;
-  
+
   public ExecuteJobCommand(long jobId) {
     this.jobId = jobId;
   }
@@ -20,11 +23,25 @@
   public Object execute(JbpmContext jbpmContext) throws Exception {
     JobSession jobSession = jbpmContext.getJobSession();
     Job job = jobSession.loadJob(jobId);
-    log.debug("executing job "+jobId);
-    if (job.execute(jbpmContext)) {
-      log.debug("deleting job "+jobId);
-      jobSession.deleteJob(job);
+    job.setLockOwner(getClass().getName()); // prevent others from removing job
+    log.debug("executing " + job);
+    try {
+      if (job.execute(jbpmContext)) {
+        jobSession.deleteJob(job);
+      }
     }
+    catch (RuntimeException e) {
+      // nothing to do but clean up and exit
+      throw e;
+    }
+    catch (Exception e) {
+      // save data about recoverable error condition
+      log.error("exception while executing " + job, e);
+      StringWriter memoryWriter = new StringWriter();
+      e.printStackTrace(new PrintWriter(memoryWriter));
+      job.setException(memoryWriter.toString());
+      job.setRetries(job.getRetries() - 1);
+    }
     return job;
   }
 

Modified: jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/impl/TimerEntityBean.java
===================================================================
--- jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/impl/TimerEntityBean.java	2008-10-15 19:50:24 UTC (rev 2545)
+++ jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/ejb/impl/TimerEntityBean.java	2008-10-16 07:31:42 UTC (rev 2546)
@@ -74,6 +74,10 @@
 
 	public abstract void setProcessInstanceId(Long processInstanceId);
 
+	public abstract String getDiscriminator();
+
+	public abstract void setDiscriminator(String discriminator);
+
 	public void ejbActivate() {
     try {
       Context initial = new InitialContext();
@@ -122,56 +126,70 @@
 	public void ejbPostCreate() {}
 
 	public void ejbTimeout(javax.ejb.Timer ejbTimer) {
-		log.debug("ejb timer " + ejbTimer + " fires");
+		log.debug(ejbTimer + " fired");
 		TimerInfo timerInfo = (TimerInfo) ejbTimer.getInfo();
 		Timer timer = (Timer) commandService.execute(new ExecuteTimerCommand(timerInfo.getTimerId()));
 		// if the timer has repeat
-		if(timer != null && timer.getRepeat() != null) {
+		if (timer.getRepeat() != null) {
 			// create a new timer
-			log.debug("scheduling timer for repeat at " + timer.getDueDate());
+			log.debug("scheduling timer for repeat on " + timer.getDueDate());
 			createTimer(timer);
 		}
 	}
 
 	public void createTimer(org.jbpm.job.Timer timer) {
-		log.debug("Creating timer " + timer + " in the ejb timer service");
 		TimerService timerService = entityContext.getTimerService();
-		timerService.createTimer(timer.getDueDate(), new TimerInfo(timer));
+		javax.ejb.Timer ejbTimer = timerService.createTimer(timer.getDueDate(), new TimerInfo(timer));
+		log.debug("created " + ejbTimer);
 	}
 
-	public void cancelTimer() {
-		log.debug("Cancelling timer: " + this.getName());
+	public void cancelTimer(org.jbpm.job.Timer timer) {
+	  long timerId = timer.getId();
 		Collection timers = entityContext.getTimerService().getTimers();
+    log.debug("retrieved " + timers.size() + " ejb timer(s) by id " + timerId);
+
+    int count = 0;
 		for (Iterator i = timers.iterator(); i.hasNext();) {
 			javax.ejb.Timer ejbTimer = (javax.ejb.Timer) i.next();
-			ejbTimer.cancel();
+			TimerInfo timerInfo = (TimerInfo) ejbTimer.getInfo();
+      if (timerInfo.getTimerId() == timerId) {
+        ejbTimer.cancel();
+        ++count;
+      }
 		}
+		log.debug("canceled " + count + " ejb timer(s) by id " + timerId);
 	}
 
 	public void cancelTimersByName(String timerName, Token token) {
-		log.debug("cancelling timers with name " + timerName
-				+ " from the ejb timer service");
 		Collection timers = entityContext.getTimerService().getTimers();
+		log.debug("retrieved " + timers.size() + " ejb timer(s) by name '" + timerName + "' for " + token);
+
+		int count = 0;
 		for (Iterator i = timers.iterator(); i.hasNext();) {
 			javax.ejb.Timer ejbTimer = (javax.ejb.Timer) i.next();
 			TimerInfo timerInfo = (TimerInfo) ejbTimer.getInfo();
-			if(timerInfo.matchesName(timerName, token)) {
+			if (timerInfo.matchesName(timerName, token)) {
 				ejbTimer.cancel();
+				++count;
 			}
 		}
+		log.debug("canceled " + count + " ejb timer(s) by name '" + timerName + "' for " + token);
 	}
 
-	public void deleteTimersForProcessInstance(ProcessInstance processInstance) {
-		log.debug("deleting timers for process instance " + processInstance
-				+ " from the ejb timer service");
+	public void cancelTimersForProcessInstance(ProcessInstance processInstance) {
 		Collection timers = entityContext.getTimerService().getTimers();
+		log.debug("retrieved " + timers.size() + " timer(s) for " + processInstance);
+
+		int count = 0;
 		for (Iterator i = timers.iterator(); i.hasNext();) {
 			javax.ejb.Timer ejbTimer = (javax.ejb.Timer) i.next();
 			TimerInfo timerInfo = (TimerInfo) ejbTimer.getInfo();
-			if(timerInfo.matchesProcessInstance(processInstance)) {
+			if (timerInfo.matchesProcessInstance(processInstance)) {
 				ejbTimer.cancel();
+				++count;
 			}
 		}
+		log.debug("canceled " + count + " ejb timer(s) for " + processInstance);
 	}
 
 }

Modified: jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/msg/jms/JmsMessageServiceFactoryImpl.java
===================================================================
--- jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/msg/jms/JmsMessageServiceFactoryImpl.java	2008-10-15 19:50:24 UTC (rev 2545)
+++ jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/msg/jms/JmsMessageServiceFactoryImpl.java	2008-10-16 07:31:42 UTC (rev 2546)
@@ -30,8 +30,6 @@
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.jbpm.JbpmException;
 import org.jbpm.ejb.impl.JobListenerBean;
 import org.jbpm.svc.Service;
@@ -55,11 +53,11 @@
  * Refer to the jBPM manual for details.
  * 
  * @author Tom Baeyens
+ * @author Alejandro Guizar
  */
 public class JmsMessageServiceFactoryImpl implements ServiceFactory {
 
   private static final long serialVersionUID = 1L;
-  private static final Log log = LogFactory.getLog(JmsMessageServiceFactoryImpl.class);
   
   String connectionFactoryJndiName = "java:comp/env/jms/JbpmConnectionFactory";
   String destinationJndiName = "java:comp/env/jms/JobQueue";
@@ -68,37 +66,55 @@
   private ConnectionFactory connectionFactory;
   private Destination destination;
 
-  public JmsMessageServiceFactoryImpl() {
+  public ConnectionFactory getConnectionFactory() {
+    if (connectionFactory == null) {
+      try {
+        connectionFactory = (ConnectionFactory) lookup(connectionFactoryJndiName);
+      }
+      catch (NamingException e) {
+        throw new JbpmException("could not retrieve message connection factory", e);
+      }
+    }
+    return connectionFactory;
+  }
+
+  public Destination getDestination() {
+    if (destination == null) {
+      try {
+        destination = (Destination) lookup(destinationJndiName);
+      }
+      catch (NamingException e) {
+        throw new JbpmException("could not retrieve message destination", e);
+      }
+    }
+    return destination;
+  }
+
+  private static Object lookup(String name) throws NamingException {
+    Context initial = new InitialContext();
     try {
-      Context initial = new InitialContext();
-      connectionFactory = (ConnectionFactory) initial.lookup(connectionFactoryJndiName);
-      destination = (Destination) initial.lookup(destinationJndiName);
+      return initial.lookup(name);
+    }
+    finally {
       initial.close();
     }
-    catch (NamingException e) {
-      log.error("jms object lookup problem", e);
-      throw new JbpmException("jms object lookup problem", e);
-    }
   }
 
   public Service openService() {
-    Connection connection = null;
-    Session session = null;
-    
     try {
-      connection = connectionFactory.createConnection();
-      
+      Connection connection = getConnectionFactory().createConnection();
+
       // If you use an XA connection factory in JBoss, the parameters will be ignored.  It will always take part in the global JTA transaction.
-      // If you use a non XQ connection factory, the first parameter specifies whether you want to have all message productions and 
+      // If you use a non XA connection factory, the first parameter specifies whether you want to have all message productions and 
       // consumptions as part of one transaction (TRUE) or whether you want all productions and consumptions to be instantanious (FALSE)
       // Of course, we never want messages to be received before the current jbpm transaction commits so we just set it to true.
-      session = connection.createSession(true, Session.SESSION_TRANSACTED);
-      
-    } catch (JMSException e) {
-      throw new JbpmException("couldn't open jms message session", e);
-    }
-    
-    return new JmsMessageServiceImpl(connection, session, destination, isCommitEnabled);
+      Session session = connection.createSession(true, Session.SESSION_TRANSACTED);
+
+      return new JmsMessageServiceImpl(connection, session, getDestination(), isCommitEnabled);
+    } 
+    catch (JMSException e) {
+      throw new JbpmException("couldn't open message session", e);
+    }    
   }
 
   public void close() {

Modified: jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EjbSchedulerService.java
===================================================================
--- jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EjbSchedulerService.java	2008-10-15 19:50:24 UTC (rev 2545)
+++ jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EjbSchedulerService.java	2008-10-16 07:31:42 UTC (rev 2546)
@@ -14,6 +14,10 @@
 import org.jbpm.job.Timer;
 import org.jbpm.scheduler.SchedulerService;
 
+/**
+ * @author Tom Baeyens
+ * @deprecated replaced by {@link EntitySchedulerService}
+ */
 public class EjbSchedulerService implements SchedulerService {
   
   private static final long serialVersionUID = 1L;
@@ -38,22 +42,28 @@
   }
 
   public void createTimer(Timer timer) {
-    log.debug("creating timer "+timer);
+    log.debug("creating " + timer);
     jobSession.saveJob(timer);
     session.flush();
     timerService.createTimer(timer);
   }
 
+  public void deleteTimer(Timer timer) {
+    log.debug("deleting " + timer);
+    timerService.cancelTimer(timer);
+    jobSession.deleteJob(timer);
+  }
+
   public void deleteTimersByName(String timerName, Token token) {
-    log.debug("deleting timers by name "+timerName);
-    jobSession.cancelTimersByName(timerName, token);
+    log.debug("deleting timers by name '" + timerName  + "' for " + token);
     timerService.cancelTimersByName(timerName, token);
+    jobSession.deleteTimersByName(timerName, token);
   }
 
   public void deleteTimersByProcessInstance(ProcessInstance processInstance) {
-    log.debug("deleting timers for process instance "+processInstance);
+    log.debug("deleting timers for " + processInstance);
+    timerService.cancelTimersForProcessInstance(processInstance);
     jobSession.deleteJobsForProcessInstance(processInstance);
-    timerService.deleteTimersForProcessInstance(processInstance);
   }
 
   public void close() {

Modified: jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EjbSchedulerServiceFactory.java
===================================================================
--- jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EjbSchedulerServiceFactory.java	2008-10-15 19:50:24 UTC (rev 2545)
+++ jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EjbSchedulerServiceFactory.java	2008-10-16 07:31:42 UTC (rev 2546)
@@ -4,34 +4,45 @@
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.jbpm.JbpmException;
 import org.jbpm.svc.Service;
 import org.jbpm.svc.ServiceFactory;
 
+/**
+ * @author Tom Baeyens
+ * @deprecated replaced by {@link EntitySchedulerServiceFactory}
+ */
 public class EjbSchedulerServiceFactory implements ServiceFactory {
 
   private static final long serialVersionUID = 1L;
 
-  private static final Log log = LogFactory.getLog(EjbSchedulerServiceFactory.class);
-
   String timerServiceHomeJndiName = "java:comp/env/ejb/LocalTimerServiceBean";
 
   private LocalTimerServiceHome timerServiceHome;
 
-  public EjbSchedulerServiceFactory() {
+  public LocalTimerServiceHome getTimerServiceHome() {
+    if (timerServiceHome == null) {
+      try {
+        timerServiceHome = (LocalTimerServiceHome) lookup(timerServiceHomeJndiName);
+      } catch (NamingException e) {
+        throw new JbpmException("ejb timer service lookup problem", e);
+      }
+    }
+    return timerServiceHome;
+  }
+
+  private static Object lookup(String name) throws NamingException {
+    Context initial = new InitialContext();
     try {
-      Context initial = new InitialContext();
-      timerServiceHome = (LocalTimerServiceHome) initial.lookup(timerServiceHomeJndiName);
-    } catch (NamingException e) {
-      log.error("ejb timer service lookup problem", e);
-      throw new JbpmException("ejb timer service lookup problem", e);
+      return initial.lookup(name);
     }
+    finally {
+      initial.close();
+    }
   }
 
   public Service openService() {
-    return new EjbSchedulerService(timerServiceHome);
+    return new EjbSchedulerService(getTimerServiceHome());
   }
 
   public void close() {

Modified: jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EntitySchedulerService.java
===================================================================
--- jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EntitySchedulerService.java	2008-10-15 19:50:24 UTC (rev 2545)
+++ jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EntitySchedulerService.java	2008-10-16 07:31:42 UTC (rev 2546)
@@ -7,6 +7,7 @@
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.hibernate.Session;
 import org.jbpm.JbpmContext;
 import org.jbpm.JbpmException;
 import org.jbpm.db.JobSession;
@@ -22,6 +23,7 @@
 	private static final long serialVersionUID = 1L;
 
 	JobSession jobSession;
+	Session session;
 	LocalTimerEntityHome timerEntityHome;
 
 	public EntitySchedulerService(LocalTimerEntityHome timerEntityHome) {
@@ -31,53 +33,61 @@
 					"instantiation of the EjbSchedulerService requires a current JbpmContext");
 		}
 		this.jobSession = jbpmContext.getJobSession();
+		this.session = jbpmContext.getSession();
 		this.timerEntityHome = timerEntityHome;
 	}
 
 	public void createTimer(Timer timer) {
-		log.debug("creating timer " + timer);
+		log.debug("creating " + timer);
 		jobSession.saveJob(timer);
+		session.flush();
 		try {
 			LocalTimerEntity timerEntity = timerEntityHome.findByPrimaryKey(new Long(timer.getId()));
 			timerEntity.createTimer(timer);
 		}
 		catch (FinderException e) {
-			log.error("failed to retrieve entity for timer " + timer, e);
+			log.error("failed to retrieve entity for " + timer, e);
 		}
 	}
 
-	public void deleteTimersByName(String timerName, Token token) {
-		log.debug("deleting timers by name " + timerName);
-		Collection timerEntities = null;
+	public void deleteTimer(Timer timer) {
+    log.debug("deleting " + timer);
+    try {
+      LocalTimerEntity timerEntity = timerEntityHome.findByPrimaryKey(new Long(timer.getId()));
+      timerEntity.cancelTimer(timer);
+    }
+    catch (FinderException e) {
+      log.error("failed to retrieve entity for " + timer, e);
+    }
+    jobSession.deleteJob(timer);
+  }
+
+  public void deleteTimersByName(String timerName, Token token) {
 		try {
-			if(timerName == null || timerName.equals("")) {
-				timerEntities = timerEntityHome.findByTokenId(new Long(token.getId()));
-			}
-			else {
-				timerEntities = timerEntityHome.findByTokenIdAndName(new Long(token.getId()), timerName);
-			}
+		  Collection timerEntities = timerEntityHome.findByNameAndTokenId(timerName, new Long(token.getId()));
+			log.debug("found " + timerEntities.size() + " timer entities by name '" + timerName +  "' for " + token);
 			for (Iterator i = timerEntities.iterator(); i.hasNext();) {
 				LocalTimerEntity timerEntity = (LocalTimerEntity) i.next();
 				timerEntity.cancelTimersByName(timerName, token);
 			}
 		}
 		catch (FinderException e) {
-			log.error("failed to retrieve timer entities for name " + timerName + " and token " + token, e);
+			log.error("failed to retrieve timer entities by name '" + timerName + "' for " + token, e);
 		}
-		jobSession.cancelTimersByName(timerName, token);
+		jobSession.deleteTimersByName(timerName, token);
 	}
 
 	public void deleteTimersByProcessInstance(ProcessInstance processInstance) {
-		log.debug("deleting timers for process instance " + processInstance);
 		try {
 			Collection timerEntities = timerEntityHome.findByProcessInstanceId(new Long(processInstance.getId()));
+			log.debug("found " + timerEntities.size() + " timer entities for " + processInstance);
 			for (Iterator i = timerEntities.iterator(); i.hasNext();) {
 				LocalTimerEntity timerEntity = (LocalTimerEntity) i.next();
-				timerEntity.deleteTimersForProcessInstance(processInstance);
+				timerEntity.cancelTimersForProcessInstance(processInstance);
 			}
 		}
 		catch (FinderException e) {
-			log.error("failed to retrieve timer entities for process instance " + processInstance, e);
+			log.error("failed to retrieve timer entities for " + processInstance, e);
 		}
 		jobSession.deleteJobsForProcessInstance(processInstance);
 	}

Modified: jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EntitySchedulerServiceFactory.java
===================================================================
--- jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EntitySchedulerServiceFactory.java	2008-10-15 19:50:24 UTC (rev 2545)
+++ jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/EntitySchedulerServiceFactory.java	2008-10-16 07:31:42 UTC (rev 2546)
@@ -4,8 +4,6 @@
 import javax.naming.InitialContext;
 import javax.naming.NamingException;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
 import org.jbpm.JbpmException;
 import org.jbpm.ejb.LocalTimerEntityHome;
 import org.jbpm.job.Timer;
@@ -28,30 +26,40 @@
  * Refer to the jBPM manual for details.
  *
  * @author Tom Baeyens
+ * @author Alejandro Guizar
  * @author Fady Matar
  */
 public class EntitySchedulerServiceFactory implements ServiceFactory {
 
   private static final long serialVersionUID = 1L;
 
-  private static final Log log = LogFactory.getLog(EntitySchedulerServiceFactory.class);
+  String timerEntityHomeJndiName = "java:comp/env/ejb/TimerEntityBean";
 
-  String timerEntityHomeJndiName = "java:comp/env/ejb/LocalTimerEntityBean";
-
   private LocalTimerEntityHome timerEntityHome;
 
-  public EntitySchedulerServiceFactory() {
+  public LocalTimerEntityHome getTimerEntityHome() {
+    if (timerEntityHome == null) {
+      try {
+        timerEntityHome = (LocalTimerEntityHome) lookup(timerEntityHomeJndiName);
+      } catch (NamingException e) {
+        throw new JbpmException("ejb timer entity lookup problem", e);
+      }
+    }
+    return timerEntityHome;
+  }
+
+  private static Object lookup(String name) throws NamingException {
+    Context initial = new InitialContext();
     try {
-      Context initial = new InitialContext();
-      timerEntityHome = (LocalTimerEntityHome) initial.lookup(timerEntityHomeJndiName);
-    } catch (NamingException e) {
-      log.error("ejb timer entity lookup problem", e);
-      throw new JbpmException("ejb timer entity lookup problem", e);
+      return initial.lookup(name);
     }
+    finally {
+      initial.close();
+    }
   }
 
   public Service openService() {
-    return new EntitySchedulerService(timerEntityHome);
+    return new EntitySchedulerService(getTimerEntityHome());
   }
 
   public void close() {

Modified: jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/ExecuteTimerCommand.java
===================================================================
--- jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/ExecuteTimerCommand.java	2008-10-15 19:50:24 UTC (rev 2545)
+++ jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/ExecuteTimerCommand.java	2008-10-16 07:31:42 UTC (rev 2546)
@@ -1,5 +1,8 @@
 package org.jbpm.scheduler.ejbtimer;
 
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.jbpm.JbpmContext;
@@ -8,24 +11,37 @@
 
 public class ExecuteTimerCommand implements Command {
 
+  private final long timerId;
+
   private static final long serialVersionUID = 1L;
-  
-  long timerId;
 
   public ExecuteTimerCommand(long timerId) {
     this.timerId = timerId;
   }
 
   public Object execute(JbpmContext jbpmContext) throws Exception {
-    Timer timer = (Timer) jbpmContext.getJobSession().getJob(timerId);
-    if (timer!=null) {
-      log.debug("executing timer "+timerId);
-      timer.execute(jbpmContext);
-    } else {
-      log.info("execution of timer "+timerId+" was skipped cause the timer was deleted from the database");
+    Timer timer = jbpmContext.getJobSession().loadTimer(timerId);
+    timer.setLockOwner(getClass().getName()); // prevent others from removing timer
+    log.debug("executing " + timer);
+    try {
+      if (timer.execute(jbpmContext)) {
+        jbpmContext.getServices().getSchedulerService().deleteTimer(timer);
+      }
     }
+    catch (RuntimeException e) {
+      // nothing to do but clean up and exit
+      throw e;
+    }
+    catch (Exception e) {
+      // save data about recoverable error condition
+      log.error("exception while executing " + timer, e);
+      StringWriter memoryWriter = new StringWriter();
+      e.printStackTrace(new PrintWriter(memoryWriter));
+      timer.setException(memoryWriter.toString());
+      timer.setRetries(timer.getRetries() - 1);
+    }
     return timer;
   }
 
-  private static Log log = LogFactory.getLog(ExecuteTimerCommand.class);
+  private static final Log log = LogFactory.getLog(ExecuteTimerCommand.class);
 }

Modified: jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/LocalTimerService.java
===================================================================
--- jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/LocalTimerService.java	2008-10-15 19:50:24 UTC (rev 2545)
+++ jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/LocalTimerService.java	2008-10-16 07:31:42 UTC (rev 2546)
@@ -32,7 +32,8 @@
 public interface LocalTimerService extends javax.ejb.EJBLocalObject {
   
   void createTimer(Timer timer);
+  void cancelTimer(Timer timer);
   void cancelTimersByName(String timerName, Token token);
-  void deleteTimersForProcessInstance(ProcessInstance processInstance);
+  void cancelTimersForProcessInstance(ProcessInstance processInstance);
   
 }

Modified: jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/TimerServiceBean.java
===================================================================
--- jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/TimerServiceBean.java	2008-10-15 19:50:24 UTC (rev 2545)
+++ jbpm3/branches/jpdl-3.2.3.GA_JBPM-1704/enterprise/src/main/java/org/jbpm/scheduler/ejbtimer/TimerServiceBean.java	2008-10-16 07:31:42 UTC (rev 2546)
@@ -23,6 +23,7 @@
 
 import java.io.Serializable;
 import java.rmi.RemoteException;
+import java.util.Collection;
 import java.util.Iterator;
 
 import javax.ejb.EJBException;
@@ -58,54 +59,78 @@
   public void ejbCreate() {
   }
 
-  public void createTimer(Timer timer) {
+  public void createTimer(org.jbpm.job.Timer timer) {
     TimerService timerService = sessionContext.getTimerService();
-    log.debug("creating timer "+timer+" in the ejb timer service");
-    timerService.createTimer(timer.getDueDate(), new TimerInfo(timer));
+    javax.ejb.Timer ejbTimer = timerService.createTimer(timer.getDueDate(), new TimerInfo(timer));
+    log.debug("created " + ejbTimer);
   }
 
+  public void cancelTimer(org.jbpm.job.Timer timer) {
+    // TODO make the scanning of timers for cancellation optional by only deleting the timerjobs in the db.
+    // of course, the corresponding ejb timer notifications have to be ignored. 
+
+    long timerId = timer.getId();
+    Collection timers = sessionContext.getTimerService().getTimers();
+    log.debug("examining " + timers.size() + " ejb timer(s) by id " + timerId);
+
+    int count = 0;
+    for (Iterator i = timers.iterator(); i.hasNext();) {
+      javax.ejb.Timer ejbTimer = (javax.ejb.Timer) i.next();
+      if (ejbTimer.getInfo() instanceof TimerInfo) {
+        TimerInfo timerInfo = (TimerInfo) ejbTimer.getInfo();
+        if (timerId == timerInfo.getTimerId()) {
+          ejbTimer.cancel();
+          ++count;
+        }
+      }
+    }
+    log.debug("canceled " + count + " ejb timer(s) by id " + timerId);
+  }
+
   public void cancelTimersByName(String timerName, Token token) {
-    
     // TODO make the scanning of timers for cancellation optional by only deleting the timerjobs in the db.
     // of course, the corresponding ejb timer notifications have to be ignored. 
 
-    log.debug("cancelling timers with name "+timerName+" from the ejb timer service");
+    Collection timers = sessionContext.getTimerService().getTimers();
+    log.debug("examining " + timers.size() + " ejb timer(s) by name '" + timerName + "' for " + token);
 
-    TimerService timerService = sessionContext.getTimerService();
-    Iterator iter = timerService.getTimers().iterator();
-    while (iter.hasNext()) {
-      javax.ejb.Timer ejbTimer = (javax.ejb.Timer) iter.next();
+    int count = 0;
+    for (Iterator i = timers.iterator(); i.hasNext();) {
+      javax.ejb.Timer ejbTimer = (javax.ejb.Timer) i.next();
       if (ejbTimer.getInfo() instanceof TimerInfo) {
         TimerInfo timerInfo = (TimerInfo) ejbTimer.getInfo();
         if (timerInfo.matchesName(timerName, token)) {
           ejbTimer.cancel();
+          ++count;
         }
       }
     }
+    log.debug("canceled " + count + " ejb timer(s) by name '" + timerName + "' for " + token);
   }
 
-  public void deleteTimersForProcessInstance(ProcessInstance processInstance) {
-    
+  public void cancelTimersForProcessInstance(ProcessInstance processInstance) {
     // TODO make the scanning of timers for cancellation optional by only deleting the timerjobs in the db.
     // of course, the corresponding ejb timer notifications have to be ignored. 
+    
+    Collection timers = sessionContext.getTimerService().getTimers();
+    log.debug("examining " + timers.size() + " timer(s) for " + processInstance);
 
-    log.debug("deleting timers for process instance "+processInstance+" from the ejb timer service");
-
-    TimerService timerService = sessionContext.getTimerService();
-    Iterator iter = timerService.getTimers().iterator();
-    while (iter.hasNext()) {
-      javax.ejb.Timer ejbTimer = (javax.ejb.Timer) iter.next();
+    int count = 0;
+    for (Iterator i = timers.iterator(); i.hasNext();) {
+      javax.ejb.Timer ejbTimer = (javax.ejb.Timer) i.next();
       if (ejbTimer.getInfo() instanceof TimerInfo) {
         TimerInfo timerInfo = (TimerInfo) ejbTimer.getInfo();
         if (timerInfo.matchesProcessInstance(processInstance)) {
           ejbTimer.cancel();
+          ++count;
         }
       }
     }
+    log.debug("canceled " + count + " ejb timer(s) for " + processInstance);
   }
 
   public void ejbTimeout(javax.ejb.Timer ejbTimer) {
-    log.debug("ejb timer "+ejbTimer+" fires");
+    log.debug(ejbTimer + " fired");
     String localCommandServiceJndiName = "java:comp/env/ejb/LocalCommandServiceBean";
     try {
       Context initial = new InitialContext();
@@ -146,6 +171,6 @@
   }
   public void ejbRemove() throws EJBException, RemoteException {
   }
-  
+
   private static Log log = LogFactory.getLog(TimerServiceBean.class);
 }




More information about the jbpm-commits mailing list