避免在rabbitMQ中使用while(true)?

时间:2015-04-09 01:26:45

标签: java rabbitmq

我不认为在servlet中使用while(true)可能是一个好主意,所以我想知道我是否应该使用Servlet With Thread或者我有其他替代方法。

@Override
    public void doWork(Channel channel, QueueingConsumer queueingConsumer)
            throws Exception {
        while (true) {
            QueueingConsumer.Delivery delivery = queueingConsumer.nextDelivery();
            BasicProperties props = delivery.getProperties();
            BasicProperties replyProps = new BasicProperties.Builder().correlationId(props.getCorrelationId()).build();
            byte[] response = null;
            try {

                String message = ObjectCodec.deSerialize(delivery.getBody()).toString();

                response = process(message);
            } catch (Exception e) {
                LogUtils.logError("CMDBDeleteQueue process data fail.", e);
            } finally {
                channel.basicPublish("", props.getReplyTo(), replyProps,response);
                channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false);
            }
        }
    }

没有其他办法,请勿申请时(真)?感谢。

2 个答案:

答案 0 :(得分:0)

servlet和RabbitMQ使用者都可以是RPC服务器。在伪代码中,

使用RabbitMQ:

while isConsuming
    var message = wait message
    handler.handleAsync(message)

使用Servlets:

void doGet()
    var message = request.getContent()
    handler.handleAsync(message)

使用RabbitMQ的RPC客户端:

var message = new()
publisher.send(message)

使用Servlet的RPC的客户端:

var httpRequest = new()
httpRequest.setContent()
httpRequest.send()

答案 1 :(得分:0)

鉴于你的表面知识,你应该认真考虑看看像spring-amqp这样的东西,这将有助于消耗队列所需的必要资源和线程池管理,这实际上是非常重要的,特别是如果你要做RPC。 / p>

http://projects.spring.io/spring-amqp/