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



我在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连接上的打开+关闭模式,而无需真正关闭到服务器的连接。查看activemqjms池,它是一个jms标准池(不是activemq特定的(,可与大多数jms代理(包括Tibco和IBMMQ.(一起使用

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允许共享持久订阅来支持多个消费者。

相关内容

最新更新