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

标签 java jakarta-ee architecture jms ibm-mq

如果我们通过“临时队列”使用 JMS 请求/回复机制,那么该代码是否具有可扩展性?

到目前为止,我们不知道我们是否会支持每秒 100 个请求,还是每秒 1000 个请求。

下面的代码是我正在考虑实现的。它以“同步”方式使用 JMS。关键部分是创建“消费者”以指向为此 session 创建的“临时队列”的位置。我只是不知道使用这种临时队列是否是一种可扩展的设计。

  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);

更新:

我遇到了另一种模式,请参阅 this blog 这个想法是为发送和接收使用“常规”队列。但是对于“同步”调用,为了获得所需的响应(即匹配请求),您需要创建一个使用“选择器”监听接收队列的消费者。

步骤:

    // 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 + "'" );

所以这种模式的不同之处在于我们不会为每个新请求创建一个新的临时队列。 相反,所有响应都只到达一个队列,但使用“选择器”来确保每个请求线程接收到唯一关心的响应。

我认为这里的缺点是您必须使用“选择器”。我还不知道这是否比前面提到的模式更不受欢迎或更受欢迎。想法?

最佳答案

关于您帖子中的更新 - 如果在消息头上执行选择器会非常有效,就像您对关联 ID 所做的那样。 Spring Integration也在内部为 implementing a JMS Outbound gateway 执行此操作.

关于java - 使用 JMS 临时队列进行同步使用是一种好习惯吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10786636/

相关文章:

java - 使用 JPA 和 Hibernate : Persistence. xml 进行 JUnit 测试

java - 为什么 Jersey 1.x 会与 Jersey 2.x 冲突?

c# - 替代 SSRS 订阅的替代方法有哪些?

java - 将 ActiveMQ 服务与 Web 服务集成 (Mule ESB)

java - 将所有可能的字符串日期转换为日期对象

java - 如何跳过未使用 JAXB 进行验证的节点

architecture - 如果指令是 C 指令,在这个 (nand2tetris) CPU 实现中会发生什么?

java - 如何在同一行打印 bool 和 double?

java - 格式化 unicode 字符

java - java中如何使用Ghost对象实现延迟加载?