首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用zeebe输入/输出映射发送jsonPath

利用zeebe输入/输出映射发送jsonPath
EN

Stack Overflow用户
提问于 2020-01-08 11:15:16
回答 1查看 536关注 0票数 1

目前正在使用Scala和zeebe,在我的bpmn中,我有一些服务任务,这些任务获取或发送json的数据类型,我的主要目标是解析这个数据jsonpath,例如:

代码语言:javascript
复制
{
    "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发出get请求,我可以

代码语言:javascript
复制
"GlossDef": {
      "para": "A meta-markup language, used to create markup languages such as DocBook.",
      "GlossSeeAlso": ["GML", "XML"]
}

通过给jsonpath = "$.glossary.GlossDiv.GlossList.GlossEntry.GlossDef",但是我想在我的zeebe上写这个json路径,而且我不知道如何访问zeebe jobWorker输入/输出变量

主要问题是如何访问和使用ioMapping,如下所示:

代码语言:javascript
复制
<zeebe:ioMapping>
  <zeebe:output source="glossary.GlossDiv.GlossList.GlossEntry.GlossDef" target="GlossDef" />
</zeebe:ioMapping>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-13 14:44:50

我创建了一个例子,希望能帮助解释这个问题。

首先,通过Zeebe建模器Java模型API创建工作流。

您可以使用输入和输出映射来创建新变量或定义如何将变量合并到工作流实例变量中,请参见索取进一步资料的文件

我根据您的问题创建了一个类似的工作流,并对第一个任务进行了输出映射。

代码语言:javascript
复制
// 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();

要访问有效负载,只需对给定的作业调用相应的方法。例如,getVariables返回一个JSON格式的字符串,但您也可以使用getVariablesAsMap方法更容易地访问变量。

代码语言:javascript
复制
client
    .newWorker()
    .jobType("typeOne")
    .handler(
        (jobClient, job) -> {
          System.out.println(job.getVariables());
          jobClient.newCompleteCommand(job.getKey()).send().join();
        })
    .name("workerOne")
    .open();

例如,我们的处理程序代码将打印出来。

代码语言:javascript
复制
{"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"}}}}}

对于第二个任务,我们可以编写以下代码。

代码语言:javascript
复制
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();

这将打印出来:

代码语言:javascript
复制
{"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"}}}}}

因此,如果要最小化作业可以访问的变量,可以使用输入变量。如果希望以不同方式存储工作流变量中的结果,则可以使用输出映射。通过输出映射,您还可以完全覆盖变量。

我希望这能帮到你。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59644638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档