「TemporaryQueue」を使用してJMS要求/応答メカニズムを使用する場合、そのコードはスケーラブルになりますか?
現在のところ、1秒あたり100リクエストをサポートするのか、1秒あたり数千リクエストをサポートするのかはわかりません。
以下のコードは、私が実装しようと考えているものです。これは、「同期」方式でJMSを利用します。重要な部分は、このセッション用に作成された「一時キュー」を指すために「コンシューマー」が作成される場所です。このような一時キューの使用がスケーラブルな設計であるかどうかはわかりません。
destination = session.createQueue("queue:///Q1");
producer = session.createProducer(destination);
tempDestination = session.createTemporaryQueue();
consumer = session.createConsumer(tempDestination);
long uniqueNumber = System.currentTimeMillis() % 1000;
TextMessage message = session
.createTextMessage("SimpleRequestor: Your lucky number today is " + uniqueNumber);
// Set the JMSReplyTo
message.setJMSReplyTo(tempDestination);
// Start the connection
connection.start();
// And, send the request
producer.send(message);
System.out.println("Sent message:\n" + message);
// Now, receive the reply
Message receivedMessage = consumer.receive(15000); // in ms or 15 seconds
System.out.println("\nReceived message:\n" + receivedMessage);
アップデート:
別のパターンに出くわしました。このブログを参照してください 。アイデアは、送信と受信の両方に「通常の」キューを使用することです。ただし、「同期」呼び出しの場合、目的の応答を取得する(つまり、要求に一致させる)ために、「セレクター」を使用して受信キューをリッスンするコンシューマーを作成します。
手順:
// 1. Create Send and Receive Queue.
// 2. Create a msg with a specific ID
final String correlationId = UUID.randomUUID().toString();
final TextMessage textMessage = session.createTextMessage( msg );
textMessage.setJMSCorrelationID( correlationId );
// 3. Start a consumer that receives using a 'Selector'.
consumer = session.createConsumer( replyQueue, "JMSCorrelationID = '" + correlationId + "'" );
したがって、このパターンの違いは、新しいリクエストごとに新しい一時キューを作成しないことです。代わりに、すべての応答は1つのキューにのみ送信されますが、「セレクター」を使用して、各要求スレッドが関心のある応答のみを受信するようにします。
ここでの欠点は、「セレクター」を使用する必要があることだと思います。それが前述のパターンよりも好まれないのか、それとも好まれるのかはまだわかりません。考え?