如果我们通过“临时队列”使用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);
更新:
我遇到了另一种模式,请参阅此博客。 该想法是对发送和接收使用“常规”队列。但是,对于“同步”调用,为了获得所需的响应(即匹配请求),您创建了一个使用“选择器”侦听接收队列的使用者。
脚步:
// 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 + "'" );
因此,这种模式的差异在于我们不会为每个新请求创建一个新的临时队列。取而代之的是,所有响应都只进入一个队列,而是使用“选择器”来确保每个请求线程都收到唯一关心的响应。
我认为这里的缺点是您必须使用“选择器”。我还不知道它是不是比前面提到的模式更受青睐。有什么想法吗?
关于帖子中的更新-选择器在消息标头上执行时非常有效,就像对Correlation ID一样。Spring Integration在内部也这样做以实现JMS出站网关。