2013-12-20 24 views
2

this例如Java和我看到的接收器,你有这样的代码:如何使用RabbitMQ的上RabbitMQ的使用,而(真)的Web应用程序中

QueueingConsumer consumer = new QueueingConsumer(channel); 
channel.basicConsume(QUEUE_NAME, true, consumer); 

while (true) { 
    QueueingConsumer.Delivery delivery = consumer.nextDelivery(); 
    String message = new String(delivery.getBody()); 
    System.out.println(" [x] Received '" + message + "'"); 
} 

我不认为使用servlet中的一段时间(真)可能是一个好主意,所以我想知道我是否应该使用Servlet With Thread或者我有什么替代方案。

回答

0

您可能会使用命令解析器。

boolean enough = false; 
while (!enough) { 
    QueueingConsumer.Delivery delivery = consumer.nextDelivery(); 
    String message = new String(delivery.getBody()); 
    System.out.println(" [x] Received '" + message + "'"); 
    if (message.toLowerCase().equals("exit")) enough = true; 
} 
0

有在Servlet中使用while (true) { ... },因为例子很简单也无妨。 它所做的只是等待下一条消息,然后将其打印出来。

在更复杂的应用程序中,通常有一个专用于读取消息和线程池的线程来处理消息。

while (true) { 
    QueueingConsumer.Delivery delivery = consumer.nextDelivery(); 
    String message = new String(delivery.getBody()); 
    process(message); // performs the processing in another thread 
} 

另一个线程用于处理的原因是为了避免在处理消息时填充消息缓冲区。 如果只有1个线程用于从队列中读取和处理,则在处理完成之前不会读取新消息。 这可能会导致队列缓冲区溢出。

0

您不应该将消息作为网络服务器的一部分来使用,而应该使用另一个进程消耗rabbitmq消息,一个worker守护程序,spring有一个很好的模块,编写正确时请参阅http://docs.spring.io/spring-amqp/reference/html/amqp.html它还可以管理线程池,完全独立

相关问题