首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >骆驼不通过Exchange属性

骆驼不通过Exchange属性
EN

Stack Overflow用户
提问于 2016-01-14 07:02:42
回答 3查看 3.3K关注 0票数 0

我需要传递Exchange对象属性的一些参数。据我所知和读到的,最好是在exchange属性上创建参数,因为消息的头在路由过程中可能会发生变化。骆驼正在创造新的交换路线,但没有保存我的任何参数的历史。

现在是一些上下文:我使用部署在WebLogic 12C上的Camel (2.16.1)

相关的Maven部分:

代码语言:javascript
复制
<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>

骆驼背景:

代码语言:javascript
复制
<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,如下所示:

代码语言:javascript
复制
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的方法,但并没有这样做:

代码语言:javascript
复制
<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,但仍然存在相同的问题,正如您在上下文中看到的那样:

代码语言:javascript
复制
<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的示例,唯一没有从other对象更改为另一个属性的属性是:

代码语言:javascript
复制
exchange.getIn().getHeader("breadcrumbId")

根据骆驼文件,这是:

Camel 2.8:用于跟踪跨传输的消息的唯一标识。

但是这个breadcrumbId只对JMS路由保持不变,而不是对文件路由。

谢谢!

EN

回答 3

Stack Overflow用户

发布于 2016-01-14 08:27:56

通过文件端点在两个路由之间路由标头/属性值是不可能的。例如,使用直接端点或jms在两个路由之间进行通信。

有关更多信息,请参见http://camel.apache.org/direct.htmlhttp://camel.apache.org/jms.html

票数 0
EN

Stack Overflow用户

发布于 2022-02-18 20:03:17

Soilworker解释了为什么在使用路径之间的文件时,它不能工作。当您切换到JMS时,默认情况下它仍然只发送消息体。要发送整个交换,您需要在JMS端点上启用transferExchange属性。它在他的答复中所包含的文件链接中。

在这一点上,我个人建议不要通过外部连接传输交换,而是使用允许您在消息正文中传递任何所需属性的格式。从长远来看,这将使您具有更大的灵活性,而不会将您与特定的交付机制联系在一起。

编辑:哎呀,应该检查了原始问题的日期。但是,由于最初没有提到这个部分,我认为澄清为什么仅仅切换到JMS是很有用的。

票数 0
EN

Stack Overflow用户

发布于 2016-01-14 08:54:16

因为你使用的是新版本的骆驼,这似乎已经发生了。http://camel.apache.org/property.html

从Camel 2.15开始,属性语言被重命名为exchangeProperty,以避免与属性作为一个通用术语的模糊、混淆和冲突。因此,在使用Camel 2.15之前使用exchangeProperty而不是属性。

代码语言:javascript
复制
<route>
  <from uri="direct:a" />
  <recipientList>
    <exchangeProperty>myProperty</exchangeProperty>
  </recipientList>
</route>

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34783492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档