如果我们使用“临时队列”的 JMS 请求/回复机制,该代码是否可扩展?
截至目前,我们不知道是否会支持每秒 100 个请求,或者每秒 1000 个请求。
下面的代码是我正在考虑实现的代码。它以“同步”方式使用 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);
Update:
我发现了另一种模式,看看这个博客 http://codedependents.com/2010/03/04/synchronous-request-response-with-activemq-and-spring/这个想法是使用“常规”队列进行发送和接收。然而,对于“同步”调用,为了获得所需的响应(即匹配请求),您需要创建一个使用“选择器”侦听接收队列的消费者。
Steps:
// 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 + "'" );
因此,这种模式的不同之处在于,我们不会为每个新请求创建一个新的临时队列。
相反,所有响应仅到达一个队列,但使用“选择器”来确保每个请求线程仅接收所关心的响应。
我认为这里的缺点是你必须使用“选择器”。我还不知道这是否比前面提到的模式更不受欢迎还是更受欢迎。想法?