scala - 使用 zeebe 输入/输出映射发送 jsonPath
问题描述
目前正在使用Scala和zeebe,在我的 bpmn 我有一些服务任务,它获取或发送 json 的数据类型,我的主要目标是解析这个数据 jsonpath,例如:
{
"glossary": {
"title": "example glossary",
"GlossDiv": {
"title": "S",
"GlossList": {
"GlossEntry": {
"ID": "SGML",
"SortAs": "SGML",
"GlossTerm": "Standard Generalized Markup Language",
"Acronym": "SGML",
"Abbrev": "ISO 8879:1986",
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
},
"GlossSee": "markup"
}
}
}
}
}
ServiceTask 从一些 REST API 发出获取请求,我可以得到
"GlossDef": {
"para": "A meta-markup language, used to create markup languages such as DocBook.",
"GlossSeeAlso": ["GML", "XML"]
}
通过给jsonpath = "$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef"
,但我想在我的zeebe bpnm 上写这个 json 路径,我不知道如何访问 zeebe jobWorker 输入/输出变量
主要问题是我如何访问和使用 ioMapping,如下所示:
<zeebe:ioMapping>
<zeebe:output source="glossary.GlossDiv.GlossList.GlossEntry.GlossDef" target="GlossDef" />
</zeebe:ioMapping>
解决方案
我创建了一个示例,希望有助于解释这一点。
首先,您通过Zeebe 建模器或Java 模型 API创建工作流。
您可以使用输入和输出映射来创建新变量或定义应如何将变量合并到工作流实例变量中,请参阅文档以获取更多信息。
我根据您的问题创建了一个类似的工作流程,并在第一个任务上进行了输出映射。
// given
final var client = CLIENT_RULE.getClient();
// deploy workflow
final var workflow =
Bpmn.createExecutableProcess("processId")
.startEvent()
.serviceTask(
"task1",
t ->
t.zeebeTaskType("typeOne")
.zeebeOutput("glossary.GlossDiv.GlossList.GlossEntry.GlossDef", "GlossDef"))
.serviceTask("task2", t -> t.zeebeTaskType("typeTwo"))
.endEvent()
.done();
client.newDeployCommand().addWorkflowModel(workflow, "process.bpmn").send().join();
// create workflow instance with payload
client
.newCreateInstanceCommand()
.bpmnProcessId("processId")
.latestVersion()
.variables(
"{"
+ "\"glossary\": {\"title\": \"example glossary\","
+ "\"GlossDiv\": {"
+ "\"title\": \"S\","
+ "\"GlossList\": {"
+ "\"GlossEntry\": {"
+ "\"ID\": \"SGML\","
+ "\"SortAs\": \"SGML\","
+ "\"GlossTerm\": \"Standard Generalized Markup Language\","
+ "\"Acronym\": \"SGML\","
+ "\"Abbrev\": \"ISO 8879:1986\","
+ "\"GlossDef\": {"
+ "\"para\": \"A meta-markup language, used to create markup languages such as DocBook.\","
+ "\"GlossSeeAlso\": [\"GML\", \"XML\"]"
+ "},"
+ "\"GlossSee\": \"markup\""
+ "}"
+ "}"
+ "}"
+ "}"
+ "}").send().join();
要访问有效负载,您只需在给定的 Job 上调用相应的方法。例如getVariables
返回 JSON 格式的字符串,但您也可以使用该getVariablesAsMap
方法更轻松地访问变量。
client
.newWorker()
.jobType("typeOne")
.handler(
(jobClient, job) -> {
System.out.println(job.getVariables());
jobClient.newCompleteCommand(job.getKey()).send().join();
})
.name("workerOne")
.open();
例如,我们的处理程序代码将打印出来
{"glossary":{"title":"example glossary","GlossDiv":{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}}}
对于第二个任务,我们可以编写以下代码。
final CountDownLatch secondJobLatch = new CountDownLatch(1);
client
.newWorker()
.jobType("typeTwo")
.handler(
(jobClient, job) -> {
System.out.println(job.getVariables());
jobClient.newCompleteCommand(job.getKey()).send().join();
secondJobLatch.countDown();
})
.name("workerTwo")
.open();
secondJobLatch.await();
这将打印出:
{"GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"glossary":{"title":"example glossary","GlossDiv":{"title":"S","GlossList":{"GlossEntry":{"ID":"SGML","SortAs":"SGML","GlossTerm":"Standard Generalized Markup Language","Acronym":"SGML","Abbrev":"ISO 8879:1986","GlossDef":{"para":"A meta-markup language, used to create markup languages such as DocBook.","GlossSeeAlso":["GML","XML"]},"GlossSee":"markup"}}}}}
因此,如果您想最小化作业可以访问的变量,您可以使用输入变量。如果您希望以不同方式存储工作流变量中的结果,您可以使用输出映射。使用输出映射,您还可以完全覆盖您的变量。
我希望这有帮助。
推荐阅读
- php - 将文件上传到 laravel 7 时总是返回 null
- sql - Hive Query 不允许 >= 在 where 子句的子查询中
- javascript - 我在我的 node.js 代码中收到此错误“无法读取未定义的属性 'split'”。如何解决这个问题?
- javascript - JavaScript:从数组中查找总和值最高的对象
- disassembly - 只需使用 ptrace 请求进行反汇编
- java - 在java中设置新对象的出生日期
- django-staticfiles - Python 找不到我的静态文件夹“GET /static/style.css HTTP/1.1” 404 1653
- javascript - 在嵌入在 Angular 应用程序中的第三方网页上执行点击事件
- javascript - Shopify / Liquid - 添加新的联系表单文本区域/要捕获的变量
- pandas - Pandas Groupby 并根据用户输入和每个子组的标签编号将数据集划分为子组