Отправка jsonPath с использованием сопоставления ввода / вывода zeebe - PullRequest
1 голос
/ 08 января 2020

В настоящее время работаю с Scala и zeebe , и в моем bpmn у меня есть служебная задача, которая получает или отправляет тип данных json, и моя главная цель разобрать это data 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", но я хочу написать это json путь на моем zeebe bpnm, и я не знаю, как получить доступ к переменным ввода / вывода zeebe jobWorker

enter image description here

и главный вопрос - как я могу получить доступ и использовать ioMapping, как показано ниже:

<zeebe:ioMapping>
  <zeebe:output source="glossary.GlossDiv.GlossList.GlossEntry.GlossDef" target="GlossDef" />
</zeebe:ioMapping>

1 Ответ

2 голосов
/ 13 января 2020

Я создал пример, который, как мы надеемся, поможет объяснить это.

Сначала вы создаете рабочий процесс с помощью Zeebe Modeler или 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();

Чтобы получить доступ к полезной нагрузке, достаточно просто вызвать соответствующий метод для данного задания. Например, 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"}}}}}

Так что если вы хотите минимизировать переменные, которые Работа имеет доступ к вы можете использовать входные переменные. Если вы хотите, чтобы результат в переменных рабочего процесса хранился по-другому, вы можете использовать выходное отображение. С отображением вывода вы также можете полностью перезаписать ваши переменные.

Надеюсь, это поможет.

...