Spring JMSTemplate,拒绝连接时未发送消息

时间:2018-07-04 20:23:41

标签: activemq spring-jms

我的JMS环境遇到问题。

我创建了一个JMSTemplate,它使用了ActiveMQSslConnectionFactory(出于安全目的)。

有时候我的服务器可能离线,或者主机不可达。在这种情况下,由于以下异常,我的JMSTemplate无法连接到主机,并且我的消息也无法传递:

org.springframework.jms.UncategorizedJmsException: Uncategorized exception occurred during JMS processing; nested exception is javax.jms.JMSException: Could not connect to broker URL: ssl://127.0.0.1:61616. Reason: java.net.ConnectException: Connection refused: connect

JMSTemplateConnectionFactory中是否有任何资源/配置可保留此未发送的消息并在重新建立连接时重新发送?

2 个答案:

答案 0 :(得分:1)

像ActiveMQ这样的消息服务器被认为是关键的基础架构,与数据库类似,应使用多服务器/ HA设置进行设置,以不惜一切代价避免服务器停机。但是,有一些方法可以减少停机时间。就像在BlockingQueue中缓冲内部事件一样。如果在ActiveMQ停机期间重新启动应用程序,该情况仍将导致消息丢失。为了确保没有数据丢失,每个事件都必须保存在数据库中(也可能是关闭的)或嵌入到与应用程序紧密连接的某些嵌入式ActiveMQ中。

一种可行的方法可能是配置绑定(嵌入)ActiveMQ的应用程序,然后将应用程序写入其中,然后为远程ActiveMQ设置“代理网络”。这样,应用程序将始终对本地ActiveMQ进行读/写操作,并且当两个实例都处于联机状态时,消息将流动。仅在本地有可用磁盘空间的情况下,此方法才起作用,因此您仍然需要一些想法,以防万一。

答案 1 :(得分:0)

将他们坚持在哪里?

否;没有这种机制;您可以在spring-retry中将JmsTemplate调用包装到RetryTemplate中,但是如果要在某处保留故障,则需要实现。