本文主要探讨了在使用Spring Jms连接ActiveMQ时遇到的重连问题。当ActiveMQ未启动时,项目启动会被卡住。通过设置`startupMaxReconnectAttempts`参数限制启动时的重连次数,解决了项目启动问题。然后,针对启动后连接异常的情况,通过设置`reconnectOnException`为true,使得`SingleConnectionFactory`在异常时能重置连接,确保了ActiveMQ启动后能成功连接。同时,调整`recoveryInterval`可以控制连接刷新间隔,减少异常日志的输出。
摘要由CSDN通过智能技术生成
我们现在做的Web项目遇到一个问题,项目启动时使用Failover方式连接某个ActiveMQ,brokerUrl类似
failOver:(tcp://xxx.xxx.xxx.xxx:61616),如果ActiveMQ启动正常,项目启动正常;
但如果ActiveMQ没有启动,项目将无法启动完成,一直卡在连接ActiveMQ阶段。
经过调查,发现是ActiveMQ提供的FailOver Transport方式导致的。
FailOver Transport有maxReconnectAttempts和startupMaxReconnectAttempts两个连接参数。
前者是FailOver Transport最大的重连次数,后者是启动阶段的最大重连次数,由于我们原先的连接这两个参数没有设置值,它们都沿用默认值-1,表示无限次重连,直到连接成功为止。这样,只要我们在启动项目时不启动ActiveMQ,FailOver Transport将一直尝试重连,导致后续程序加载无法进行,从而项目启动卡住。
找到了原因之后,我们在brokerUrl中设置startupMaxReconnectAttempts=2,形如:
failOver:(tcp://xxx.xxx.xxx.xxx:61616)?startupMaxReconnectAttempts=2,这样启动时FailOverTransport仅仅重试2次,如果不成功,就不再尝试,继续加载后续程序,这样就解决了项目启动卡住的问题。
然而还有一个问题没有解决,如果启动时没有连接ActiveMQ成功,在项目启动完成后,再启动ActiveMQ时,即使ActiveMQConnectionFactory一直重连ActiveMQ,直到连接成功。我们配置的DefaultMessageListenerContainer仍然会抛出以下异常:
ERROR DefaultMessageListenerContainer - Could not refresh JMS Connection for destination 'queue://xxxxxxx' - retrying in 5000 ms. Cause: The JMS connection has failed: Co
当mq相关的功能只是项目的一部分独立功能,进行开发的时候可能不总是有mq的环境,这时如果
使用
jms
,控制台就会一直输出mq
连接
失败的信息——如果可以控制mq
连接
的开启和关闭,就不会一直弹出
连接
失败了。这在
spring
boot里要怎么做?
想当初研究了一阵
spring
jms
的源码,了解
spring
是如何通过一个注解来启动一个consumer,具体过程已经不记得了,指出要点
不
使用
Jms
Lis...
我
使用
的是
spring
jms
和
activemq
结合,在配置文件中定义了普通的connectionFactory的bean,如下所示:
<bean id="connectionFactory" class="org.apache.
activemq
.
ActiveMQ
ConnectionFactory">
<description>
JMS
连接
工厂</desc...
Spring
Boot中整合
JMS
JMS
即(
Java
Message
Service)
Java
消息服务,,通过统一的
Java
API层面的标准,使得多个客户端可以可以通过
JMS
进行交互。
JMS
和
ActiveMQ
的关系就像JDBC和JDBC驱动的关系。
JMS
包括两种消息模型,点对点和发布/订阅,同时呢
JMS
仅仅支持
Java
平台。
01.
ActiveMQ
简介
Apache
ActiveMQ
是一个开源的消息中间件,它不仅支持
JMS
1.1规范,而且支持多种编程语言,例如,C、C++、c#、Delphi、Erl
最近遇到一个
问题
,正常
ActiveMQ
断开后,因为有因为有心跳检测和
重连
机制,
使用
failover方式,消费者其实是会不断的尝试
重连
,进程应该是一直存在的。但是奇怪的是有的进程的消费者在mq断开后进程会直接挂掉,没有日志输出也不再
重连
了。
主进程如下,消费者代码就是正常的设置监听器(
Message
Listener
)的代码,就不贴了。
* @author ZZJ
* @description:
* @date 2020-9-9 9:46
public class
ActiveMQ
T
jms
在分布式应用中
使用
的非常多,在应用中加入一个简单的消息队列,即可达到解藕和高性能。比如是一个系统处理请求并把数据存入数据库,但中间加入消息队列后,发送和消费消息的项目可分开部署多个,加入lvs更可达到高可用,下面看一个我项目中的部署结构:
前言:随着系统的业务功能不断增强,传统的单机、单任务,单线程的运行模式已经逐渐的被淘汰,取而代之的是分布式,多任务,多线程,当然,现在开源的这方面的框架也非常的多,大概的思想也都类似,下面就结合我这一年多的工作
心得
,分享一个简单易实现的分布式,多任务,多线程的异步任务处理系统的基本实现。
1.系统部署图
该系统主要由3部分构成,任务生产者集群,消息中间件集群,任务消费者集群,下面来分别说下
你是个能吃苦的人吗?
从前的能吃苦大多指的体力劳动的苦,但现在的能吃苦已经包括太多维度,包括:读书学习&寂寞的苦、深度思考&脑力的苦、自律习惯&修行的苦、自控能力&放弃的苦、低头做人&尊严的苦。
虽然这些苦摆在眼前,但大多数人还是喜欢吃简单的苦。熬夜加班、日复一日、重复昨天、CRUD,最后身体发胖、体质下降、能力不足、自抱自泣!所以有些苦能不吃就不吃,要吃就吃那些有成长价值的苦。
今天你坚持了吗?
如果一件小事能坚持5年以上,那你一定是很了不起的人。是
上一篇讲到在整合
activeMQ
如何将queue和topic两种模式共存:
spring
boot2.0整合
activeMQ
,实现p2p和topic两者消息模式兼容共存
然后还遗留了一个
问题
,有读者评论因为配置文件里一句启用
连接
池导致项目启动报错,只要把那句配置注释掉或者改为false就可以了,这实际上是治标不治本,因毕竟流量大的时候不启用
连接
池效率会很低:
# 启用
连接
池
spring
.activ...
断线
重连
机制是
ActiveMQ
的高可用性具体体现之一。
ActiveMQ
提供failover机制去实现断线
重连
的高可用性,可以使得
连接
断开之后,不断的重试
连接
到一个或多个brokerURL。
默认情况下,如果client与broker直接的connection断开,则client会新起一个线程,不断的从url参数中获取一个url来重试
连接
。
但有时在做开发时可能不需要
连接
服务器,这时程序在后台出现了...
demo2 留下了两个
问题
:
1.我们利用demo2 的配置,在queue 模式下 连续发送10W消息出现出现状况。
2.topic 模式下,消费者重启时间段收不到监听的信息怎么办?
二、
问题
解析:
1.测试 发送10W消息,中途会出现
socket: tcp://localhost:61616...
Q: broker:localhost clientid already connect from tcp xxxxxxx
-------------------------------------------------------------------------------
A : 客户端ID 已存在 (1注册的clientID 重复 检查有两个客户端的ID 是否有相同的 ...