1. 服务任务(Java Service Task)
服务任务图形元素:
2. 服务任务(Java Service Task)执行Java程序的方法
-
执行实现JavaDelegate或ActivitiBehavior的类
-
执行一个JavaDelegate对象表达式,通常是spring配置的bean
-
执行调用方法表达式和值表达式
3. 执行实现JavaDelegate或ActivitiBehavior的类
两者区别:JavaDelegate为直接执行,ActivitiBehavior为流程等待
代码实现(代理类):
public class MyJavaDelegate implements JavaDelegate, Serializable {
private static final Logger LOGGER = LoggerFactory.getLogger(MyJavaDelegate.class);
@Override
public void execute(DelegateExecution execution) {
LOGGER.info("run my java delegate {}", this);
}
}
流程定义文件:
<process id="my-process">
<startEvent id="start" />
<sequenceFlow id="flow1" sourceRef="start" targetRef="someTask" />
<serviceTask id="someTask" name="Service Task"
activiti:class="com.syc.activiti.example.MyActivitiBehavior"/>
<sequenceFlow id="flow2" sourceRef="someTask" targetRef="end" />
<endEvent id="end" />
</process>
测试文件:
@Test
@Deployment(resources = "my-process-servicetask1.bpmn20.xml")
public void testServiceTask(){
ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process");
List<HistoricActivityInstance> activityInstances = activitiRule.getHistoryService().createHistoricActivityInstanceQuery().orderByHistoricActivityInstanceEndTime().asc().list();
for(HistoricActivityInstance activityInstance : activityInstances){
LOGGER.info("activity = {}", activityInstance);
}
}
测试输出效果:
同理,MyActivitiBehavior的测试类:
@Test
@Deployment(resources = "my-process-servicetask2.bpmn20.xml")
public void testUserTask2(){
ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process");
List<HistoricActivityInstance> activityInstances = activitiRule.getHistoryService().createHistoricActivityInstanceQuery().orderByHistoricActivityInstanceEndTime().asc().list();
for(HistoricActivityInstance activityInstance : activityInstances){
LOGGER.info("activity = {}", activityInstance);
}
Execution execution = activitiRule.getRuntimeService().createExecutionQuery().activityId("someTask").singleResult();
LOGGER.info("execution = {}", execution);
//节点继续向后执行
ManagementService managementService = activitiRule.getManagementService();
managementService.executeCommand(new Command<Object>() {
@Override
public Object execute(CommandContext commandContext) {
ActivitiEngineAgenda agenda = commandContext.getAgenda();
agenda.planTakeOutgoingSequenceFlowsOperation((ExecutionEntity) execution,false);
return null;
}
});
activityInstances = activitiRule.getHistoryService().createHistoricActivityInstanceQuery()
.orderByHistoricActivityInstanceEndTime().asc().list();
for(HistoricActivityInstance activityInstance : activityInstances){
LOGGER.info("activity = {}", activityInstance);
}
}
4. JavaDelegate注入属性
//添加属性:姓名和描述
private Expression name;
private Expression desc;
@Override
public void execute(DelegateExecution execution) {
if(name != null){
Object value = name.getValue(execution);
LOGGER.info("name = {}", value);
}
if(desc != null){
Object value = desc.getValue(execution);
LOGGER.info("desc = {}", value);
}
LOGGER.info("run my java delegate {}", this);
}
流程定义文件代码ServiceTask部分代码
<serviceTask id="someTask" name="Service Task"
activiti:class="com.syc.activiti.example.MyJavaDelegate">
<extensionElements>
<activiti:field name="name" stringValue="The Java Delegate"/>
<activiti:field name="desc">
<activiti:expression>my ${desc}</activiti:expression>
</activiti:field>
</extensionElements>
</serviceTask>
测试部分代码:
@Test
@Deployment(resources = "my-process-servicetask3.bpmn20.xml")
public void testServiceTask3(){
Map<String, Object> variable = Maps.newHashMap();
variable.put("desc", "the test java delegate");
ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process",variable);
}
测试效果输出:
5. 执行一个JavaDelegate对象表达式
<serviceTask id="servicetask" name="Service Task"
activiti:delegateExpression="${myJavaDelegate}"/>
<serviceTask id = "servicetask" name="Service Task"
activiti:class="com.syc.activiti.example.MyJavaDelegate"/>
使用DelegateExpression与使用Activiti:class的区别:
6. 执行调用方法表达式和值表达式
(1)编写JavaBean类,该类实现序列化方法
public class MyJavaBean implements Serializable {
private static final Logger LOGGER = LoggerFactory.getLogger(MyJavaBean.class);
private String name;
public String getName() {
LOGGER.info("run getname name:{}",name);
return name;
}
public void setName(String name) {
this.name = name;
}
public MyJavaBean() {
}
public void sayHello(){
LOGGER.info("run sayhello");
}
}