日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Apache骆驼丝攻示例

發布時間:2023/12/3 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Apache骆驼丝攻示例 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

如果您想監視,調試,排除流經路由的消息,而又不必從通道中永久消耗消息,那么就需要使用電線 。

有線分流器充當接收者列表,該列表消耗輸入通道之外的消息并將其發布到兩個輸出通道。

第一個是作為主要信道的實際目的地,第二個是作為次要信道的有線分接目的地。

在開始示例之前,讓我們研究一下設置細節。

本示例使用以下框架:

  • Maven的 3.2.3
  • 阿帕奇駱駝 2.15.1
  • Spring 4.1.5。發布
  • Eclipse作為IDE,Luna 4.4.1版。
  • 依存關系

    我們只是依靠駱駝的核心組件和記錄器組件,因此我們的pom.xml包含:

  • camel-core
  • slf4j-api
  • 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

    總結

    以上是生活随笔為你收集整理的Apache骆驼丝攻示例的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。