若要使用Java客户端库,请在项目中声明以下Maven依赖项:
io.zeebe
zeebe-client-java
${zeebe.version}
客户端的版本应始终与代理的版本匹配。
在Java代码中,实例化客户端如下:
ZeebeClient client = ZeebeClient.newClientBuilder()
.brokerContactPoint("127.0.0.1:26500")
.build();
在本教程中,您将学习如何在Java应用程序中使用Java客户端与Zeebe进行交互。
将指导您完成以下步骤:
在开始设置项目之前,请启动broker,即通过在分发中运行启动脚本bin/broker或bin/broker.bat。默认情况下,代理绑定到地址localhost:26500。
首先,我们需要一个Maven项目。使用您的IDE创建一个新项目,或者运行maven命令:
mvn archetype:generate
-DgroupId=io.zeebe
-DartifactId=zeebe-get-started-java-client
-DarchetypeArtifactId=maven-archetype-quickstart
-DinteractiveMode=false
将Zeebe客户端库作为依赖项添加到项目的pom.xml中:
io.zeebe
zeebe-client-java
${zeebe.version}
创建一个主类并添加以下行以引导启动Zeebe客户机:
package io.zeebe;
import java.util.Properties;
import io.zeebe.client.ClientProperties;
import io.zeebe.client.ZeebeClient;
public class Application
{
public static void main(String[] args)
{
final ZeebeClient client = ZeebeClient.newClientBuilder()
// change the contact point if needed
.brokerContactPoint("127.0.0.1:26500")
.build();
System.out.println("Connected.");
// ...
client.close();
System.out.println("Closed.");
}
}
运行程序。如果您使用一个IDE,您可以只执行主类。否则,您必须用maven构建一个可执行JAR文件并执行它。
您应该看到输出:
Connected.
Closed.
现在,我们需要一个可以部署的第一个工作流。稍后,我们将使用更多功能扩展工作流。
打开Zeebe Modeler并创建新的BPMN图。将开始事件和结束事件添加到关系图中并连接这些事件。
设置ID(即bpmn流程ID)并将图表标记为可执行。将图表保存在项目的源文件夹中。
接下来,我们要将建模的工作流部署到broker。broker将工作流存储在其bpmn流程ID下,并分配一个版本(即修订版)。
将以下deploy命令添加到主类:
package io.zeebe;
import io.zeebe.client.api.events.DeploymentEvent;
public class Application
{
public static void main(String[] args)
{
// after the client is connected
final DeploymentEvent deployment = client.newDeployCommand()
.addResourceFromClasspath("order-process.bpmn")
.send()
.join();
final int version = deployment.getWorkflows().get(0).getVersion();
System.out.println("Workflow deployed. Version: " + version);
// ...
}
}
运行程序并验证工作流是否已成功部署。您应该看到输出:
Workflow deployed. Version: 1
最后,我们准备创建已部署工作流的第一个实例。工作流实例是由特定版本的工作流创建的,可以在创建时进行设置。
将以下创建命令添加到主类:
package io.zeebe;
import io.zeebe.client.api.events.WorkflowInstanceEvent;
public class Application
{
public static void main(String[] args)
{
// after the workflow is deployed
final WorkflowInstanceEvent wfInstance = client.newCreateInstanceCommand()
.bpmnProcessId("order-process")
.latestVersion()
.send()
.join();
final long workflowInstanceKey = wfInstance.getWorkflowInstanceKey();
System.out.println("Workflow instance created. Key: " + workflowInstanceKey);
// ...
}
}
运行程序并验证是否创建了工作流实例。您应该看到输出:
Workflow instance created. Key: 6
你做到了!要查看工作流实例的执行方式吗?
使用java -jar zeebe-simple-monitor-app-*.jar
启动ZEEBE监视器。
打开Web浏览器并转到http://localhost:8080/。
在这里,您可以看到工作流实例的当前状态。
现在我们想在您的工作流程中做一些工作。首先,在BPMN图中添加一些服务作业,并设置所需的属性。然后扩展您的主类并创建一个作业定时器来处理在工作流实例到达服务任务时创建的作业。
在Zeebe Modeler中打开BPMN图。在开始和结束事件之间插入一些服务任务。
您需要设置每个任务的类型,它标识要执行的工作的性质。将第一个任务的类型设置为“支付服务”。
保存BPMN图并切换回主类。
添加以下行以为第一个作业类型创建作业定时器:
package io.zeebe;
import io.zeebe.client.api.subscription.JobWorker;
public class Application
{
public static void main(String[] args)
{
// after the workflow instance is created
final JobWorker jobWorker = client.newWorker()
.jobType("payment-service")
.handler((jobClient, job) ->
{
System.out.println("Collect money");
// ...
jobClient.newCompleteCommand(job.getKey())
.send()
.join();
})
.open();
// waiting for the jobs
jobWorker.close();
// ...
}
}
运行程序并验证作业是否已处理。您应该看到输出:
Collect money
当您查看Zeebe监视器时,可以看到工作流实例从第一个服务任务移动到下一个服务任务:
通常,工作流不仅仅是任务,还有数据流。工作者从工作流实例获取数据以完成其工作,并将结果发送回工作流实例。
在Zeebe中,数据以变量的形式存储为键值对。创建工作流实例时可以设置变量。在工作流中,工作人员可以读取和修改变量。
在我们的示例中,我们希望使用以下变量创建工作流实例:
"orderId": 31243
"orderItems": [435, 182, 376]
第一个任务应该读取orderid作为输入,并返回totalprice作为结果。
修改工作流实例创建命令并将数据作为变量传递。另外,修改作业定时器以读取作业变量并完成作业并得到结果。
package io.zeebe;
public class Application
{
public static void main(String[] args)
{
// after the workflow is deployed
final Map data = new HashMap<>();
data.put("orderId", 31243);
data.put("orderItems", Arrays.asList(435, 182, 376));
final WorkflowInstanceEvent wfInstance = client.newCreateInstanceCommand()
.bpmnProcessId("order-process")
.latestVersion()
.variables(data)
.send()
.join();
// ...
final JobWorker jobWorker = client.newWorker()
.jobType("payment-service")
.handler((jobClient, job) ->
{
final Map variables = job.getVariablesAsMap();
System.out.println("Process order: " + variables.get("orderId"));
System.out.println("Collect money");
// ...
final Map result = new HashMap<>();
result.put("totalPrice", 46.50);
jobClient.newCompleteCommand(job.getKey())
.variables(result)
.send()
.join();
})
.fetchVariables("orderId")
.open();
// ...
}
}
运行程序并验证是否读取了变量。您应该看到输出:
Process order: 31243
Collect money
当我们查看Zeebe监视器时,可以看到变量totalprice已设置:
zeebe qq交流群群号:856546010