Flowable实战-Camel使用「建议收藏」

Flowable实战-Camel使用「建议收藏」本博客将讨论了如何在Flowable6.4.1中安装和使用Camel。希望在阅读此博客后,您将能够设置FlowableTask应用程序,以允许用户运行可以通过Camel路由与其他应用程序集成Flowable。此博客使用FlowableCamel模块中的示例。CamelCamel是一个apache项目,它是为了让Java应用程序之间提供标准化的集成平台。它以组件的形…

大家好,又见面了,我是你们的朋友全栈君。

    本博客将讨论了如何在Flowable 6.4.1中安装和使用Camel。 希望在阅读此博客后,您将能够设置Flowable Task应用程序,以允许用户运行可以通过Camel路由与其他应用程序集成Flowable。 此博客使用Flowable Camel模块中的示例。

 

Camel

Camel是一个apache项目,它是为了让Java应用程序之间提供标准化的集成平台。 它以组件的形式提供传输(端点 endpoints)和企业集成模式(EIPS)的具体实现,以解决集成问题。 然后使用域特定语言(DSL)来创建将传输和EIP连接在一起的路由。 将文件从/ tmp目录加载到内存中,然后将其内容传递到JMS队列。该实例如下所示。

from (“file:/tmp”).to(“jms:aQueue”)

Flowable提供了一个Camel Task,当实例到达Camel Task时会调用定义的camel路由。 因此,Camel路由负责执行应用程序集成和处理,而Camel Task实际上只是一种连接到Camel路由或从Camel接收信息的机制。

Flowable Camel使用

      接下来我要做的事情就是将Camel嵌入到Flowable Task应用程序中。 由于Flowable Task应用程序现在是一个Spring Boot应用程序,我将Camel Spring Starter安装到Flowable Task应用程序中。 我还需要将Flowable Camel模块安装到Flowable Task应用程序中。 Flowable Camel模块为Camel Task提供实现类和配置,以连接到Flowable任务应用程序中。 然后,路由包含与其集成的外部应用程序的端点。 注意:本博客假定您已经在tomcat容器中下载并安装了所有Flowable的应用程序。 下图给出了这种架构的可视化:

Flowable实战-Camel使用「建议收藏」

安装Camel

  1. 下载并解压 6.4.1程序包
  2. 在我的例子中,进入到到Flowable UI Task App模块(〜/ workspace / flowable-engine-flowable-6.4.1 / modules / flowable-ui-task / flowable-ui-task-app)。 打开pom.xml并将以下内容添加到依赖项部分。 如下所示:
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring-boot-starter</artifactId>
<version>2.23.0</version>
</dependency>
<dependency>
<groupId>org.flowable</groupId>
<artifactId>flowable-camel</artifactId>
</dependency>

3、从flowable-ui-task-app的根目录使用以下命令构建mvn项目:mvn package install -DskipTests。 我发现我必须跳过测试,因为主应用程序未通过多项测试。

4、构建成功后,Task应用程序将被打包为target / flowable-task.war。 将新war复制到tomcat webapps目录中(例如cp target / flowable-task.war / opt / tomcat / webapps /。)。 从webapps目录中删除现有的任务app目录(/ opt / tomcat $ rm -Rf webapps / flowable-task)并重启tomcat。

5、验证您是否可以访问http:// localhost:8080 / flowable-task上的任务应用程序。

同步方式使用Camel Task

    现在您已经设置好了运行所需的环境,您可以开始在工作流程中使用Camel Task。 当在执行实例到达Camel任务时,Camel Task将自动运行并调用camel路由。 运行的路由是通过将camel任务ID与路由器规则的from元素匹配来确定的。 例如route:from(“flowable:asyncPingProcess:serviceAsyncPing”)。to(“seda:continueAsync”); 匹配名为asycnPingProcess的流程,该流程具有id为serviceAsyncPing的camel任务。 此工作流程和任务如下所示:

Flowable实战-Camel使用「建议收藏」

流程定义如下:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:flowable="http://flowable.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.flowable.org/processdef">
<process id="CamelVariableTransmission" name="CamelVariableTransmission" isExecutable="true">
<startEvent id="startEvent1"></startEvent>
<serviceTask id="ping" name="Send Variable" flowable:type="camel"></serviceTask>
<sequenceFlow id="sid-5D4FCE03-981A-4E93-91A1-02ECD6046D41" sourceRef="startEvent1" targetRef="sid-79D5FE99-60CA-424F-AAD3-7ABBA577BCBB"></sequenceFlow>
<sequenceFlow id="sid-F08E2B38-EC21-478A-ACAF-938027455F6D" sourceRef="ping" targetRef="saveOutput"></sequenceFlow>
<serviceTask id="saveOutput" name="Save Variable Output" flowable:class="camel.examples.pingpong.SaveOutput"></serviceTask>
<endEvent id="sid-490A8527-1FAD-4E60-B2CB-F395781A048D"></endEvent>
<sequenceFlow id="sid-D7FEDCBA-C1BE-4FC0-9C4F-CF1642C3D2CF" sourceRef="saveOutput" targetRef="sid-490A8527-1FAD-4E60-B2CB-F395781A048D"></sequenceFlow>
<serviceTask id="sid-79D5FE99-60CA-424F-AAD3-7ABBA577BCBB" name="Initialise Variables" flowable:class="com.shareniu.InitialiseVariables"></serviceTask>
<sequenceFlow id="sid-2B35BD26-8861-45FC-9A19-B83F5D4A72F2" sourceRef="sid-79D5FE99-60CA-424F-AAD3-7ABBA577BCBB" targetRef="ping"></sequenceFlow>
</process></definitions>

默认情况下,当camel运行规则时,camel任务将立即(同步)接收响应,然后流程执行实例转到下一个任务。 响应包括运行时由camel路由设置的任何变量值。

异步方式使用Camel Task

    在我们创建的示例中,camel任务被设置为异步。 这意味着camel任务将由异步的Flowable定时器运行,并直接进入接收任务,等待信号。 此方案实现了集成用例,其中camel路由无法立即返回。

     例如,如果camel路由正在执行某些外部应用程序处理并需要等待结果,然后让Flowable流程知道它已完成。 在我们的示例中,我们使用了Receive Task,但您也可以使用设置了triggerable标志的Service Task作为返回路由,基本上将触发器发送到流程/任务实例。 from和to端点的完整camel路由如下所示。

from("flowable:asyncPingProcess:serviceAsyncPing").to("seda:continueAsync");
from("seda:continueAsync").to("flowable:asyncPingProcess:receiveAsyncPing");

有一件事情要特别注意。如果将camel任务设置为异步,那么如果camel立即响应,则流程实例可能失败。根据我们的分析,这是因为当camel试图响应并找到任务时,接收任务还没有被创建。

设置Camel Route

Camel的一个很好的特点是DSL特性意味着我们可以将CAMEL路由定义为Java类。我们已经将camel-spring-starter设置为Flowable任务应用程序的一部分,因此,我们可以将camel路由定义为与Flowable任务应用程序位于同一类路径中的Spring组件,这些组件将被默认camel上下文作为路由获取。这样做:

   将可流动任务应用程序导入Eclipse(即从Eclipse导入MVN项目,从~/workspace/flowable-engine-flowable-6.4.1/modules/flowable-ui-task/flowable-ui-task-app)。

   定位到org.flowable.ui.task.application包并创建一个名为AsyncPingRoute的类,该类扩展了RouteBuilder。实现类如下:

Flowable实战-Camel使用「建议收藏」

Camel变量

我们在工作流中定义了一个服务任务,用于在流程中设置一些变量,这些变量将由camel任务发送到camel路由。任务和实现类如下所示。如您所见,通过设置一个变量(在我们的例子中称为“input”)将变量传入流程实例。然后将每个过程变量传递给camel路由,并可以在路由中访问(例如显示如何在路由中使用“input”变量)。

from("flowable:PingPongProcess:ping").transform().simple("${property.input} World");

来自camel路由的返回变量与正在运行的流程实例进行关联,并且在名为“camelbody”的变量中是可用的。

Flowable实战-Camel使用「建议收藏」

保存变量输出服务任务的代码如下所示:

public class SaveOutput implements JavaDelegate {

@SuppressWarnings("unchecked")
@Override
public void execute(DelegateExecution execution) {
Map<String, String> outputMap = (Map<String, String>) execution.getVariable("outputMap");
outputMap.put("outputValue", (String) execution.getVariable("camelBody"));
System.out.println("CamelBody: " + (String) execution.getVariable("camelBody"));
}
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/143496.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • springboot连接多个数据库

    springboot连接多个数据库今天接到一个新的需求,需要把自己数据库某个表的数据迁移到别的数据库中,于是百度,中间出现了一些细节的问题,解决花了点时间,在此记录一下,下次避免出现过的错误这里把连接一个数据库的情况也记录一下,好做对比一、连接一个数据库1.启动类@SpringBootApplication//扫描mapper映射类所在路径@MapperScan(basePackages="com.xh….

  • 电路板维修入门教程视频_电路板坏了去哪里维修

    电路板维修入门教程视频_电路板坏了去哪里维修(一)          电容篇  1、电容在电路中一般用“C”加数字表示(如C25表示编号为25的电容)。电容是由两片金属膜紧靠,中间用绝缘材料隔开而组成的元件。电容的特性主要是隔直流通交流。电容容量的大小就是表示能贮存电能的大小,电容对交流信号的阻碍作用称为容抗,它与交流信号的频率和电容量有关。容抗XC=1/2πfc(f表示交流信号的

  • 荣耀20青春版曝光用屏幕指纹,网友:不是侧边指纹更快吗?「建议收藏」

    荣耀20青春版曝光用屏幕指纹,网友:不是侧边指纹更快吗?「建议收藏」荣耀今年的手机,你会有一个共同的特征,那就是侧边指纹设计。之前采用背部指纹由于会破坏整体性,所以采用了侧边的指纹,不管是旗舰(除了去年的Magic2),还是千元机都是这种方案,荣耀官方给出的解释是,侧边指纹的解锁速度更快,而且荣耀这边还对比了相对更慢的三星S10系列的超声波方案,最终的结论是,侧边指纹完全超越了之前的三星解锁,所以让侧边指纹方案落地显得更为铿锵有力。…

  • MySQL中多表删除方法

    MySQL中多表删除方法

  • PhalApi 1.4.2 经典封存版 – 码云

    PhalApi 1.4.2 经典封存版 – 码云

  • 格雷码与二进制的转换[通俗易懂]

    格雷码与二进制的转换[通俗易懂]一、什么是格雷码?格雷码,又叫循环二进制码或反射二进制码,格雷码是我们在工程中常会遇到的一种编码方式,它的基本的特点就是任意两个相邻的代码只有一位二进制数不同,这点在下面会详细讲解到。格雷码的基本特点就是任意两个相邻的代码只有一位二进制数不同,这点很重要。常用的二进制数与格雷码间的转换关系如下表:二、二进制格雷码与自然二进制码的互换1、二进制码转换成二进制格雷码  二进制码转换成二进制格雷码,

    2022年10月17日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号