本文共 2063 字,大约阅读时间需要 6 分钟。
最近工作上一直在用activiti作工作流,发现工作流程使用起来真的挺费劲的!
这不,业务需求有来有,用户希望在回复沟通时,能触发回复沟通事件,而用户通过该事件触发他的业务事件。 回复沟通是这边流程的自定义的操作, activti没这种操作,怎么办?看来只能动手自己扩展了 1.Web端 要扩展,首先要在页面上要有地方配置,因为这个跟任务绑定在一起的,放在任务监听器中 找到页面task-listeners-popup.html(这边用的是activiti-explorer),发现很简单,只需要在下拉里加入配置即可如上表格所示,在select中扩展了自己的操作
显示结果如下OK,前端改造完成,用户可以选择了.
2.后端代码
跟一下代码,发现对象TaskEntity有发布事件的方法fireEvent,那急急的加入以下代码TaskEntity task = (TaskEntity) taskService.createTaskQuery().taskId(taskId).singleResult(); //发布操作事件 task.fireEvent("drafter_submit");
成功了吗?测试一下,Oh,Shit,报错了!
java.lang.NullPointerException: null at org.activiti.engine.impl.persistence.entity.TaskEntity.getTaskDefinition(TaskEntity.java:797) at org.activiti.engine.impl.persistence.entity.TaskEntity.fireEvent(TaskEntity.java:728)
经分析,是里面的Context没有,怎么办呢??考虑了一下,命令模式有这个东东呀,那我直接用命令模式来实现试试.
import java.util.Map;import org.activiti.engine.impl.cmd.NeedsActiveTaskCmd;import org.activiti.engine.impl.context.Context;import org.activiti.engine.impl.interceptor.CommandContext;import org.activiti.engine.impl.persistence.entity.TaskEntity; public class OperationCommand extends NeedsActiveTaskCmd{ public OperationCommand(String taskId) { super(taskId); // TODO Auto-generated constructor stub } private Map formData; private String operationCode; @Override protected Boolean execute(CommandContext commandContext, TaskEntity task) { // TODO Auto-generated method stub Context.getCommandContext().getProcessEngineConfiguration().getTaskService().complete(task.getId(), formData); // 发布操作事件 task.fireEvent(operationCode); return true; } public OperationCommand(String taskId, Map formData, String operationCode) { super(taskId); this.formData = formData; this.operationCode = operationCode; }}
原来的执行的代码改为
((RuntimeServiceImpl)runtimeService).getCommandExecutor().execute(new OperationCommand(taskId,formData,“specCode”));
经测试,意外惊喜,成功了!
至此,流程任务自定义事件扩展成功!
转载地址:http://cxghx.baihongyu.com/