[size=medium]jBPM中自带的文档中关于定时器Timer的使用介绍的比较少, 刚好最近要用到, 不过也很简单, 其中有几个地方需要注意一下.
使用版本为jBPM 3.2.2
1.使用Timer首先要在web.xml中配置JobExecutorServlet:
Xml代码
1.<servlet >
2. <servlet-name>JobExecutorServlet</servlet-name>
3. <servlet-class>org.jbpm.job.executor.JobExecutorServlet</servlet-class>
4. <load-on-startup>1</load-on-startup>
5. </servlet>
6. <servlet-mapping >
7. <servlet-name>JobExecutorServlet</servlet-name>
8. <url-pattern>/jobexecutor</url-pattern>
9. </servlet-mapping>
<servlet >
<servlet-name>JobExecutorServlet</servlet-name>
<servlet-class>org.jbpm.job.executor.JobExecutorServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping >
<servlet-name>JobExecutorServlet</servlet-name>
<url-pattern>/jobexecutor</url-pattern>
</servlet-mapping>
这个相当于在启动webapp之后启动一个线程, 不停的检查Job表中是否存在到期的job
2.接着就是在processdefition.xml中定义Timer, 这里有一个小小的问题, 就是使用插件配置的Timer是放在<task-node>节点下的, 这个实际上是错误的, 而应该配置在具体的任务实例节点下,即<task>节点下,比如:
Xml代码
1.<task-node name="资金收到确认">
2. <task name="资金收到确认">
3. <timer duedate="7 days" name="checkTimer" transition="检查">
4. <action class="com.baiyao.workflow.payment.handler.TimerCheckActionHandler"></action>
5. </timer>
6. <assignment class="com.baiyao.workflow.payment.handler.PaymentComfirmAssignmentHandler"></assignment>
7. </task>
8. <transition to="拨付"></transition>
9. <transition to="检查资金拨付情况" name="检查"></transition>
10. </task-node>
<task-node name="资金收到确认">
<task name="资金收到确认">
<timer duedate="7 days" name="checkTimer" transition="检查">
<action class="com.baiyao.workflow.payment.handler.TimerCheckActionHandler"></action>
</timer>
<assignment class="com.baiyao.workflow.payment.handler.PaymentComfirmAssignmentHandler"></assignment>
</task>
<transition to="拨付"></transition>
<transition to="检查资金拨付情况" name="检查"></transition>
</task-node>
3.最后就是写相应的ActionHandler, 当Timer到达指定的时间时就会执行该ActionHandler, 比如这样写:
Java代码
1.
2./**
3. * 超过七个工作日, 退出当前确认节点, 进入内勤检查任务节点
4. *
5. * @author Macro Chen
6. * @since Jul 18, 2008
7. */
8.public class TimerCheckActionHandler implements ActionHandler {
9.
10. private static final long serialVersionUID = 1L;
11.
12. public void execute(ExecutionContext ctx) throws Exception {
13. long taskId = ctx.getTaskInstance().getId();
14. TaskInstance ti = JbpmUtils.getTaskInstance(taskId);
15. JbpmUtils.end(ti, "检查");
16. }
17.
18.}
/**
* 超过七个工作日, 退出当前确认节点, 进入内勤检查任务节点
*
* @author Macro Chen
* @since Jul 18, 2008
*/
public class TimerCheckActionHandler implements ActionHandler {
private static final long serialVersionUID = 1L;
public void execute(ExecutionContext ctx) throws Exception {
long taskId = ctx.getTaskInstance().getId();
TaskInstance ti = JbpmUtils.getTaskInstance(taskId);
JbpmUtils.end(ti, "检查");
}
}
Timer还有几个需要注意的, 一个就是默认情况下流程在执行node-enter事件的时候会自动创建timer实例, 然后添加到job表中, 等待去执行指定ActionHandler, 如果当前任务实例被处理, 结束当前任务, 执行了node-leave事件之后, 默认情况下Timer会被自动取消.[/size]