2016-01-14 165 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