用java或NodeJS实现外部任务
在完成上面流程的编辑后,现在实现“刷卡付款”的业务逻辑
Camunda 可以使多种语言实现业务逻辑,本文将演示java和nodejs两种方式,你可以任意选择喜欢的一种
a)使用JAVA
需要JAVA1.8+,maven(有的IDE自带),IDE
使用喜欢的ide创建一个maven项目,添加maven依赖如下
<dependencies>
<dependency>
<groupId>org.camunda.bpm</groupId>
<artifactId>camunda-external-task-client</artifactId>
<version>7.15.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
</dependencies>
编写主类,代码如下
import java.util.logging.Logger;
import java.awt.Desktop;
import java.net.URI;
import org.camunda.bpm.client.ExternalTaskClient;
public class ChargeCardWorker {
private final static Logger LOGGER = Logger.getLogger(ChargeCardWorker.class.getName());
public static void main(String[] args) {
ExternalTaskClient client = ExternalTaskClient.create()
.baseUrl("http://localhost:8080/engine-rest")
.asyncResponseTimeout(10000) // 长轮询超时时间
.build();
// 订阅指定的外部任务
client.subscribe("charge-card")
.lockDuration(1000) // 默认锁定时间为20秒,这里修改为1秒
.handler((externalTask, externalTaskService) -> {
// 将您的业务逻辑写在这
// 获取流程变量
String item = (String) externalTask.getVariable("item");
Long amount = (Long) externalTask.getVariable("amount");
LOGGER.info("Charging credit card with an amount of '" + amount + "'€ for the item '" + item + "'...");
try {
Desktop.getDesktop().browse(new URI("https://docs.camunda.org/get-started/quick-start/complete"));
} catch (Exception e) {
e.printStackTrace();
}
// 完成任务
externalTaskService.complete(externalTask);
})
.open();
}
}
使用ide上的运行编译运行按钮运行
如果正常运行,则可以进入下一章了
到此第二部分结束,如果想直接获取到现在为止的进度,可以使用如下命令
git checkout -f Step-2a
b)使用NodeJS
需要NodeJS >= v10
首先创建一个新的NodeJS项目
mkdir charge-card-worker
cd ./charge-card-worker
npm init -y
添加Camunda外部任务依赖
npm install camunda-external-task-client-js
npm install -D open
新建一个 JavaScript 文件,命名为 worker.js
,代码如下
const { Client, logger } = require('camunda-external-task-client-js');
const open = require('open');
// 外部任务客户端的配置:
// - 'baseUrl': 流程引擎的url
// - 'logger': 自动记录的日志等级
// - 'asyncResponseTimeout': 长轮询的超时时间
const config = { baseUrl: 'http://localhost:8080/engine-rest', use: logger, asyncResponseTimeout: 10000 };
// 根据配置创建一个新的外部任务客户端
const client = new Client(config);
// 订阅charge-card
client.subscribe('charge-card', async function({ task, taskService }) {
// 将您的业务逻辑写在这
// 获取流程变量
const amount = task.variables.get('amount');
const item = task.variables.get('item');
console.log(`Charging credit card with an amount of ${amount}€ for the item '${item}'...`);
open('https://docs.camunda.org/get-started/quick-start/success');
// 完成任务
await taskService.complete(task);
});
运行
node ./worker.js
如果正常运行,则可以进入下一章了
到此第二部分结束,如果想直接获取到现在为止的进度,可以使用如下命令
git checkout -f Step-2b