本文主要是介绍BPMN2.0服务任务,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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);@Overridepublic 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>() {@Overridepublic 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");}
}
这篇关于BPMN2.0服务任务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!