Camel未通过Exchange属性

11dmarpk  于 2022-11-07  发布在  Apache
关注(0)|答案(3)|浏览(199)

我需要在Exchange对象的属性上传递一些参数。据我所知和所读到的,最好在Exchange属性上创建我的参数,因为消息的头在路由过程中可能会更改。Camel正在从一个路由到另一个路由创建新的Exchange,但不保留我的任何参数的历史记录。
现在介绍一下背景:我使用的是部署在WebLogic 12 C上的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>

Camel 背景:

<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或direct之后,我尝试使用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路由保持相同。
谢谢你!

9avjhtql

9avjhtql1#

不可能通过文件终结点在2个路由之间路由标头/属性值。请使用例如直接终结点或JMS在2个路由之间通信。
如需详细信息,请参阅http://camel.apache.org/direct.htmlhttp://camel.apache.org/jms.html

w8f9ii69

w8f9ii692#

Soilworker解释了为什么它在路由之间使用文件时不起作用。当你切换到JMS时,它仍然默认只发送消息正文。要发送整个交换,你需要在JMS端点上启用transferExchange属性。它在他的答案中包含的文档链接中。
在这一点上,我个人建议不要通过外部连接传输交换,而是使用一种允许您在消息正文内部传递任何所需属性的格式。从长远来看,这将为您提供更多的灵活性,而不会将您束缚于特定的传递机制。
编辑:哎呀,应该检查原始问题的日期。但是由于最初没有提到这一部分,我认为澄清为什么仅仅切换到JMS是不够的是有用的。

deikduxw

deikduxw3#

由于您使用的是新版本的camel,因此似乎已经发生了这种情况。http://camel.apache.org/property.html
从Camel 2.15起,属性语言被重命名为exchangeProperty,以避免歧义、混淆和与一般术语属性的冲突。因此,在使用Camel 2.15起时,使用exchangeProperty而不是property。

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

请尝试在xml dsl中使用字段访问exchange属性。

相关问题