2

JSPで、「QueueingConsumer.Delivery delivery = Consumer.nextDelivery()」に到達すると、ページの読み込みが停止します。メッセージは消費されますが、jspはロードされず、エラーも発生しません。助けてください

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 + "'");
}
4

1 に答える 1

1

あなたはRabbitMQの「HelloWorld」チュートリアルをJSPページに実装しようとしていると思います。あなたはこれを次のように行うことはできません:

  • QueueingConsumer.nextDeliveryは、メッセージがキューで利用可能になるまでブロックされます
  • キューの先頭に到着したすべてのメッセージを表示するには、JSPページでは機能しない無限ループ(チュートリアルに示されている)が必要です。

JSPページはリクエストライフサイクルの一部であり、できるだけ早く終了して、リクエストされたリソース(この場合はJSPページのHTMLなど)をユーザーのブラウザに返す必要があります。ほとんどのブラウザは、結果を受信すると結果の表示を開始しますが、長い休止や終わりのない応答には対応しません。サーバーが処理できる同時リクエストの数には制限があるため、これを望まない場合でも。

RabbitMQをいじってどのように機能するかを確認する場合は、(チュートリアルに従って)Javaアプリケーションを開発することをお勧めします。つまり、Webアプリケーションでそれを実行しようとしないでください。(また、fvuが指摘しているように、QueueingConsumerは非推奨になっていることに注意してください)。

Webアプリでそれを行う必要がある場合は、メッセージがメッセージキューから削除されるときに、メッセージを保存する方法を考える必要があります(たとえば、データベースまたはシングルトンデータ構造(Tomcatなどの単一インスタンスがある場合))。 (おそらくバックグラウンドスレッド、つまりリクエストを処理するスレッドではありません)。その後、JSPページはデータ構造からメッセージを読み取ってユーザーに表示できます。

于 2012-10-18T11:36:28.870 に答える