使用JMS临时队列进行同步使用是一种好习惯吗?

rk2*_*010 24 java architecture jms java-ee ibm-mq

如果我们使用"临时队列"使用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);
Run Code Online (Sandbox Code Playgroud)

更新:

我遇到了另一种模式,看到这个博客 的想法是使用'常规'队列进行发送和接收.但是对于"同步"调用,为了获得所需的响应(即匹配请求),您将创建一个使用"选择器"监听接收队列的消费者.

脚步:

    // 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 + "'" );
Run Code Online (Sandbox Code Playgroud)

因此,这种模式的不同之处在于我们不会为每个新请求创建新的临时队列.相反,所有响应只来自一个队列,但使用"选择器"来确保每个请求线程只接收关注的响应.

我认为这里的缺点是你必须使用'选择器'.我还不知道这是否比先前提到的模式更不优选或更优选.思考?

Bij*_*men 6

关于您的帖子中的更新 - 如果在邮件标题上执行选择器,则非常有效,就像您使用关联ID一样.Spring Integration还在内部执行此操作以实现JMS出站网关.