使用 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;
}
我在 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()
获取消息 bodyexchange.getIn().getHeader([headerName])
获取 header 值等
此外,您可以使用 bean binding 以更明确的方式将 body/headers 直接绑定到参数,如下所示...
public String hello(String name, @Header("country") String country) {
return "Hello " + name + " you are from " + country;
}