项目中使用Activemq作为消息中间件,ActiveMQ是Apache的开源项目,是一个轻量级的JMS实现。
在使用的过程中遇到了一个比较棘手的问题:
如果连接到ServiceBroker的Connection设成failover的话,当连接断开的时候,FailoverTransport会启动一个工作线程不断的重连,这个时候如果有一个消息需要发送的话,这个消息会被block住,直到重新建立连接才能发送。不过这个时候用户有可能会想要关闭这个Client端。这时候问题出现了,客户端无法关闭这个重连的线程。
原因如下:
ActiveMQ在通信层使用了管道过滤器的模式,当客户端要发送一个消息的时候,这个消息会经过一个Filter Chain进行层层处理,org.apache.activemq.transport.MutexTransport是其中的一个,主要作用是对线程加上互斥锁,代码如下:
public void oneway(Object command) throws IOException {
synchronized (writeMutex) {
next.oneway(command);
}
}
在MutexTransport后面有一个FailoverTransport,担负着如果连接断开则重新连接的责任,所以FailoverTransport在网络断开的时候会阻塞住,这样writeMutex就无法释放,而用户的关闭请求也是作为一个command传入的,所以Shutdown这个Command就无法传入FailoverTransport通知其停止重连。
解决方案:
大概的思路就是在MutexTransport做一个判断,如果Command为ShutdownCommand就无须获取writeMutex锁,直接通过MutexTransport进入FailoverTransport,通知其停止重连。
MutexTransport的修改代码如下:
public void oneway(Object command) throws IOException {
if (command instanceof ShutdownCommand) {
next.oneway(command);
} else {
synchronized (writeMutex) {
next.oneway(command);
}
}
}
分享到:
相关推荐
【10Gtek AMQ10-SR4-M1(JH2)V1.1.pdf】是一款由10Gtek公司推出的40GBASE-SR QSFP+光收发器规格书,主要针对高速网络连接,特别是数据中心和高性能计算环境。这款产品支持40GBASE-SR4和QDR应用,符合QSFP+电气多源...
官方版本,亲测可用
官方版本,亲测可用
Apache ActiveMQ是一款开源的消息中间件,它符合JMS 1.1规范,并且是Apache软件基金会的一个项目,旨在实现不同语言和平台之间的基于标准的、面向消息的应用程序集成。 ActiveMQ支持多种传输协议和编码格式。...
最新在做ActiveMQ Web端开发时,绕了很多路找到了这个插件,小编在这里就贡献了给爱学习小伙伴用。
【标题】:“amq-example:A-MQ 示例” 【描述】:“AMQ OpenShift 客户端,AMQ 客户端实验室练习的支持文件,amq-example” 【标签】:“Java” 【压缩包子文件的文件名称列表】:amq-example-master --- 在...
官方离线安装包,亲测可用
官方离线安装包,亲测可用
### AMQ28-SR4-M1-V1.0 光模块关键技术知识点解析 #### 一、产品概述 AMQ28-SR4-M1-V1.0 是一种高性能的100G QSFP28 SR4 光模块,适用于短距离传输(如数据中心内部连接),最大传输距离可达100米(在OM4多模光纤...
AMQ脚本这是所有脚本的万能库,可提高“中游戏/生活质量的所有脚本。用法可以通过将大多数脚本导入浏览器扩展程序来使用它们,例如用于.js文件的和用于.css文件的 。 在特定项目的文件夹中可以找到更多信息。 design...
显示答案后,单击amq-extension图标以查看歌曲中的统计信息 按下“ New Session按钮以开始新的跟踪会话 移植[0/2] []移植到Firefox []在新Edge上测试 特色[0/5] []查看过去的会议 []创建学习清单 []为您的PTW添加...
amq-s2i-示例
标题中的"amq-在线备份"表明我们正在讨论的是关于ActiveMQ消息中间件的在线备份策略。ActiveMQ是Apache软件基金会开发的一个开放源代码消息传递系统,它实现了JMS(Java消息服务)标准,用于在分布式环境中进行异步...
AMQ-Protocol.cr 是一个专为Crystal编程语言设计的库,用于处理AMQP(Advanced Message Queuing Protocol)0.9.1版本的序列化。AMQP是一种应用层协议,广泛应用于消息中间件,如RabbitMQ,它允许分布式系统中的应用...
快速入门自述文件使用可替换值AMQ_HOME表示JBoss A-MQ安装的路径。 当您在README文件中遇到此值时,请确保将其替换为JBoss A-MQ安装的实际路径。 建议的快速入门方法 我们建议您按照以下方法进行快速入门: 无论您...
Red Hat JBoss A-MQ xPaaS产品应该已经安装并在OpenShift安装上运行,一种运行A-MQ服务的简单方法是遵循与amq63-basic模板相关的OpenShift的A-MQ xPaaS映像的文档。 。 然后,以下命令将打包您的应用并在OpenShift...
标题“consume-large-amq-message”暗示我们关注的是处理大型ActiveMQ消息的问题。在Java开发中,ActiveMQ是一个广泛使用的开源消息代理和队列系统,它遵循开放消息中间件(JMS)规范。处理大型消息时,可能会遇到...
红帽 AMQ 示例 该存储库包含一组与 Red Hat AMQ 消息传递套件组件一起使用的示例。 :股票报价应用程序展示了来自浏览器的rhea javascript 客户端、websockets 和 TLS 连接 :简单Hello World的NodeJS应用特色rhea ...
JMS和文件示例 介绍 本示例使用骆驼框架创建一个简单的生产者和消费者。... Right click on the java class -> Run As -> Java Application 这会将10条消息发送到队列“ testclient.payment.request”
红帽集成:AMQ Streams Workshop 介绍 已成为构建实时数据管道的领先平台。 如今,Kafka被大量用于开发事件驱动的应用程序,使服务可以通过事件相互通信。 将Kubernetes用于此类工作负载需要添加专门的组件,例如...