您如何使工作流引擎来执行特定任务?(下)

 

您如何使工作流引擎来执行特定任务?(下)

 

# NO

=randomNumber<=5

# YES

=randomNumber>5

没什么可说的了。但是您会看到编写一个简单的worker并在后续过程中使用结果是多么容易。

 

增加数量

第二个示例也很简单-表示一个简单的循环。相应的工作程序实现如下所示:

 

const { ZBClient } = require("zeebe-node");

 

function createWorkerIncreaseNumber() {

  const zbc = new ZBClient({

    camundaCloud: {

      clientId: connectionInfo.clientId,

      clientSecret: connectionInfo.clientSecret,

      clusterId: connectionInfo.clusterId,

    },

  });

 

  zbc.createWorker({

    taskType: "increase-number",

    taskHandler: async (job: any, complete: any, worker: any) => {

      const number = job.variables.number ? Number(job.variables.number) : 0;

      const increase = job.customHeaders.increase

        ? Number(job.customHeaders.increase)

        : 1;

 

      try {

        const newNumber = number + increase;

        complete.success({

          number: newNumber,

        });

      } catch (error) {

        complete.failure(error);

      }

    },

  });

}



Worker的结构与第一个示例相同。主要区别在于它使用流程上下文中的值作为输入。该值在每次执行时增加。还可以看到,中止条件不是工作程序实现的一部分。工人应完全专注于其复杂的任务(哈哈):

 

i++;

 

中止条件是在流程中建模的,这也正是它所在的位置。因为当我们对流程建模时,我们希望能够从图中读取序列。在这种情况下: 循环何时终止?

 

Webhook.site

这是本节中我最喜欢的示例。它通过执行HTTP请求来显示实际用例。为了看到效果,使用了Webhook.site的服务  ,您将获得一个单独的HTTP端点,可以将其用于示例。如果将请求发送到服务,您将在仪表板上看到一个新条目。

 

要使此示例与您的单个Webhook.site一起使用,必须相应地设置Webhook ID。在开始操作下方,您将找到一个输入字段,您可以在其中输入您的ID或您自己的Webhook.Site URL。Restzeebe会相应地从URL中提取ID。

 

现在,底层的工作程序代码如下所示:

 

import axios, { AxiosRequestConfig, AxiosResponse } from 'axios'

const { ZBClient } = require('zeebe-node')

 

function createWorkerRandomNumber() {

    const zbc = new ZBClient({

          camundaCloud: {

            clientId: connectionInfo.clientId,

            clientSecret: connectionInfo.clientSecret,

            clusterId: connectionInfo.clusterId,

          },

        })

 

    zbc.createWorker({

        taskType: 'webhook',

        taskHandler: async (job: any, complete: any, worker: any) => {

          const webhookId = job.customHeaders.webhook

            ? job.customHeaders.webhook

            : job.variables.webhook

          const method: 'GET' | 'POST' | 'DELETE' = job.customHeaders.method

            ? (String(job.customHeaders.method).toUpperCase() as

                | 'GET'

                | 'POST'

                | 'DELETE')

            : 'GET'

 

          try {

            if (!webhookId) {

              throw new Error('Webhook Id not configured.')

            }

 

            if (!method || !['GET', 'POST', 'DELETE'].includes(method)) {

              throw new Error(

                'Method must be set and one of the following values: GET, POST, DELETE'

              )

            }

 

            const url = 'https://webhook.site/' + webhookId

            const config: AxiosRequestConfig = {

              method,

              url,

            }

            const response: AxiosResponse = await axios(config)

 

            complete.success({

              response: response.data ? response.data : undefined,

            })

          } catch (error) {

            complete.failure(error)

          }

        },

    })

}

在后台,  Axios 用于执行HTTP请求。设计Worker的方式是可以自己配置HTTP方法。为此,您必须下载BPMN图,导航至“服务任务标题”参数并设置其他方法。

我之所以喜欢这个示例,有几个原因,但最重要的一个是:如果您已经拥有微服务生态系统,并且服务通过REST进行交互,那么通过工作流引擎编排微服务只是一小步。

 

相关教程