繁体   English   中英

java如何处理Rabbitmq消息的回调

[英]java how to handle callbacks of rabbitmq messages

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

有没有一种方法可以在Java中使用spring或我只是为Rabbitmq创建回调而不是使用while循环的任何框架来实现? 我使用的是node.js,这很简单,我想知道一些有关Java的建议

提前致谢。

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

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()方法时可以访问的参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM