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