服务任务分类
- Java Service Task :主要掌握这个就可以了
- Shell Task
- Web Service Task
Java Service Task --Java服务任务,在流程文件bpmn中配置标签
- activiti:class:指定的自定义JAVA必须实现JavaDelegate、ActivityBehavior这两个接口的其中一个
- activiti:delegateExpression 在bmpm文件中activiti:delegateExpression="${juel自定义实现了JavaDelegate、ActivityBehavior的类,而且必须序列化}"
- activiti:expression --这个可以直接调用javabeen(我们随便自定义的java类,只要序列化了就成)应用的最多 ,activiti:expression="${类.方法等}"
一、测试activiti:delegateExpression 在bpmn文件中activiti:delegateExpression="${juel自定义实现了JavaDelegate、ActivityBehavior的类,而且必须序列化}"
1.1 新建 delegate.bpmn
自定义实现了JavaDelegate、ActivityBehavior,而且必须序列化的类
MyDelegate.java
package com.xiangshuai.act.c20;
import java.io.Serializable;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.JavaDelegate;
public class MyDelegate implements Serializable, JavaDelegate {
@Override
public void execute(DelegateExecution arg0) {
System.out.println("delegate.bpmn 中测试 <serviceTask id='servicetask2' name='Service Task' activiti:delegateExpression='${myDelegate}'></serviceTask>");
}
}
1.2 修改delegate.bpmn ,, 在bmpm文件中activiti:delegateExpression="${juel自定义实现了JavaDelegate、ActivityBehavior的类,而且必须序列化}"
1.3 测试方法
public static void testActivitiDelegateExpression(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务 和TaskService 任务管理TaskService
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
// 启动服务
Deployment dep = rs.createDeployment().addClasspathResource("delegate.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
/*
百度RuntimeService API
startProcessInstanceByKey(String processDefinitionKey, String businessKey)
Starts a new process instance in the latest version of the process definition with the given key.
*/
Map<String, Object> vars=new HashMap<String, Object>();
vars.put("myDelegate",new MyDelegate()); //bpmn 中用的key 就是 myDelegate
//bpmn 中用到 ${juel自定义类,必须让activiti能识别},所以在启动流程时需用ByKey,将带自定义类的map作为参数启动流程
ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);
/*
输出结果:当流程执行到Service Task 会执行对应的${myDelegate}对应的自定义类 MyDelegate的execute 输出
"delegate.bpmn 中测试 <serviceTask id='servicetask2' name='Service Task' activiti:delegateExpression='${myDelegate}'></serviceTask>"
*/
}
二、测试activiti:expression --这个可以直接调用javabeen(我们随便自定义的java类,只要序列化了就成)应用的最多 ,activiti:expression="${类.方法(可带参数)}" 或者runService设置变量activiti:expression="${execution.setVariable('myName', myBean.name)}"--这个就是先从myBean调用getName方法获得值再runService myName这个变量runService.setVariable("myName", myBean.name))
2.1 新建bean.bpmn
新建MyBean.java,并结合二下面的图的bpmn将对应的方法整出来
MyBean.java
package com.xiangshuai.act.c20;
import java.io.Serializable;
import org.activiti.engine.runtime.Execution;
/**
* @author lqx ,参照 bean.bpmn ,提供里面需要的方法print(Execution execution)
* 需要的属性 name,在bean.bpmn直接bean.点属性,和spring等一样都是调起首字母大写的get方法 getName;
* 这个name runService.setVariable(“myName”, MyBean对象.getName)
*
*/
public class MyBean implements Serializable{
public String name="bean.bpmn要用来set";
/**
* 造方法,参照bean.bpmn
* <serviceTask id="servicetask2" name="Service Task"
activiti:expression="${execution.setVariable('myName', myBean.name)}"></serviceTask>
* @return execution.setVariable('myName', myBean.name)- 即runService.setVariable(“myName”, MyBean对象.getName())
*/
public String getName(){
return name;
}
/**
* 造方法,参照
* bean.bpmn 的myBean.print(execution) 带参数execution
* <serviceTask id="servicetask1" name="Service Task"
activiti:expression="${myBean.print(execution)}"></serviceTask>
*/
public void print(Execution execution){
System.out.println("执行bean.bpmn的activiti:expression=‘${myBean.print(execution)’ execution参数的id时"+execution.getId());
}
}
2.2 参照二下面的图修改bean.bpmn -- activiti:expression="${execution.setVariable('myName', myBean.name)}"--这个就是先从myBean调用getName方法获得值再runService myName这个变量runService.setVariable("myName", myBean.name))
2.3 测试方法
/**
*测试activiti:expression --这个可以直接调用javabeen(我们随便自定义的java类,只要序列化了就成)应用的最多 ,
*activiti:expression="${类.方法(可带参数)}" 或者runService设置变量activiti:expression="${execution.setVariable('myName', myBean.name)}"--
*-这个就是先从myBean调用getName方法获得值再runService myName这个变量runService.setVariable("myName", myBean.name))
*/
public static void testActivitiExpression(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务 和TaskService 任务管理TaskService
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
// 启动服务
Deployment dep = rs.createDeployment().addClasspathResource("bean.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
/*
百度RuntimeService API
startProcessInstanceByKey(String processDefinitionKey, String businessKey)s
Starts a new process instance in the latest version of the process definition with the given key.
*/
Map<String, Object> vars=new HashMap<String, Object>();
vars.put("myBean",new MyBean()); //bpmn 中用的key 就是 myBean
//bpmn 中用到 ${juel自定义类,必须让activiti能识别},所以在启动流程时需用ByKey,将带自定义类的map作为参数启动流程
ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);
/*
流程开始后,会自动执行 bean.bpmn的servicetask1和servicetask2 连个servicetask节点
<serviceTask id="servicetask1" name="Service Task"
activiti:expression="${myBean.print(execution)}"></serviceTask>
<serviceTask id="servicetask2" name="Service Task"
activiti:expression="${execution.setVariable('myName', myBean.name)}"></serviceTask>
servicetask1 会执行 myBean.print(execution) 方法 输出-执行bean.bpmn的activiti:expression=‘${myBean.print(execution)’ execution参数的id时9
servicetask2会runService.setVariable(“myName”, myBean.getName())
*/
//因为 servicetask2 已经 set 了一个myName 变量,所以我们可以取出来看下
Object name = runService.getVariable(pi.getId(),"myName");//百度 RuntimeService api getVariable(String executionId, String variableName)
System.out.println("bpmn设置的名字为"+name);
/*
* 执行bean.bpmn的activiti:expression=‘${myBean.print(execution)’ execution参数的id时9
bpmn设置的名字为bean.bpmn要用来set
*/
}
三。额外、Shell 任务,java中执行shell脚本--不是特别重要,有需要再来看看
3.1 测试activiti 底层用的也是ProcessBuilder 做处理
测试方法
//测试activiti 底层用的也是ProcessBuilder 做处理
public static void javaShellTest() throws IOException{
//创建命令集合
List<String> argList = new ArrayList<String>();
argList.add("cmd");
argList.add("/c");
argList.add("echo");
argList.add("hello");
argList.add("crazyit");
ProcessBuilder processBuilder = new ProcessBuilder(argList);
// 执行命令返回进程
Process process = processBuilder.start();
// 解析输出
String result = convertStreamToStr(process.getInputStream());
System.out.println(result); //输出 hello crazyit
}
//读取输出流并转换为字符串
public static String convertStreamToStr(InputStream is) throws IOException {
if (is != null) {
Writer writer = new StringWriter();
char[] buffer = new char[1024];
try {
Reader reader = new BufferedReader(new InputStreamReader(is,
"UTF-8"));
int n;
while ((n = reader.read(buffer)) != -1) {
writer.write(buffer, 0, n);
}
} finally {
is.close();
}
return writer.toString();
} else {
return "";
}
}
3.2 读 shell.bpmn
新建 shell.bpmn
修改 shell.bpmn -- 指定Service Task activiti:type="shell"
用extensionElements 将shell脚本放入,如下图:
测试代码
// shell脚本写在shell.bpmn中
public static void shellTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("shell.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
// 启动流程
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
System.out.println("参数值:" + runService.getVariable(pi.getId(), "javaHome")); //输出结果D:\installation\installation\java8\jdk8
}
总测试类ServiceTaskTest.java
package com.xiangshuai.act.c20;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngines;
import org.activiti.engine.RepositoryService;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.TaskService;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
/**
* @author lqx
* 文件在 E:\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤17- BPMN任务(2)服务任务
* 或 我的网盘\我的笔记\学习文档子目录压缩\框架\工作流引擎\Activiti6.0\window\复习步骤17- BPMN任务(2)服务任务
*
*/
public class ServiceTaskTest {
public static void main(String[] args) {
//testActivitiDelegateExpression();
// testActivitiExpression();
/* try {
javaShellTest();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}*/
shellTest();
}
/**
* 测试activiti:delegateExpression 在bpmn文件中activiti:delegateExpression="${juel自定义实现了JavaDelegate、ActivityBehavior的类,而且必须序列化}"
*/
public static void testActivitiDelegateExpression(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务 和TaskService 任务管理TaskService
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
// 启动服务
Deployment dep = rs.createDeployment().addClasspathResource("delegate.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
/*
百度RuntimeService API
startProcessInstanceByKey(String processDefinitionKey, String businessKey)
Starts a new process instance in the latest version of the process definition with the given key.
*/
Map<String, Object> vars=new HashMap<String, Object>();
vars.put("myDelegate",new MyDelegate()); //bpmn 中用的key 就是 myDelegate
//bpmn 中用到 ${juel自定义类,必须让activiti能识别},所以在启动流程时需用ByKey,将带自定义类的map作为参数启动流程
ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);
/*
输出结果:当流程执行到Service Task 会执行对应的${myDelegate}对应的自定义类 MyDelegate的execute 输出
"delegate.bpmn 中测试 <serviceTask id='servicetask2' name='Service Task' activiti:delegateExpression='${myDelegate}'></serviceTask>"
*/
}
/**
*测试activiti:expression --这个可以直接调用javabeen(我们随便自定义的java类,只要序列化了就成)应用的最多 ,
*activiti:expression="${类.方法(可带参数)}" 或者runService设置变量activiti:expression="${execution.setVariable('myName', myBean.name)}"--
*-这个就是先从myBean调用getName方法获得值再runService myName这个变量runService.setVariable("myName", myBean.name))
*/
public static void testActivitiExpression(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务 和TaskService 任务管理TaskService
RuntimeService runService = engine.getRuntimeService();
TaskService taskService = engine.getTaskService();
// 启动服务
Deployment dep = rs.createDeployment().addClasspathResource("bean.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
/*
百度RuntimeService API
startProcessInstanceByKey(String processDefinitionKey, String businessKey)s
Starts a new process instance in the latest version of the process definition with the given key.
*/
Map<String, Object> vars=new HashMap<String, Object>();
vars.put("myBean",new MyBean()); //bpmn 中用的key 就是 myBean
//bpmn 中用到 ${juel自定义类,必须让activiti能识别},所以在启动流程时需用ByKey,将带自定义类的map作为参数启动流程
ProcessInstance pi = runService.startProcessInstanceByKey(pd.getKey(), vars);
/*
流程开始后,会自动执行 bean.bpmn的servicetask1和servicetask2 连个servicetask节点
<serviceTask id="servicetask1" name="Service Task"
activiti:expression="${myBean.print(execution)}"></serviceTask>
<serviceTask id="servicetask2" name="Service Task"
activiti:expression="${execution.setVariable('myName', myBean.name)}"></serviceTask>
servicetask1 会执行 myBean.print(execution) 方法 输出-执行bean.bpmn的activiti:expression=‘${myBean.print(execution)’ execution参数的id时9
servicetask2会runService.setVariable(“myName”, myBean.getName())
*/
//因为 servicetask2 已经 set 了一个myName 变量,所以我们可以取出来看下
Object name = runService.getVariable(pi.getId(),"myName");//百度 RuntimeService api getVariable(String executionId, String variableName)
System.out.println("bpmn设置的名字为"+name);
/*
* 执行bean.bpmn的activiti:expression=‘${myBean.print(execution)’ execution参数的id时9
bpmn设置的名字为bean.bpmn要用来set
*/
}
//测试activiti 底层用的也是ProcessBuilder 做处理
public static void javaShellTest() throws IOException{
//创建命令集合
List<String> argList = new ArrayList<String>();
argList.add("cmd");
argList.add("/c");
argList.add("echo");
argList.add("hello");
argList.add("crazyit");
ProcessBuilder processBuilder = new ProcessBuilder(argList);
// 执行命令返回进程
Process process = processBuilder.start();
// 解析输出
String result = convertStreamToStr(process.getInputStream());
System.out.println(result); //输出 hello crazyit
}
//读取输出流并转换为字符串
public static String convertStreamToStr(InputStream is) throws IOException {
if (is != null) {
Writer writer = new StringWriter();
char[] buffer = new char[1024];
try {
Reader reader = new BufferedReader(new InputStreamReader(is,
"UTF-8"));
int n;
while ((n = reader.read(buffer)) != -1) {
writer.write(buffer, 0, n);
}
} finally {
is.close();
}
return writer.toString();
} else {
return "";
}
}
// shell脚本写在shell.bpmn中
public static void shellTest(){
ProcessEngine engine = ProcessEngines.getDefaultProcessEngine();
// 存储服务
RepositoryService rs = engine.getRepositoryService();
// 运行时服务
RuntimeService runService = engine.getRuntimeService();
// 任务服务
TaskService taskService = engine.getTaskService();
Deployment dep = rs.createDeployment().addClasspathResource("shell.bpmn").deploy();
ProcessDefinition pd = rs.createProcessDefinitionQuery().deploymentId(dep.getId()).singleResult();
// 启动流程
ProcessInstance pi = runService.startProcessInstanceById(pd.getId());
System.out.println("参数值:" + runService.getVariable(pi.getId(), "javaHome")); //输出结果D:\installation\installation\java8\jdk8
}
}