[jboss-user] [JBoss jBPM] - [HOW-TO] Programmatically create and cancel Timers
sonicfab
do-not-reply at jboss.com
Thu Oct 11 09:40:15 EDT 2007
I spent some time on finding out how to programmatically create and cancel timers, so I thought it might be a good idea to share this with you.
(Note : this works with jBPM-jPDL 3.2.1 and 3.2.2).
1- Define a scheduler service in jbpm.cfg.xml :
<service name="scheduler"
| factory="org.jbpm.scheduler.db.DbSchedulerServiceFactory" />
2- Start a job executor thread (we do it via Spring) :
<!-- Jbpm job executor -->
| <bean name="jbpm.job.executor" class="org.jbpm.job.executor.JobExecutor">
| <field name="jbpmConfiguration"><ref bean="jbpmConfiguration" /></field>
| <field name="name"><string value="JbpmJobExector" /></field>
| <field name="nbrOfThreads"><int value="1" /></field>
| <field name="idleInterval"><int value="5000" /></field>
| <field name="maxIdleInterval"><int value="3600000" /></field> <!-- 1 hour -->
| <field name="historyMaxSize"><int value="20" /></field>
| <field name="maxLockTime"><int value="600000" /></field> <!-- 10 minutes -->
| <field name="lockMonitorInterval"><int value="60000" /></field> <!-- 1 minute -->
| <field name="lockBufferTime"><int value="5000" /></field> <!-- 5 seconds -->
| </bean>
The job executor is instantiated by a Spring listener :
<!-- Bean responsible for starting and stopping the JBPM JobExecutor -->
| <bean id="jbpmLifeCycleListener"
| class="com.acme.jbpm.helpers.JbpmLifeCycleListener"
| init-method="start" destroy-method="stop">
| <property name="configuration" value="classpath:jbpm.cfg.xml" />
| <property name="sessionFactory" ref="jbpmSessionFactory" />
| </bean>
3- Create a timer :
public static void createNotificationTimer(ExecutionContext context,
| Date dueDate, String timerName, String nodeName) {
|
| try {
| // getting data from the context
| long processId = context.getProcessInstance().getId();
| Token token = context.getToken();
| String orderOrigin = (String) context
| .getVariable(ContextVariable.orderOrigin);
| String externalOrderId = (String) context
| .getVariable(ContextVariable.externalOrderId);
| Node myNode = context.getProcessDefinition().getNode(nodeName);
|
| // creating the action
| Action timedAction = new Action();
| Delegation timedDelegation = new Delegation(
| "com.acme.businesslayer.jbpm.timers.NotificationAction");
| timedDelegation
| .setConfiguration(String
| .format("<tokenId>%d</tokenId><externalOrderId>%s</externalOrderId><orderOrigin>%s</orderOrigin>",
| token.getId(), externalOrderId, orderOrigin));
| timedAction.setActionDelegation(timedDelegation);
|
| // creating the timer
| Timer timer = new Timer(token);
| String completeTimerName = String.format("%s-%d", timerName,
| processId);
| timer.setName(completeTimerName);
| timer.setAction(timedAction);
| timer.setDueDate(dueDate);
|
| // setting the execution context
| context.setTimer(timer);
|
| // scheduling the timer
| myNode.fireEvent("timer-create", context);
| JbpmConfiguration conf = (JbpmConfiguration) SpringHelper
| .getBean("jbpmConfiguration");
| JbpmContext myContext = conf.createJbpmContext();
| myContext.setSessionFactory((SessionFactory) SpringHelper
| .getBean("jbpmSessionFactory"));
| SchedulerService schedulerService = (SchedulerService) myContext.getServices().getService(Services.SERVICENAME_SCHEDULER);
| SchedulerService.createTimer(timer);
| myContext.close();
|
| } catch (Exception e) {
| e.printStackTrace();
| }
| }
4- Cancel a timer :
public static void cancelTimer(String timerName, Token token) {
| JbpmConfiguration conf = (JbpmConfiguration) SpringHelper
| .getBean("jbpmConfiguration");
| JbpmContext testContext = conf.createJbpmContext();
| myContext.setSessionFactory((SessionFactory) SpringHelper
| .getBean("jbpmSessionFactory"));
|
| SchedulerService schedulerService = (SchedulerService) myContext.getServices().getService(Services.SERVICENAME_SCHEDULER);
| String completeTimerName = String.format("%s-%d", timerName, token.getProcessInstance().getId());
| schedulerService.deleteTimersByName(completeTimerName, token);
| myContext.close();
| }
|
Hope this will help save time for some of you.
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4094084#4094084
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4094084
More information about the jboss-user
mailing list