2016-01-14 107 views
0

我需要通过一些参数的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路由相同。

谢谢!

+0

不理解问题:您的设置的交换属性不能在路由下继续使用? –

+0

是的@FritzDuchardt的确如此。 – rodrigocoelho

+0

骆驼提供了一个setProperty标签,用于从路由定义xml向交换添加属性。你尝试过吗? –

回答

0

无法通过文件端点路由2个路径之间的标题/属性值。使用例如直接端点或jms在2条路由之间进行通信。

请参阅http://camel.apache.org/direct.htmlhttp://camel.apache.org/jms.html了解更多信息。

+0

也许一个旧帖子,但从http://camel.465427.n5.nabble.com/Passing-Camel-Message-Headers-to-File-Endpoint-td5713737.html 引用“文件协议不支持您必须以保留邮件有效负载中的标题的方式对您的邮件进行编组/编组。 – soilworker

+0

谢谢,我会检查现在是否可以使用此解决方案。基本上我需要在整个过程中访问一种会话令牌(CAS票据),独立于端点/组件类型。 – rodrigocoelho

+0

您可以将该令牌附加到文​​件名并在路由期间解析它吗? –

-2

由于您正在使用骆驼的新版本,这似乎发生了。 http://camel.apache.org/property.html

来自骆驼2。15年以后,房产语言已被重新命名为 交换房产,以避免含糊不清,混淆以及与 属性之间的冲突作为一般性术语。因此,在使用Camel 2.15之后,请使用exchangeProperty而不是 属性。

<route> 
    <from uri="direct:a" /> 
    <recipientList> 
    <exchangeProperty>myProperty</exchangeProperty> 
    </recipientList> 
</route> 

尝试在XML DSL使用领域而不是访问的交换性能。

+0

请将你可真好解释为什么这是downvoted?与你的问题没有关系吗? –

+0

嗨,这不是我,我仍在尝试所有的例子,并为我找到更好的例子。 – rodrigocoelho