[英]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
实现分解为自己的类,该类可以接受channel
, msgBody
, msgTag
和任何其他数据作为调用run()
方法时可以访问的参数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.