因为我们的业务需要,最近一直在搞动态动过java程序实现为用户任务绑定监听程序。碰了很多壁,查看了API文档,最后终于在找到解决办法,所以贴出来,希望能够留个底,也能帮助有需要的人。

----------动态生成流程文件的工具类--------

package com.travesky.bluesky.activiti.utils;

import java.io.File;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.activiti.bpmn.BpmnAutoLayout;
import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.bpmn.model.BpmnModel;
import org.activiti.bpmn.model.EndEvent;
import org.activiti.bpmn.model.ExclusiveGateway;
import org.activiti.bpmn.model.ExtensionAttribute;
import org.activiti.bpmn.model.ExtensionElement;
import org.activiti.bpmn.model.FlowElement;
import org.activiti.bpmn.model.ImplementationType;
import org.activiti.bpmn.model.SequenceFlow;
import org.activiti.bpmn.model.ServiceTask;
import org.activiti.bpmn.model.StartEvent;
import org.activiti.bpmn.model.UserTask;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.delegate.TaskListener;
import org.activiti.engine.impl.bpmn.parser.BpmnParse;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.ContextLoader;
/**
* 流程文件生成工具类,已在spring文件注入
* @author AnCan
* @date 2017/4/10
*/
public class AutodeployProcessBpmnAndImageUtils {
@Autowired
private RepositoryService repositoryService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
private final String START_EVENT = "start";
private final String END_EVENT = "end";
/**
*
* @param PROCESSID 流程id
* @param PROCESSNAME 流程名字
* @throws Exception
*/
public void dynamicDeployBpmnAndImage(final String PROCESSID,
final String PROCESSNAME) throws Exception {
System.out.println(".........start...");
// String basePath = ContextLoader.getCurrentWebApplicationContext().getServletContext().getRealPath("/")+"bpmn\\";
// System.out.println(".........start...====="+basePath);
// 1. Build up the model from scratch
BpmnModel model = new BpmnModel();
org.activiti.bpmn.model.Process process=new org.activiti.bpmn.model.Process();
model.addProcess(process);
process.setId(PROCESSID);
process.setName(PROCESSNAME);
//设置开始节点
process.addFlowElement(createStartEvent());
//设置任务节点1
process.addFlowElement(createUserTask("task1", "组长审核", "candidateGroup1"));
//设置排他节点1
process.addFlowElement(createExclusiveGateway("createExclusiveGateway1"));
//设置任务节点2
process.addFlowElement(createUserTask("task2", "项目经理审核", "candidateGroup2"));
//设置排他节点2
process.addFlowElement(createExclusiveGateway("createExclusiveGateway2"));
//设置任务节点3 普通任务
// process.addFlowElement(createUserTask("task3", "产品部门经理审核", "candidateGroup3"));
//设置任务节点3 监听任务
List<String> lisenerList = new ArrayList<String>();
lisenerList.add("com.travesky.bluesky.activiti.utils.MangerTaskHandlerCandidateUsers");
process.addFlowElement(createUserTask("task3", "产品部门经理审核",lisenerList));
//设置排他节点3
process.addFlowElement(createExclusiveGateway("createExclusiveGateway3"));
process.addFlowElement(createUserTask("task4", "总经理审核", "candidateGroup4"));
//设置结束节点
process.addFlowElement(createEndEvent());

process.addFlowElement(createSequenceFlow(START_EVENT, "task1", "", ""));
process.addFlowElement(createSequenceFlow("task1", "task2", "", ""));
//
process.addFlowElement(createSequenceFlow("task2", "createExclusiveGateway1"));
process.addFlowElement(createSequenceFlow("createExclusiveGateway1", "task1", "不通过", "${pass=='2'}"));
process.addFlowElement(createSequenceFlow("createExclusiveGateway1", "task3", "通过", "${pass=='1'}"));
process.addFlowElement(createSequenceFlow("task3", "createExclusiveGateway2"));
process.addFlowElement(createSequenceFlow("createExclusiveGateway2", "task2", "不通过", "${pass=='2'}"));
process.addFlowElement(createSequenceFlow("createExclusiveGateway2", "task4", "通过", "${pass=='1'}"));
process.addFlowElement(createSequenceFlow("task4", "createExclusiveGateway3"));
process.addFlowElement(createSequenceFlow("createExclusiveGateway3", "task3", "不通过", "${pass=='2'}"));
process.addFlowElement(createSequenceFlow("createExclusiveGateway3", END_EVENT, "通过", "${pass=='1'}"));
// 2. Generate graphical information
new BpmnAutoLayout(model).execute();

// 3. Deploy the process to the engine
Deployment deployment = repositoryService.createDeployment().addBpmnModel(PROCESSID+".bpmn", model).name(PROCESSID+"_deployment").deploy();

// 4. Start a process instance
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(PROCESSID);

// 5. Check if task is available
List<Task> tasks = taskService.createTaskQuery().processInstanceId(processInstance.getId()).list();
// Assert.assertEquals(1, tasks.size());

// 6. Save process diagram to a file
InputStream processDiagram = repositoryService.getProcessDiagram(processInstance.getProcessDefinitionId());
FileUtils.copyInputStreamToFile(processDiagram, new File("target/"+PROCESSID+".png"));

// 7. Save resulting BPMN xml to a file
InputStream processBpmn = repositoryService.getResourceAsStream(deployment.getId(), PROCESSID+".bpmn");
FileUtils.copyInputStreamToFile(processBpmn,new File("target/"+PROCESSID+".bpmn"));

System.out.println(".........end...");
}
/**
* 创建节点任务 个人任务
* @param id 任务id标识
* @param name 任务名称
* @param assignee 指定个人任务
* @return
*/
public UserTask createUserTask(String id, String name, String assignee) {
UserTask userTask = new UserTask();
userTask.setName(name);
userTask.setId(id);
userTask.setAssignee(assignee);
return userTask;
}
/**
* 创建节点任务 多人任务
* @param id 任务id标识
* @param name 任务名称
* @param candidateUsers 任务人的集合
* @return
*/
public UserTask createUserTask(String id, String name, String[] candidateUsers) {
UserTask userTask = new UserTask();
userTask.setName(name);
userTask.setId(id);
if(null!=candidateUsers&&candidateUsers.length>0){
userTask.setCandidateUsers(Arrays.asList(candidateUsers));
}
return userTask;
}
/**
* 创建节点任务 使用监听设置处理人
* @param id 任务id标识
* @param name 任务名称
* @param taskListenerList 监听的集合,TaskListener实现类的的具体路径例:com.sky.bluesky.activiti.utils.MangerTaskHandlerCandidateUsers
* @return
*/
public UserTask createUserTask(String id, String name, List<String> taskListenerList) {
UserTask userTask = new UserTask();
userTask.setName(name);
userTask.setId(id);

List<ActivitiListener> list = new ArrayList<ActivitiListener>();
for (String taskListener : taskListenerList) {
ActivitiListener listener = new ActivitiListener();
listener.setEvent("create");
//Spring配置以变量形式调用无法写入,只能通过继承TaskListener方法,
listener.setImplementationType("class");
listener.setImplementation(taskListener);

list.add(listener);

}
userTask.setTaskListeners(list);
return userTask;
}

/**
* 设置连线
* @param from 从哪里出发
* @param to 连接到哪里
* @return
*/
public SequenceFlow createSequenceFlow(String from, String to) {
SequenceFlow flow = new SequenceFlow();
flow.setSourceRef(from);
flow.setTargetRef(to);
return flow;
}

/**
* 设置起始节点
* @return
*/
public StartEvent createStartEvent() {
StartEvent startEvent = new StartEvent();
startEvent.setId(START_EVENT);
return startEvent;
}

/**
* 排他网关节点
* @param id
* @return
*/
public static ExclusiveGateway createExclusiveGateway(String id) {
ExclusiveGateway exclusiveGateway = new ExclusiveGateway();
exclusiveGateway.setId(id);
return exclusiveGateway;
}
/**
* 设置结束节点
* @return
*/
public EndEvent createEndEvent() {
EndEvent endEvent = new EndEvent();
endEvent.setId(END_EVENT);
return endEvent;
}
/**
* 设置连线
* @param from 从哪里出发
* @param to 连接到哪里
* @param name 连线名称
* @param conditionExpression 判断条件${arg>2}
* @return
*/
public static SequenceFlow createSequenceFlow(String from, String to,String name,String conditionExpression) {
SequenceFlow flow = new SequenceFlow();
flow.setSourceRef(from);
flow.setTargetRef(to);
flow.setName(name);
if(null!=conditionExpression&&!"".equals(conditionExpression)){
flow.setConditionExpression(conditionExpression);
}
return flow;
}
public FlowElement createServiceTask(String name){
ServiceTask stask = new ServiceTask();
stask.setId("sid");
stask.setName(name);
stask.setImplementation("activitiTest.PrintVariables");
String implementationType = ImplementationType.IMPLEMENTATION_TYPE_DELEGATEEXPRESSION;
stask.setImplementationType(implementationType );
return stask;
}
}

------------监听类--------

package com.travesky.bluesky.activiti.utils;

import java.util.Arrays;

import org.activiti.bpmn.model.ActivitiListener;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.TaskListener;

public class MangerTaskHandlerCandidateUsers extends ActivitiListener implements TaskListener {
/**
*
*/
private static final long serialVersionUID = 1L;

@Override
public void notify(DelegateTask delegateTask) {
System.out.println("进入MangerTaskHandlerCandidateUsers=========");
/**从新查询当前用户,再获取当前用户对应的领导*/
//当前用户
String[] empLoyees = {"冯小刚经纪人","范冰冰经纪人","冯小刚"};
delegateTask.addCandidateUsers(Arrays.asList(empLoyees));
System.out.println("节点任务人========冯小刚经纪人,范冰冰经纪人,冯小刚");

}

}

---这里没有再做封装和细化,因为还在完善。刚才想把 taskListener强制转换为ActivitiListener ,但是那是不对的。必须是按照activiti的规范来。

转载于:https://www.cnblogs.com/ANCAN-RAY/p/6687640.html

activiti 5.15.1 动态手动通过java编码方式,实现创建用户任务,动态指定个人,用户组,角色,指定监听的实现...相关推荐

  1. Java学习——复习 第八天 Swing程序设计、AWT绘图、事件监听

    16.Swing程序设计 1.Swing概述--Swing主要用来开发GUI程序,GUI即图形图像界面,他是应用程序提供给用户操作的图形界面,包括窗口.菜单.按钮等元素. 1.1Swing的特点--允 ...

  2. Java实现拼图小游戏(6)—— 移动图片(键盘监听实操练习)

    移动图片 一.前言 二.步骤 1.让我们的类继承KeyListener接口 2.改写initData方法 3.实现向上移动 4.实现向下移动 5.实现向左移动 6.实现向右移动 7.改写initIma ...

  3. eclipse如何查看当前项目的编码方式+java编码方式总结

    我们写代码有时候会出现这种情况:在自己电脑上运行的很正常,字符显示很完美,把自己的代码给别人或者换台机器运行,就会出现乱码的现象,这是为什么呢?都是编码方式在作祟,不同的机器或java项目可能使用的默 ...

  4. JAVA之简单界面设计(布局,更改背景图片,按钮监听 + 数据库登陆注册相关..)

    先看一下简单的界面: import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import ja ...

  5. Java代码实现本地创建文件,读取文件,删除指定目录下的文件

    目录 一.需求: 二.实现: 1.完成创建文件,写入文件 2.读取文件 3.删除文件 测试: 注意: java的split方法分割字符串(分隔符如* | . ^ )及注意点 一.需求: 1.创建文件夹 ...

  6. Java实现监听文件变化的三种方法,推荐第三种

    背景 在研究规则引擎时,如果规则以文件的形式存储,那么就需要监听指定的目录或文件来感知规则是否变化,进而进行加载.当然,在其他业务场景下,比如想实现配置文件的动态加载.日志文件的监听.FTP文件变动监 ...

  7. zookeeper专题:使用zookeeper客户端实现动态监听节点并获取数据

    文章目录 1. zookeeper原生客户端 2. Curator客户端 1. zookeeper原生客户端 zookeeper原生客户端就是zookeeper官方自带的客户端,作为代码与zk服务器交 ...

  8. Java的编码方式、单个char类型存储大部分中文字符、getBytes()、new String()的转换流程

    目录 一 编码种类 1.1 ASCII码 1.2 ISO8859-1编码 1.3 GBK编码 1.4 Unicode字符集 1.4.1 UTF-8编码 1.4.2 UTF-16编码 1.4.3 UTF ...

  9. Java中事件监听机制

    Java中事件监听机制 一.事件监听机制的定义 要想了解Java中的事件监听机制,首先就要去了解一下在Java中事件是怎样去定义的呢!在使用Java编写好一个界面后,我们就会对界面进行一些操作,比如, ...

最新文章

  1. 【CentOS】利用Kubeadm部署Kubernetes (K8s)
  2. portlet 与 servlet 的关系
  3. SEO优化技巧之Alt标签的使用方法
  4. 面试经典书籍--程序员面试宝典
  5. html仿命令行界面,实战:vue仿dos命令界面
  6. java+调用jacoco_java操作jacoco
  7. 太原理工微型计算机控制试卷,太原理工大学微机原理考试(13届葬仪落整理).docx...
  8. Java虚拟机(六)——虚拟机栈
  9. tcpdump 抓包让wireshark来分析
  10. STM32定时器输出pwm波
  11. B-JUI 实践 之 带搜索与编辑的Datagrid
  12. 物联网下的智慧停车 让智能化找到车位
  13. 计算机毕业设计java+ssm水果商城管理系统(源码+系统+mysql数据库+Lw文档)
  14. Android 颜色的半透明效果
  15. 数字转换为壹仟贰佰叁拾肆的Java方法
  16. python 三维数据绘制等值高线剖面图_Matplotlib中的三维绘图
  17. eBay卖家用WorldFirst将PayPal美元提现国内银行教程!
  18. HTC VIVE 禁用头盔定位与角度旋转
  19. js控制URL地址的改变,以微信服务号的授权获取用户的昵称和头像为例
  20. Codeforces 939C - Convenient For Everybody

热门文章

  1. 集显怎么安装android模拟器,集成显卡是不是不能运行Android L模拟器?
  2. c语言趣味教学题目及答案,C语言趣味程序设计-题目百例.doc
  3. 计算机专业英语06章在线测试,《计算机专业英语》第06章在线测试.doc
  4. lin通讯从节点同步间隔场_低成本总线技术——LIN总线协议规范介绍
  5. logstash导入数据到Elasticsearch踩过的坑详解
  6. Java开发面试题及答案,5年crud“经验
  7. linux rcs文件中的ip,linux学习笔记之diff和patch命令
  8. svn 面板缺少可选项_TortoiseSVN的设置
  9. java bean join_spring data jpa 关联join查询出自定义实体java bean的坑
  10. 网站推广专员浅析网站推广期间如何防止关键词出现下降情况?