[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