我需要通过一些参数的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向交换添加属性。你尝试过吗? –