我需要在Exchange对象的属性上传递一些参数。据我所知并阅读它,最好在交换属性上创建我的参数,因为在路由期间消息的标题可能会发生变化。 Camel正在创建从路由到路由的新交换,但不保留任何参数的历史记录。
现在有些背景信息:我使用部署在WebLogic 12C上的Camel(2.16.1)
相关的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");
}
}
}
我的问题是:在所有路由期间,我从未在属性上获取我的属性。 我的目标是在Camel开始路由我的消息时设置一些属性,并使这些属性可用,直到进程结束。
类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>
更新:在你们几个人说不可能从文件端点发送属性/头属性,只是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")
根据Camel文档,这是:
Camel 2.8:用于跟踪传输邮件的唯一ID。
但是这个breadcrumbId只与JMS路线不同,而不是FILE路线。
谢谢!
答案 0 :(得分:0)
无法通过文件端点在两条路由之间路由标头/属性值。例如,使用直接端点或jms在两条路由之间进行通信。
有关详细信息,请参阅http://camel.apache.org/direct.html或http://camel.apache.org/jms.html。
答案 1 :(得分:-1)
由于您使用的是新版本的驼峰,这似乎已经发生了。 http://camel.apache.org/property.html
从Camel 2.15开始,属性语言已重命名为 exchangeProperty避免歧义,混乱和冲突 属性作为一般术语。所以使用exchangeProperty而不是 使用Camel 2.15以后的财产。
<route>
<from uri="direct:a" />
<recipientList>
<exchangeProperty>myProperty</exchangeProperty>
</recipientList>
</route>
尝试使用字段来访问交换属性的xml dsl。