java如何处理rabbitmq消息的回调

时间:2014-10-11 18:53:56

标签: java rabbitmq

我想创建一个服务器来处理来自用户的套接字连接,并且在我的服务器内部我希望连接到rabbitmq,每个连接一个,但在他们的网页中提供的示例中我只看到“while”循环到等待消息,在这种情况下,我将需要为每个连接创建一个线程,只处理来自rabbitmq的消息。

有没有办法在java中使用spring或任何框架来执行此操作,我只是为rabbitmq创建回调而不是使用while循环?我正在使用node.js,这很简单, 我想知道一些关于java的提案

先谢谢了。

1 个答案:

答案 0 :(得分:1)

您应该查看Channel.basicConsume和DefaultConsumer抽象类:https://www.rabbitmq.com/api-guide.html#consuming

Java并发将需要一个回调线程来处理每个消息,但是您可以使用线程池来重用线程。

static final ExecutorService threadPool;

static {
    threadPool = Executors.newCachedThreadPool();
}

现在,您需要创建一个将通过创建将传递给线程池以执行的Runnable实例来处理每个传递的使用者。

channel.basicConsume(queueName, false, new DefaultConsumer(channel) {
    @Override
    public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
        final byte msgBody = body; // a 'final' copy of the body that you can pass to the runnable
        final long msgTag = envelope.getDeliveryTag();
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                // handle the message here
                doStuff(msgBody);
                channel.basicAck(msgTag, false);
            }
        };
        threadPool.submit(runnable);
    }
});

这显示了如何在单个连接和通道上处理并发传递,而不会在每个传递中阻塞的单个线程中使用while循环。为了您的理智,您可能希望将Runnable实现纳入其自己的类中,该类可以接受channelmsgBodymsgTag以及任何其他数据作为参数在调用run()方法时可以访问。