BPMN2.0服务任务

2023-11-23 01:18
文章标签 服务 任务 bpmn2.0

本文主要是介绍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服务任务的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/414273

相关文章

Linux中SSH服务配置的全面指南

《Linux中SSH服务配置的全面指南》作为网络安全工程师,SSH(SecureShell)服务的安全配置是我们日常工作中不可忽视的重要环节,本文将从基础配置到高级安全加固,全面解析SSH服务的各项参... 目录概述基础配置详解端口与监听设置主机密钥配置认证机制强化禁用密码认证禁止root直接登录实现双因素

Golang如何对cron进行二次封装实现指定时间执行定时任务

《Golang如何对cron进行二次封装实现指定时间执行定时任务》:本文主要介绍Golang如何对cron进行二次封装实现指定时间执行定时任务问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录背景cron库下载代码示例【1】结构体定义【2】定时任务开启【3】使用示例【4】控制台输出总结背景

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

在Golang中实现定时任务的几种高效方法

《在Golang中实现定时任务的几种高效方法》本文将详细介绍在Golang中实现定时任务的几种高效方法,包括time包中的Ticker和Timer、第三方库cron的使用,以及基于channel和go... 目录背景介绍目的和范围预期读者文档结构概述术语表核心概念与联系故事引入核心概念解释核心概念之间的关系

springboot如何通过http动态操作xxl-job任务

《springboot如何通过http动态操作xxl-job任务》:本文主要介绍springboot如何通过http动态操作xxl-job任务的问题,具有很好的参考价值,希望对大家有所帮助,如有错... 目录springboot通过http动态操作xxl-job任务一、maven依赖二、配置文件三、xxl-

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

SpringCloud整合MQ实现消息总线服务方式

《SpringCloud整合MQ实现消息总线服务方式》:本文主要介绍SpringCloud整合MQ实现消息总线服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、背景介绍二、方案实践三、升级版总结一、背景介绍每当修改配置文件内容,如果需要客户端也同步更新,

linux服务之NIS账户管理服务方式

《linux服务之NIS账户管理服务方式》:本文主要介绍linux服务之NIS账户管理服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、所需要的软件二、服务器配置1、安装 NIS 服务2、设定 NIS 的域名 (NIS domain name)3、修改主