使用 Apache Camel 和 JAVA 处理 ActiveMQ 消息

Processing ActiveMQ Messages with Apache Camel and JAVA

我在 JAVA-Method 中接收 AMQ-Messages 时遇到问题。我在 Spring DSL 中使用 Camel-Route 进行路由,如下所示:

<camel:route>
    <camel:from uri="activemq:foo.bar?maxConcurrentConsumers=1"/>
    <camel:to uri="bean:fooService?method=handleBarEvent"/>
</camel:route>

我的 JAVA-Code 看起来像:

package my.company.service

import org.apache.activemq.Message;
import org.apache.log4j.Logger;

public class FooService {
    private static final Logger LOG = Logger.getLogger(FooService.class);

    public void handleBarEvent(Message in) {
        LOG.info(in);
    }

    public void handleOtherEvent(Message in) {
        LOG.info(in);
    }
}

现在,如果我将基于 String 的消息放入 AMQ,我会从 Camel 收到以下错误:

org.apache.camel.component.bean.AmbiguousMethodCallException: Ambiguous method invocations possible: [
  public void my.company.service.FooService.handleBarEvent(org.apache.activemq.Message),
  public void my.company.service.FooService.handleOtherEvent(org.apache.activemq.Message)
]

为什么 Camel 不调用定义的 handleBarEvent-方法?

方法必须接受什么类型作为输入才能得到整个 AMQ-Message?

我试图将方法更改为 public void handleBarEvent(Object in),但随后方法只得到 String-Body,而没有 Message-Headers.

感谢您的帮助!

您可以使用 Exchange-Class 作为参数 handleBarEvent(Exchange exchange) Camel 将按预期传递完整的 message/headers...

  • exchange.getIn().getBody() 获取消息 body
  • exchange.getIn().getHeader([headerName]) 获取 header 值等

此外,您可以使用 bean binding 以更明确的方式将 body/headers 直接绑定到参数,如下所示...

public String hello(String name, @Header("country") String country) {
    return "Hello " + name + " you are from " + country;
}