我是Camel的新手,并且一直在努力了解如何在特定情况下使用骆驼。 在这种情况下,有一个(基于Java)代理不时生成操作。我需要一个事件驱动的消费者来获得这些事件的通知。这些事件将被路由到“文件”制作者(暂时)。
在骆驼书中,这个例子是针对民意调查的消费者。我找不到一个针对事件驱动的消费者的通用解决方案。 我遇到了类似的JMX实现:
public class JMXConsumer extends DefaultConsumer implements NotificationListener {
JMXEndpoint jmxEndpoint;
public JMXConsumer(JMXEndpoint endpoint, Processor processor) {
super(endpoint, processor);
this.jmxEndpoint = endpoint;
}
public void handleNotification(Notification notification, Object handback) {
try {
getProcessor().process(jmxEndpoint.createExchange(notification));
} catch (Throwable e) {
handleException(e);
}
}
}
这里,只要JMX通知到达,就会调用handleNotification。
我相信我必须做类似的事情,以便在代理生成动作时通知我的消费者。但是,上面的handleNotification方法特定于JMX。该网页说:“在实现自己的事件驱动的使用者时,您必须确定一个类似的事件监听器方法,以便在您的自定义使用者中实现。”
我想知道:我如何识别类似的事件监听器,以便在我的代理有动作时通知我的消费者。
非常感谢网页的任何建议/链接。
答案 0 :(得分:5)
我知道这是一个古老的问题,但我一直在努力解决这个问题,并且只是想我会将其调查结果记录给其他寻找答案的人。
创建Endpoint类(扩展DefaultEndpoint)时,您将覆盖以下创建使用者的方法:
public Consumer createConsumer(Processor processor)
在您的消费者中,您可以访问处理器 - 在此处理器上调用“进程”将创建一个事件并触发该路由。
例如,假设您有一些侦听消息的Java API,并且具有某种侦听器。在我的例子中,Listener将传入的消息放入LinkedBlockingQueue,我的Consumer'doStart'方法看起来像这样(添加你自己的错误处理):
@Override
protected void doStart() throws Exception {
super.doStart();
// Spawn a new thread that submits exchanges to the Processor
Runnable runnable = new Runnable() {
@Override
public void run() {
while(true) {
IMessage incomingMessage = myLinkedBlockingQueue.take();
Exchange exchange = getEndpoint().createExchange();
exchange.getIn().setBody(incomingMessage);
myProcessor.process(exchange);
}
}
};
new Thread(runnable).start();
}
现在我可以在我的CamelContext中创建创建此Consumer的Endpoint的Component,并像这样使用它:
from("mycomponent:incoming").to("log:messages");
每次新消息从Java API到达时都会触发日志消息。
希望能帮助别人!
答案 1 :(得分:4)
事件驱动就是骆驼。
任何路由实际上都是一个事件监听器。
给出路线:
from("activemq:SomeQueue").
bean(MyClass.class);
public class MyBean{
public void handleEvent(MyEventObject eventPayload){ // Given MyEventObject was sent to this "SomeQueue".
// whatever processing.
}
}
这将成为一个事件驱动的消费者。那么如何发送活动?如果您在应用程序中嵌入了camel并从事件动作生成器访问CamelContext,那么您可以从中获取Producer Template并将事件激发到您在Camel中定义的任何端点,例如“seda: SomeQueue”。
否则,如果您的Camel实例在您的应用程序之外的其他服务器或实例中运行,那么您应该使用其他一些传输而不是SEDA。最好是JMS,但其他人也可以选择。 ActiveMQ是我的最爱。您可以轻松启动嵌入式activemq实例(内部JVM)并通过以下方式将其连接到驼峰:
camelContext.addComponent("activemq", activeMQComponent("vm://localhost"));