一尘不染

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

java

如果我们通过“临时队列”使用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 + "'" );

因此,这种模式的差异在于我们不会为每个新请求创建一个新的临时队列。取而代之的是,所有响应都只进入一个队列,而是使用“选择器”来确保每个请求线程都收到唯一关心的响应。

我认为这里的缺点是您必须使用“选择器”。我还不知道它是不是比前面提到的模式更受青睐。有什么想法吗?


阅读 188

收藏
2020-12-03

共1个答案

一尘不染

关于帖子中的更新-选择器在消息标头上执行时非常有效,就像对Correlation ID一样。Spring
Integration在
内部也这样做以实现JMS出站网关

2020-12-03