Apache骆驼丝攻示例
如果您想監視,調試,排除流經路由的消息,而又不必從通道中永久消耗消息,那么就需要使用電線 。
有線分流器充當接收者列表,該列表消耗輸入通道之外的消息并將其發布到兩個輸出通道。
第一個是作為主要信道的實際目的地,第二個是作為次要信道的有線分接目的地。
在開始示例之前,讓我們研究一下設置細節。
本示例使用以下框架:
依存關系
我們只是依靠駱駝的核心組件和記錄器組件,因此我們的pom.xml包含:
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骆驼丝攻示例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 户外狩猎的常见技巧 户外狩猎的常见小技巧
- 下一篇: 抗氧化性是什么意思 抗氧化性解释