javax.jms.JMSException:检测到重复的持久订阅

javax.jms.JMSException: Duplicate durable subscription detected

我在 AWS Fargate 中将 JMS 应用程序部署为 Docker 映像。两项服务是 运行 的任务。但是问题是我得到这个:

2021-03-24 05:15:43.022 ERROR 1 --- [           main] com.hp.ext.cpq.pubsub.SnsTopicPublisher  : Exception happened in readJmsTopicPublishToSnsTopic --->javax.jms.JMSException: Duplicate durable subscription detected

这是我用来创建持久订阅者的代码:

SnsTopicPublisher asyncSubscriber = this.ctx.getBean(SnsTopicPublisher.class);

            if (prop.getProperty("tibco.msgSourceType").equalsIgnoreCase("TOPIC")) {
                dest_t = session.createTopic(prop.getProperty("tibco.msgSource"));
                **TopicSubscriber topicSubscriber = session.createDurableSubscriber(dest_t, "pfpDurable");**
                topicSubscriber.setMessageListener(asyncSubscriber);
                logger.debug("Set Jms Topic Listener ---> asyncSubscriber");
            }
            if (prop.getProperty("tibco.msgSourceType").equalsIgnoreCase("QUEUE")) {
                dest_q = session.createQueue(prop.getProperty("tibco.msgSource"));
                MessageConsumer msgConsumer_p = session.createConsumer(dest_q);
                msgConsumer_p.setMessageListener(asyncSubscriber);
                logger.debug("Set Jms Queue Listener ---> asyncSubscriber");
            }

我从 AWS 云监视日志中收到标记行的错误。

您很可能存在连接(通常还有其他 JMS 对象)泄漏。当抛出异常时,您需要在 finally {} 块中关闭资源,类似于 JDBC 模式。

另外,您可能想看看使用池连接。这允许在 JMS 连接上使用打开+关闭模式,而无需真正关闭与服务器的连接。查看 activemq-jms-pool,它是一个 JMS 标准池(不是特定于 ActiveMQ),适用于大多数 JMS 代理,包括 Tibco 和 IBM MQ。

Connection connection = null;
Session session = null;
MessageConsumer messageConsumer = null;
try {
  connection = connectionFactory.createConnection();
  connection.start();
  .. do some JMS
} catch (JMSException e) {
  // handle errors
} finally {
  if (messageConsumer != null) { 
      try { messageConsumer.close(); } catch (JMSException e) { logger.error("Error closing MessagingConsumer", e); 
  }
  if (session != null) { 
      try { session.close(); } catch (JMSException e) { logger.error("Error closing Session", e); 
  }
  if (connection != null) { 
      try { connection.close(); } catch (JMSException e) { logger.error("Error closing Connection", e); 
  }
}

注意:JMS 规范仅允许使用代码中的 API 每个主题进行 1 个持久订阅。 JMS v2.0 允许共享持久订阅支持多个消费者。