如何在驼峰中实现事件驱动消费者

时间:2012-08-14 06:52:21

标签: java apache-camel

我是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。该网页说:“在实现自己的事件驱动的使用者时,您必须确定一个类似的事件监听器方法,以便在您的自定义使用者中实现。”

我想知道:我如何识别类似的事件监听器,以便在我的代理有动作时通知我的消费者。

非常感谢网页的任何建议/链接。

2 个答案:

答案 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"));