当前位置: 首页 > 知识库问答 >
问题:

骆驼不通过交易所属性

谢夜洛
2023-03-14

我需要在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>

更新:在一些人说无法从文件endpoint(仅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。

但这种面包屑索引只在JMS路由中保持不变,而不在文件路由中保持不变。

谢谢

共有3个答案

顾永福
2023-03-14

由于您正在使用新版本的骆驼,这似乎已经发生了。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属性。

仲孙思源
2023-03-14

土壤工人解释了为什么在路由之间使用文件时它不起作用。当您切换到JMS时,默认情况下它仍然只发送消息正文。要发送整个交换,您需要在JMSendpoint上启用transferExchange属性。它在他的回答中包含的留档链接中。

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

编辑:哦,应该已经检查了原始问题的日期。但由于最初没有提到这一部分,我认为有必要澄清为什么仅仅切换到JMS是不够的。

钱承允
2023-03-14

无法通过文件endpoint在两条路由之间路由标头/属性值。例如,使用直接endpoint或jms在两条路由之间进行通信。

看见http://camel.apache.org/direct.html或http://camel.apache.org/jms.html了解更多信息。

 类似资料:
  • 我有一个从JMS队列读取项目并将其写入数据库的路径。 我已经阅读了关于ApacheCamelJMS组件的文档,但我没有得到我的问题的确切和明确的答案,即“如果路由中出现异常,JMS消费者是否会重新插入项目或解锁JMS队列中的消息?”。 谢谢 阿里

  • 在Apache Camel中是否有可能注册一个处理程序来管理由于已达到延续超时而无法写入jettyendpointhttp响应的交换?

  • 我正在设置路由1中骆驼交换的属性。我正在尝试在拆分器内的第二条路由中更新该属性。但是在拆分器的第二次迭代中,我得到的是我在路由1中设置的原始值,而不是新的更新值。下面是我正在尝试的示例。。 豆子里面: 为什么不更新属性?甚至我也试着在标题中设置。同样的结果。非常感谢。

  • 我在我的路线上使用油门,如下所示: 我在我的路线中使用org . Apache . camel . spring . SPI . bridgepropertyplaceholderconfigure,这很有效。 我想使时间周期数毫秒参数化,例如: 我有以下错误: 你能帮我吗?

  • 这里是Java 8和Camel 2.19.x。我有以下骆驼路线: 和处理器:

  • 我已经创建了一个服务代理。 代理(请求类型为)和实际服务(请求类型。)之间有一个处理器。 进入< code > process(Exchange Exchange)方法的交换体属于< code>TypeA。 我能够使用下面的代码行访问数据 现在,我想将此信息更改为。 我使用下面的代码添加主体。 我得到了 现在,我想使用调用真正的服务,它来自。 我尝试进入处理器,但出现以下异常 真正的Web服务没有