前面我们已经介绍了Camunda的基本操作、任务、表:
这一篇我们介绍一下Camunda的外部任务。
很多时候,任务并不是业务老师来完成,而是外部系统来完成。
这种情况,如何交互呢?
提供接口吗?
Camunda提供了更好的方式,外部服务:只需要在流程图中创建一个服务节点,配置为External就可以。
然后,其他系统可以监听指定的topic,流程到了,就可以获取到通知,完成之后,还可以自动完成任务。
设置为type为External,并指定topic。
具体流程图xml我放在最后,需要自取。
首先,我们模拟一个外部系统监听任务。
最主要是camunda-external-task-client
4.0.0 vip.meet camunda-out-task 1.0.0 UTF-8 8 8 org.camunda.bpm camunda-external-task-client 7.15.0 ch.qos.logback logback-classic 1.5.6 javax.xml.bind jaxb-api 2.4.0-b180830.0359 org.projectlombok lombok 1.18.34
%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{50} - %msg%n
package vip.meet; import lombok.extern.slf4j.Slf4j; import org.camunda.bpm.client.ExternalTaskClient; @Slf4j public class UpWorker { public static void main(String[] args) { ExternalTaskClient client = ExternalTaskClient.create() // 依据实际情况填写程序的IP和端口 .baseUrl("http://localhost:8088/engine-rest") .asyncResponseTimeout(10000) .lockDuration(10000) .workerId("监听流程任务") .build(); client // 要处理的主题 .subscribe("起床了") // 流程实例启动设置的业务key // .businessKey("out-task-key") // 流程定义时设置的业务key .processDefinitionKeyIn("pi-out-001") // .processDefinitionId("pi-out-001:2:ae842ab3-4179-11ef-b67d-ac74b10c44ef") .lockDuration(30000) // 处理任务逻辑 .handler((externalTask, externalTaskService) -> { String item = externalTask.getVariable("item"); Integer money = externalTask.getVariable("money"); log.info("获取任务参数:item:{},money:{}", money, item); // 完成任务 externalTaskService.complete(externalTask); }).open(); } }
其中:subscribe是要订阅的主题,还可以设置businessKey、processDefinitionKey、processDefinitionId等参数来监听指定流程。
处理逻辑可以通过ExternalTask获取相关流程参数,ExternalTaskService来完成任务。
有几个参数需要说明一下:
不知道怎么搭建环境的可以先看一下下面这2篇:
可以直接请求 post url:http://localhost:8088/engine-rest/process-definition/key/{流程id}/start
注意版本:启动实例接口文档
{ "money": { "value": 1024, "type": "integer" }, "item": { "value": "你干嘛" } }
如果流程中没有设置执行人,这里可以指派。
然后我们可以在外部系统查看有没有监听到:我们可以看到外部系统已经接收到任务了,在回去看,可以发现,任务已经完成,流程结束。
数据库url链接中添加allowPublicKeyRetrieval=true参数。
Cause: java.lang.reflect.InaccessibleObjectException: Unable to make public int java.util.XXXX.size() accessible: module java.base does not “opens java.util” to unnamed module @xxxx
MyBatis Ognl反射出错,设置vm参数:–add-opens java.base/java.util=ALL-UNNAMED
Flow_1giqjon Flow_1giqjon Flow_1c1kuaz Flow_1c1kuaz Flow_0yftk9w Flow_0yftk9w