用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