我需要通過一些參數的Exchange對象的屬性。就我所瞭解和了解的情況而言,最好在交換屬性上創建我的參數,因爲消息的標題可以在路由期間更改。 駱駝正在創建從路線到路線的新交換,但不保留任何參數的歷史記錄。駱駝不通過交換屬性
現在一些背景:我使用的是駱駝(2.16.1)部署在WebLogic 12C
相關的Maven部分:
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<camel.version>2.16.1</camel.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.6.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-core</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-cxf</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jms</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-test-spring</artifactId>
<version>${camel.version}</version>
</dependency>
<dependency>
<groupId>javax.ejb</groupId>
<artifactId>ejb-api</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.13</version>
</dependency>
</dependencies>
駱駝語境:
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="file:/Users/user/camel-test/in?noop=false" />
<process ref="TestProcess"/>
<to uri="file:/Users/user/camel-test/out" />
</route>
<route>
<from uri="file:/Users/user/camel-test/out?noop=false" />
<process ref="TestProcess"/>
<to uri="jms:CamelServer/CamelJMSModule!CamelQueue" />
</route>
</camelContext>
由於你可以看到我正在使用名爲TestProcess的類來影響Exchange對象,如下所示:
package com.test.camel;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
public class TestProcess implements Processor {
public void process(Exchange exchange) throws Exception {
//Just to get the Exchange ID, this ID is changing between routes
System.out.println(exchange.getExchangeId());
//The first time i try to get my custom property should return null of course
System.out.println(exchange.getProperty("MY_PARAMETER_ID"));
//So if my property does not exist in properties i will create it
if(exchange.getProperty("MY_PARAMETER_ID") == null) {
exchange.setProperty("MY_PARAMETER_ID", "SOME_VALUE");
}
}
}
我的問題是:在所有路由期間,我從來沒有得到屬性屬性。 我的目標是設置一些屬性,當駱駝開始路由我的消息,並有這些屬性可用,直到過程結束。
類TestProcess演示了我如何訪問屬性。 我也試過在XML一樣,沒有達到預期效果:
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="file:/Users/user/camel-test/in?noop=false" />
<setProperty propertyName="MY_PARAMETER_ID">
<simple>some-value</simple>
</setProperty>
<to uri="file:/Users/user/camel-test/out" />
</route>
<route>
<from uri="file:/Users/user/camel-test/out?noop=false" />
<log message="MY_PARAMETER_ID = ${header.MY_PARAMETER_ID}" />
<to uri="jms:CamelServer/CamelJMSModule!CamelQueue" />
</route>
</camelContext>
UPDATE:後一對夫婦,你說,這是不可能的發送特性/頭從一個文件終點,只是JMS或直接屬性,我嘗試使用JMS,但我仍然有同樣的問題,因爲你可以在上下文中看到:
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<from uri="jms:CamelServer/CamelJMSModule!ReceiverQueue" />
<setProperty propertyName="MY_PARAMETER_ID">
<simple>some-value</simple>
</setProperty>
<to uri="jms:CamelServer/CamelJMSModule!CamelQueue" />
</route>
<route>
<from uri="jms:CamelServer/CamelJMSModule!CamelQueue" />
<log message="MY_PARAMETER_ID = ${header.MY_PARAMETER_ID}" />
<to uri="jms:CamelServer/CamelJMSModule!FinalQueue" />
</route>
</camelContext>
任何想法?我做錯了什麼?
隨着這裏我只使用JMS,未從Exchange對象更改爲其它的唯一屬性的例子是:
exchange.getIn().getHeader("breadcrumbId")
根據駱駝的文件是這樣的:
駱駝2.8:用於跨傳輸跟蹤消息的唯一ID。
但是這個breadcrumbId只保留與JMS路由NOT與FILE路由相同。
謝謝!
不理解問題:您的設置的交換屬性不能在路由下繼續使用? –
是的@FritzDuchardt的確如此。 – rodrigocoelho
駱駝提供了一個setProperty標籤,用於從路由定義xml向交換添加屬性。你嘗試過嗎? –