我想创建一个服务器来处理来自用户的套接字连接,并且在我的服务器内部我希望连接到rabbitmq,每个连接一个,但在他们的网页中提供的示例中我只看到“while”循环到等待消息,在这种情况下,我将需要为每个连接创建一个线程,只处理来自rabbitmq的消息。
有没有办法在java中使用spring或任何框架来执行此操作,我只是为rabbitmq创建回调而不是使用while循环?我正在使用node.js,这很简单, 我想知道一些关于java的提案
先谢谢了。
答案 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
实现纳入其自己的类中,该类可以接受channel
,msgBody
,msgTag
以及任何其他数据作为参数在调用run()
方法时可以访问。