Java Akka参与者与竞争消费者

Java Akka参与者与竞争消费者,java,apache-camel,cluster-computing,akka,actor,Java,Apache Camel,Cluster Computing,Akka,Actor,我正在尝试使用Akka和Camel实现竞争性事件消费者。Am使用Akka 2.3.2和Camel 5.8.0。我将camel连接到ActiveMQ代理,并使用生产者从另一端生成消息。在下面的代码中,EventManager是创建使用者池的主机,EventProcessor是消息处理参与者 EventManager.java import org.apache.activemq.ActiveMQConnection; import org.apache.activemq.camel

我正在尝试使用Akka和Camel实现竞争性事件消费者。Am使用Akka 2.3.2和Camel 5.8.0。我将camel连接到ActiveMQ代理,并使用生产者从另一端生成消息。在下面的代码中,EventManager是创建使用者池的主机,EventProcessor是消息处理参与者

EventManager.java

    import org.apache.activemq.ActiveMQConnection;
    import org.apache.activemq.camel.component.ActiveMQComponent;
    import org.apache.camel.CamelContext;

    import akka.actor.ActorRef;
    import akka.actor.ActorSystem;
    import akka.actor.Props;
    import akka.actor.UntypedActor;

    import akka.camel.Camel;
    import akka.camel.CamelExtension;
    import akka.japi.Creator;
    import akka.routing.RoundRobinPool;

    public class EventManager {




        private final ActorSystem akkaSystem;

        private CamelContext camelContext = null;

        private ActorRef workRouter;

        public EventManager(ActorSystem system) {
            akkaSystem = system;

            initialize();
        }

        public void initialize() {

            Camel camel = CamelExtension.get(akkaSystem);

            camelContext = camel.context();

            ActiveMQComponent activemqComponent = ActiveMQComponent.activeMQComponent("tcp://localhost:61616");
            activemqComponent.setDeliveryPersistent(false);
            camelContext.addComponent("activemq",activemqComponent );


            int numOfWorkers = 5;

// distributing the message processing across a pool of 5 actors
            ActorRef workRouter =
                      akkaSystem.actorOf(new RoundRobinPool(numOfWorkers).props(Props.create(EventProcessor.class)), 
                        "workRouter");

        }

    }
EventProcessor.java

import org.apache.log4j.Logger;



import akka.actor.UntypedActor;
import akka.camel.CamelMessage;
import akka.camel.javaapi.UntypedConsumerActor;

public class EventProcessor extends UntypedConsumerActor{

    private static final Logger LOGGER = Logger.getLogger(EventProcessor.class);
    public EventProcessor() {

    }

    public void onReceive(Object message) {
        if(message instanceof CamelMessage) {
            CamelMessage camelMessage = (CamelMessage) message;
            String body = camelMessage.getBodyAs(String.class, getCamelContext());
                LOGGER.info("Message handled by :" +this.getSelf().path().name());

                LOGGER.info("Message body:" + body);
        }


    }

    public boolean autoAck() {
        return true;
    }
    public String getEndpointUri() {
        return "activemq:queue:dest";
    }

}

我看到的问题是,这些消息似乎被一个参与者使用,而不是在池中分发。我是否需要创建单独的驼峰路线来分发?我还希望在不同的物理节点之间分配处理。感谢您的投入和最佳实践

尝试在AMQ端点上设置并发使用者

return "activemq:queue:dest?concurrentConsumers=50";
。。或在端点上启用异步使用者

return "activemq:queue:dest?asyncConsumer=true";

另外,您似乎把版本信息弄错了。没有驼峰版本5.8。我想这就是AMQ版本。

嗨,克劳斯,我的意思是说activemq骆驼5.8.0。我似乎已经解决了。问题是我分别运行生产者代码和消费者代码。i、 e用消息加载队列,断开生产者的连接,然后启动消费者使用消息。但当我同时运行producer和consumer时,消息会被分发。谢谢你的建议!