Apache骆驼丝攻示例

如果您想监视,调试,排除流经路由的消息,而又不必从通道中永久消耗消息,那么就需要使用电线 。

有线分流器充当接收者列表,该列表消耗输入通道之外的消息并将其发布到两个输出通道。

第一个是作为主要信道的实际目的地,第二个是作为次要信道的有线分接目的地。

在开始示例之前,让我们研究一下设置细节。

本示例使用以下框架:

  1. Maven的 3.2.3
  2. 阿帕奇骆驼 2.15.1
  3. Spring 4.1.5。发布
  4. Eclipse作为IDE,Luna 4.4.1版。

依存关系

我们只是依靠骆驼的核心组件和记录器组件,因此我们的pom.xml包含:

  1. camel-core
  2. slf4j-api
  3. slf4j-log4j12

pom.xml:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.javarticles.camel</groupId><artifactId>camelHelloWorld</artifactId><version>0.0.1-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.camel</groupId><artifactId>camel-core</artifactId><version>2.15.1</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.12</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.12</version></dependency></dependencies>
</project>

简单的丝锥示例

窃听器接收消息,复制消息并将其发送到窃听目的地。 原始交换继续通过路线到达实际目的地。 骆驼不等待来自丝锥的响应,因为丝锥将消息交换模式(MEP)设置为InOnly。

丝锥

丝锥

您需要使用wireTap语句,指定将消息副本发送到何处的端点URI。 Wire Tap处理器在由Camel路由引擎管理的单独线程上对其进行处理。

在我们的示例中,我们发送一条消息“ One”,以进行direct:start以启动路线。 消息的副本将发送到wireTap目的地direct:tap 。 原始消息消息在通往bean的主路径中继续进行进一步处理。 MyBean.addTwo将“ Two”字符串添加到“ One”。 在发生在单独线程中的窃听路由中,消息被发送到MyBean.addThree以将'Three'添加到'One'。

CamelWiretap示例:

package com.javarticles.camel;import org.apache.camel.CamelContext;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.util.jndi.JndiContext;public class CamelWiretapExample {public static final void main(String[] args) throws Exception {JndiContext jndiContext = new JndiContext();jndiContext.bind("myBean", new MyBean());CamelContext camelContext = new DefaultCamelContext(jndiContext);try {camelContext.addRoutes(new RouteBuilder() {public void configure() {from("direct:start").log("Main route: Send '${body}' to tap router").wireTap("direct:tap").log("Main route: Add 'two' to '${body}'").bean(MyBean.class, "addTwo").log("Main route: Output '${body}'");from("direct:tap").log("Tap Wire route: received '${body}'").log("Tap Wire route: Add 'three' to '${body}'").bean(MyBean.class, "addThree").log("Tap Wire route: Output '${body}'");}});ProducerTemplate template = camelContext.createProducerTemplate();camelContext.start();template.sendBody("direct:start", "One");} finally {camelContext.stop();}}
}

MyBean:

package com.javarticles.camel;import java.util.ArrayList;
import java.util.List;public class MyBean {public String addTwo(String body) {return body + " and two";}public String addThree(String body) {return body + " and three";}        
}

主路线最终输出为“一和二”。 电线分接目标输出为“一和三”。

输出:

12:19| INFO | MarkerIgnoringBase.java 95 | Main route: Send 'One' to tap router
12:19| INFO | MarkerIgnoringBase.java 95 | Main route: Add 'two' to 'One'
12:19| INFO | MarkerIgnoringBase.java 95 | Tap Wire route: received 'One'
12:19| INFO | MarkerIgnoringBase.java 95 | Tap Wire route: Add 'three' to 'One'
12:19| INFO | MarkerIgnoringBase.java 95 | Tap Wire route: Output 'One and three'
12:19| INFO | MarkerIgnoringBase.java 95 | Main route: Output 'One and two'

将消息浅复制到Wire Tap

默认情况下,Wire Tap处理器对Camel Exchange实例进行浅表复制。 交换的副本将发送到wireTap语句中指定的端点。 窃听消息的正文包含与原始消息相同的对象,这意味着在窃听路由期间对该对象的内部状态进行的任何更改也可能最终会更改主消息的正文。

在下面的示例中,我们没有将其包装为MyPayload对象,而是将其包装到MyPayload对象中,然后将其发送到direct:start以启动路由,而不是发送字符串“ One”。 主路径将有效负载的值附加“二”,同样,拉丝路径附加“三”。

MyBean:

package com.javarticles.camel;import java.util.ArrayList;
import java.util.List;public class MyBean {public String addTwo(String body) {return body + " and two";}public String addThree(String body) {return body + " and three";}        public MyPayload addTwo(MyPayload body) {body.setValue(body.getValue() + " and two");return body;}public MyPayload addThree(MyPayload body) {body.setValue(body.getValue() + " and three");return body;}
}

MyPayload充当包含字符串值的包装对象。

MyPayload:

package com.javarticles.camel;public class MyPayload {private String value;public MyPayload(String value) {this.value = value;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}public String toString() {return value;}    
}

即使将消息复制到丝锥目标的事件,其持有的对象也与主路径的对象相同。 由于电线分接布线是同时发生的,因此有可能改变主布线的信息。

CamelWiretapShallowCopy示例:

package com.javarticles.camel;import org.apache.camel.CamelContext;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.util.jndi.JndiContext;public class CamelWiretapShallowCopyExample {public static final void main(String[] args) throws Exception {JndiContext jndiContext = new JndiContext();jndiContext.bind("myBean", new MyBean());CamelContext camelContext = new DefaultCamelContext(jndiContext);try {camelContext.addRoutes(new RouteBuilder() {public void configure() {from("direct:start").log("Main route: Send '${body}' to tap router").wireTap("direct:tap").log("Main route: Add 'two' to '${body}'").bean(MyBean.class, "addTwo").log("Main route: Output '${body}'");from("direct:tap").log("Tap Wire route: received '${body}'").log("Tap Wire route: Add 'three' to '${body}'").bean(MyBean.class, "addThree").log("Tap Wire route: Output '${body}'");}});ProducerTemplate template = camelContext.createProducerTemplate();camelContext.start();MyPayload payload = new MyPayload("One");template.sendBody("direct:start", payload);System.out.println("Final payload: " + payload.getValue());} finally {camelContext.stop();}}
}

最终的有效负载已损坏,它是“一个和三个”而不是“一个和两个”。 在下一节中,我们将深度复制对象,然后再将其传递到丝锥目标位置。

输出:

15:25| INFO | MarkerIgnoringBase.java 95 | Main route: Send 'One' to tap router
15:25| INFO | MarkerIgnoringBase.java 95 | Main route: Add 'two' to 'One'
15:25| INFO | MarkerIgnoringBase.java 95 | Tap Wire route: received 'One'
15:25| INFO | MarkerIgnoringBase.java 95 | Tap Wire route: Add 'three' to 'One'
15:25| INFO | MarkerIgnoringBase.java 95 | Tap Wire route: Output 'One and three'
15:25| INFO | MarkerIgnoringBase.java 95 | Main route: Output 'One and three'
Final payload: One and three
15:25| INFO | DefaultCamelContext.java 2660 | Apache Camel 2.15.1 (CamelCont

消息的深层复制到Wire Tap

Wire Tap EIP为我们提供了一种执行消息的“深层”副本的机制。

首先让我们向MyPayload添加深度克隆方法。

MyPayload:

package com.javarticles.camel;public class MyPayload {private String value;public MyPayload(String value) {this.value = value;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}public String toString() {return value;}public MyPayload deepClone() {MyPayload myPayload = new MyPayload(value);return myPayload;}
}

接下来,实现一个自定义Processor以深度克隆MyPayload对象。

MyPayloadClonePrepare:

package com.javarticles.camel;import org.apache.camel.Exchange;
import org.apache.camel.Processor;public class MyPayloadClonePrepare implements Processor {public void process(Exchange exchange) throws Exception {MyPayload myPayload = exchange.getIn().getBody(MyPayload.class);exchange.getIn().setBody(myPayload.deepClone());}
}

需要在onPrepare之后wireTap使用onPrepare语句调用此方法。

CamelWiretapOnPrepare示例:

package com.javarticles.camel;import org.apache.camel.CamelContext;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.impl.DefaultCamelContext;
import org.apache.camel.util.jndi.JndiContext;public class CamelWiretapOnPrepareExample {public static final void main(String[] args) throws Exception {JndiContext jndiContext = new JndiContext();jndiContext.bind("myBean", new MyBean());CamelContext camelContext = new DefaultCamelContext(jndiContext);try {camelContext.addRoutes(new RouteBuilder() {public void configure() {from("direct:start").log("Send '${body}' to tap router").wireTap("direct:tap").onPrepare(new MyPayloadClonePrepare()).end().delay(1000).log("Output of main '${body}'");from("direct:tap").log("Tap router received '${body}'").bean(MyBean.class, "addThree").log("Output of tap '${body}'");}});ProducerTemplate template = camelContext.createProducerTemplate();camelContext.start();MyPayload payload = new MyPayload("One");template.sendBody("direct:start", payload);System.out.println("Final payload: " + payload.getValue());} finally {camelContext.stop();}}
}

现在,主路径的输出不受接线端子路径的影响。 它正确显示为“一个和两个”。

输出:

18:46| INFO | MarkerIgnoringBase.java 95 | Send 'One' to tap router
18:46| INFO | MarkerIgnoringBase.java 95 | Tap router received 'One'
18:46| INFO | MarkerIgnoringBase.java 95 | Output of tap 'One and three'
18:46| INFO | MarkerIgnoringBase.java 95 | Output of main 'One'
Final payload: One

下载源代码

这是有关Apache Camel Wire Tap的示例。 您可以在此处下载源代码: camelWireTapExample.zip

翻译自: https://www.javacodegeeks.com/2015/05/apache-camel-wire-tap-examples.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/360293.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

参考文献中会议名称怎么缩写_期刊缩写查询总结

介绍英文论文写作中&#xff0c;经常会插入参考文献。那么参考文献中的期刊名称&#xff0c;时常需要使用缩写。但是有时候&#xff0c;查了半天&#xff0c;怎么也查不着&#xff0c;让人抓狂。今天小编总结了几个查询期刊缩写的网址&#xff0c;方便大家进行期刊缩写的查询。…

7. SVM松弛变量

我们之前讨论的情况都是建立在样例线性可分的假设上&#xff0c;当样例线性不可分时&#xff0c;我们可以尝试使用核函数来将特征映射到高维&#xff0c;这样很可能就可分了。然而&#xff0c;映射后我们也不能100%保证可分。那怎么办呢&#xff0c;我们需要将模型进行调整&…

mysql 8.0认证失败_解决mysql8.0因密码认证插件导致的链接不上

简介今天在迁移zabbix的数据库&#xff0c;每次链接到自己的mysql都报错&#xff0c;mysqlAuthentication plugin caching_sha2_password cannot be loaded: /usr/lib64/mysql/plugin/caching_sha2_passwordzabbix总是提示**** MySQL server is not available. Waiting 5 secon…

ActionScript 3.0入门:Hello World、文件读写、数据存储(SharedObject)、与JS互调

近期项目中可能要用到Flash存取数据&#xff0c;并与JS互调&#xff0c;所以就看了一下ActionScript 3.0&#xff0c;现把学习结果分享一下&#xff0c;希望对新手有帮助。 目录 ActionScript 3.0简介 Hello World 文件读写 数据存储(SharedObject) 与JS互调 ActionScript 3.0简…

Quasar和Akka –比较

actor模型是用于容错和高度可扩展系统的设计模式。 角色是独立的工作程序模块&#xff0c;仅通过消息传递与其他角色进行通信&#xff0c;可以与其他角色隔离而失败&#xff0c;但是可以监视其他角色的故障并在发生这种情况时采取一些恢复措施。 参与者是简单&#xff0c;孤立但…

dlgdata.cpp错误提示 解决方案

1、在测试编写继承CStatic类组件时候&#xff0c;发现在调用调试过程中弹出一个错误&#xff0c;点忽略还可以继续运行。如下图&#xff1a; 2、dlgdata.cpp此文件是VS安装目录\Microsoft Visual Studio .NET 2003\Vc7\atlmfc\src\mfc中的文件&#xff0c;而出现此错误一般是所…

mysql主从复制时间配置_MySQL主从复制配置

环境CentOS 7.5Docker 1.13.1MySQL 8.0.16基于以上环境启动三个mysql容器&#xff0c;一个为master&#xff0c;二个为slavemaster和slave使用的mysql版本是完全一致的&#xff0c;未测试不同版本的mysql配置master编辑配置文件编辑master的配置文件my.cnf$ vim /usr/mysql/con…

C语言操作符优先级

转自&#xff1a;http://www.cnblogs.com/xiehy/archive/2010/02/04/1663825.html 优先级 运算符 含 义 要求运算 对象的个数 结合方向 1 () [] -> . 圆括号 下标运算符 指向结构体成员运算符 结构体成员运算符 自左至右 2 ! 逻辑非运算符 1 (单目运算符)…

Win7下硬盘安装Redhat双系统

Win7下硬盘安装Redhat Linux 形成双系统过程详解 需要软件 EasyBCD2.0 和 linux ISO 系统镜像 RedHat linux下载地址&#xff1a;http://www.linuxidc.com/Linux/2013-01/78017.htm 安装前准备工作: 1 一个 Windows 盘 D E F 任选其一都可以&#xff0c;将其格式化为FAT32 格式…

java rmi漏洞工具_学生会私房菜【20200924】Weblogic WLS核心组件反序列化命令执行突破(CVE20182628)漏洞复现...

学生会私房菜学生会私房菜是通过学生会信箱收集同学们的来稿&#xff0c;挑选其中的优质文档&#xff0c;不定期进行文档推送的主题。本期文档内容为&#xff1a;Weblogic WLS核心组件反序列化命令执行突破(CVE-2018-2628)漏洞复现》作者介绍&#xff1a;ChowChow&#xff0c;一…

ASP.NET伪静态-无法读取配置文件,因为它超过了最大文件大小的解决办法

一直都在使用微软URLRewriter&#xff0c;具体的使用方法我就不多说了&#xff0c;网上文章很多。 但最近遇到一个问题&#xff0c;就是当web.config文件里面设置伪静态规则过多&#xff0c;大于2M的时候&#xff0c;就报错&#xff1a;无法读取配置文件&#xff0c;因为它超过…

java定义list_我的Java Web之路59 - Java中的泛型

本系列文章旨在记录和总结自己在Java Web开发之路上的知识点、经验、问题和思考&#xff0c;希望能帮助更多(Java)码农和想成为(Java)码农的人。目录介绍再谈Java中的类型为什么需要泛型&#xff1f;Java中的泛型泛型类型泛型方法总结介绍还记得我在这篇文章(我的Java Web之路3…

通过更改透明度使图片为透明

使用AlphaBlend函数 函数功能 该函数用来显示具有指定透明度的图像。函数原型 AlphaBlend(HDC hdcDest,int nXOriginDest,int nYOriginDest,int nWidthDest,int hHeightDest,HDC hdcSrc,int nXOriginSrc,int nYOriginSrc,int nWidthSrc,int nHeightSrc,BLENDFUNCTION blendFunc…

(转)CocoaPods:管理Objective-c 程序中各种第三方开源库关联

在我们的iOS程序中&#xff0c;经常会用到多个第三方的开源库&#xff0c;通常做法是去下载最新版本的开源库&#xff0c;然后拖拽到工程中。 但是&#xff0c;第三方开源库的数量一旦比较多&#xff0c;版本的管理就非常的麻烦。有没有什么办法可以简化对第三方库的管理呢&…

为什么子进程每次执行顺序不一样_看完这篇还不懂Redis的RDB持久化,你来打我...

推荐观看&#xff1a;Redis缓存穿透的终极解决方案&#xff0c;手写布隆过滤器_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.comP8架构师串讲&#xff1a;Redis&#xff0c;zookeeper&#xff0c;kafka&#xff0c;Nginx等技术_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​w…

Spring XD用于数据提取

Spring XD是一个功能强大的工具&#xff0c;它是一组可安装的Spring Boot服务&#xff0c;可以独立运行&#xff0c;在YARN或EC2之上运行。 Spring XD还包括一个管理UI网站和一个用于作业和流管理的命令行工具。 Spring XD是一组功能强大的服务&#xff0c;可与各种数据源一起使…

JDK 9 REPL:入门

会议是聚会Java名人的好地方。 Devoxx France是与Java语言架构师&#xff0c;前同事和老朋友Brian Goetz&#xff08; briangoetz &#xff09;见面的一个机会。 我们谈论了JDK 9&#xff0c;而他全都热衷于REPL。 他提到&#xff0c;尽管Java SE 9中有很多重要功能 &#xff0…

sinaapp mysql连接_手把手教你在新浪云上免费部署自己的网站--连接数据库

看完之后&#xff0c;默认你知道怎么将代码上传到新浪云SAE&#xff0c;并且能够成功运行&#xff0c;连接数据库之前&#xff0c;你必须先创建有一个应用。现在我创建一个名称为sampleone的应用&#xff0c;如下图点击左侧的代码管理&#xff0c;选在右侧创建一个版本然后就会…

7 centos 查看程序文件数量_解析CentOS 7中系统文件与目录管理

LINUXLinux操作系统解析CentOS 7中系统文件与目录管理Linux目录结构Linux目录结构是树形的目录结构根目录所有分区、目录、文件等的位置起点整个树形目录结构中&#xff0c;使用独立的一个“/”表示常见的子目录目录目录名称目录目录名称/root管理员家目录/bin所有用户可执行命…

python动态绘图并保留之前绘图_[转]基于Python实现matplotlib中动态更新图片(交互式绘图)...

最近在研究动态障碍物避障算法&#xff0c;在Python语言进行算法仿真时需要实时显示障碍物和运动物的当前位置和轨迹&#xff0c;利用Anaconda的Python打包集合&#xff0c;在Spyder中使用Python3.5语言和matplotlib实现路径的动态显示和交互式绘图(和Matlab功能类似)。Anacond…