2012-10-18 62 views
2

在JSP當我到了「QueueingConsumer.Delivery快遞= consumer.nextDelivery()」的頁面卡住加載。該消息被消耗,但jsp不會加載,也不會產生錯誤。請幫助JSP的RabbitMQ:如何消費一條消息

String QUEUE_NAME = "hello"; 

ConnectionFactory factory = new ConnectionFactory(); 
factory.setHost("localhost"); 
Connection connection = factory.newConnection(); 
Channel channel = connection.createChannel(); 

channel.queueDeclare(QUEUE_NAME, false, false, false, null); 
out.println(" [*] Waiting for messages. To exit press CTRL+C"); 

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

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

我看不到出路,雖然循環? – fvu

+0

正如fvu所指出的那樣,即使沒有while循環,頁面仍然停留在QueueingConsumer.Delivery delivery = consumer.nextDelivery()上,請求的處理將停留在while循環 –

+0

中。 –

回答

1

我猜,你是想實現在JSP頁面中RabbitMQ "Hello World" tutorial。 你不能這樣做,因爲:

  • QueueingConsumer.nextDelivery將阻塞,直到有可用消息隊列
  • 要爲他們在隊列的頭部到達顯示所有信息,你需要一個無限循環(如教程中所示),這在JSP頁面中不起作用。

您的JSP頁面是請求生命週期的一部分,它需要儘快結束並將請求的資源(在本例中爲JSP頁面中的HTML等)返回給用戶的瀏覽器。雖然大多數瀏覽器都開始顯示結果,因爲它們接受他們,他們不會處理一個漫長的沉寂或永無止境的響應。即使他們可以不要這樣做,因爲您的服務器可以處理的併發請求數量將會受到限制。

如果您正在使用RabbitMQ的玩弄,看看它是如何工作的話,我會建議您開發一個Java應用程序(按照教程),即不要試圖做一個Web應用程序。 (另外,正如fvu指出的那樣,請注意QueueingConsumer現在已被棄用)。

如果您需要在web應用程序中執行此操作,那麼您需要考慮一種存儲消息的方式(例如,在數據庫或單例數據結構中,如果您擁有單個例如Tomcat的實例)關閉消息隊列(可能通過後臺線程,即沒有服務請求的線程)。然後您的JSP頁面可以讀取數據結構中的消息以顯示給用戶。

+0

感謝一羣馬丁 –