java activemq 断线_java - 防止ActiveMQ重新连接失败时自动退出 - SO中文参考 - www.soinside.com...

我有一个小型的spring-boot应用程序,该应用程序连接到ActiveMQ上的一个或多个主题,这些主题在启动时在应用程序的application.properties文件中设置-然后将这些消息发送到数据库。

这一切都很好,但是在尝试实施故障转移时遇到一些问题-基本上,应用程序将尝试重新连接,但是在重试一定次数后,应用程序进程将自动退出,从而防止重试(理想情况下,我希望该应用程序能够永久重试,直到被手动终止或ActiveMQ再次可用为止。我尝试将连接URL(使用application.properties中的maxReconnectAttempts)中的连接选项(例如url.options)显式设置为-1/0/99999,但这些都似乎不正确,因为行为是相同的每一次。通过查看有关Apache's own reference page的建议,我也希望该行为也可以作为默认行为。

[如果有人有任何建议强制不要退出该应用程序,我将非常感谢!我认为很重要的代码如下:@Configuration

public class AmqConfig {

private static final Logger LOG = LogManager.getLogger(AmqConfig.class);

private static final String LOG_PREFIX = "[AmqConfig] ";

private String clientId;

private static ArrayList amqUrls = new ArrayList<>();

private static String amqConnectionUrl;

private static Integer numSubs;

private static ArrayList destinations = new ArrayList<>();

@Autowired

DatabaseService databaseService;

public AmqConfig (@Value("${amq.urls}") String[] amqUrl,

@Value("${amq.options}") String amqOptions,

@Value("${tocCodes}") String[] tocCodes,

@Value("${amq.numSubscribers}") Integer numSubs,

@Value("${clientId}") String clientId) throws UnknownHostException {

Arrays.asList(amqUrl).forEach(url -> {

amqUrls.add("tcp://" + url);

});

String amqServerAddress = "failover:(" + String.join(",", amqUrls) + ")";

String options = Strings.isNullOrEmpty(amqOptions) ? "" : "?" + amqOptions;

this.amqConnectionUrl = amqServerAddress + options;

this.numSubs = Optional.ofNullable(numSubs).orElse(4);

this.clientId = Strings.isNullOrEmpty(clientId) ? InetAddress.getLocalHost().getHostName() : clientId;

String topic = "Consumer." + this.clientId + ".VirtualTopic.Feed";

if (tocCodes.length > 0){

Arrays.asList(tocCodes).forEach(s -> destinations.add(topic + "_" + s));

} else { // no TOC codes = connecting to default feed

destinations.add(topic);

}

}

@Bean

public ActiveMQConnectionFactory connectionFactory() throws JMSException {

LOG.info("{}Connecting to AMQ at {}", LOG_PREFIX, amqConnectionUrl);

LOG.info("{}Using client id {}", LOG_PREFIX, clientId);

ActiveMQConnectionFactory connectionFactory =

new ActiveMQConnectionFactory(amqConnectionUrl);

Connection conn = connectionFactory.createConnection();

conn.setClientID(clientId);

conn.setExceptionListener(new AmqExceptionListener());

conn.start();

destinations.forEach(destinationName -> {

try {

for (int i = 0; i < numSubs; i++) {

Session session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);

Destination destination = session.createQueue(destinationName);

MessageConsumer messageConsumer = session.createConsumer(destination);

messageConsumer.setMessageListener(new MessageReceiver(databaseService, destinationName));

}

} catch (JMSException e) {

LOG.error("{}Error setting up queue @ {}", LOG_PREFIX, destinationName);

LOG.error(e.getMessage());

}

});

return connectionFactory;

}

}

public class MessageReceiver implements MessageListener, ExceptionListener {

public static final Logger LOG = LogManager.getLogger(MessageReceiver.class);

private static final String LOG_PREFIX = "[Message Receiver] ";

private DatabaseService databaseService;

public MessageReceiver(DatabaseService databaseService, String destinationName){

this.databaseService = databaseService;

LOG.info("{}Creating MessageReceiver for queue with destination: {}", LOG_PREFIX, destinationName);

}

@Override

public void onMessage(Message message) {

String messageText = null;

if (message instanceof TextMessage) {

TextMessage tm = (TextMessage) message;

try {

messageText = tm.getText();

} catch (JMSException e) {

LOG.error("{} Error getting message from AMQ", e);

}

} else if (message instanceof ActiveMQMessage) {

messageText = message.toString();

} else {

LOG.warn("{}Unrecognised message type, cannot process", LOG_PREFIX);

LOG.warn(message.toString());

}

try {

databaseService.sendMessageNoResponse(messageText);

} catch (Exception e) {

LOG.error("{}Unable to acknowledge message from AMQ. Message: {}", LOG_PREFIX, messageText, e);

}

}

}

public class AmqExceptionListener implements ExceptionListener {

public static final Logger LOG = LogManager.getLogger(AmqExceptionListener.class);

private static final String LOG_PREFIX = "[AmqExceptionListener ] ";

@Override

public void onException(JMSException e){

LOG.error("{}Exception thrown by ActiveMQ", LOG_PREFIX, e);

}

}

我从应用程序中获得的控制台输出仅是以下内容(很抱歉,由于没有太大用处,]][2019-12-12 14:43:30.292] [WARN ] Transport (tcp://[address]:61616) failed , attempting to automatically reconnect: java.io.EOFException

[2019-12-12 14:43:51.098] [WARN ] Failed to connect to [tcp://[address]:61616] after: 10 attempt(s) continuing to retry.

Process finished with exit code 0

我有一个小型的spring-boot应用程序设置,该应用程序连接到ActiveMQ上的一个或多个主题,这些主题在启动时在应用程序的application.properties文件中设置-然后将这些消息发送到...

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381355.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

找不到显示桌面的快捷方式怎么办|显示桌面的快捷方式找不到解决方法|显示桌面代码|...

找不到显示桌面的快捷方式怎么办|显示桌面的快捷方式找不到解决方法|显示桌面代码| 新建记事本把一下代码拷进去&#xff0c;保存成scf格式&#xff0c;然后拖到状态栏图标就可以了 [Shell]Command2IconFileexplorer.exe,3[Taskbar]CommandToggleDesktop 转载于:https://www.c…

python输入一个包含若干自然数的列表_关于python的十一道练习

关于python的十一道练习 1.编写程序&#xff0c;输入一个自然数字符串&#xff0c;然后输出各位数字之和。例如&#xff0c;输入字符串1234&#xff0c;输出10. 1 def sums1(): #第一题 2 strsinput(请输入一个自然数字符串&#xff1a;)3 num04 for i inrange(0,len(strs)):5 …

怎样获取java枚举的名称_如何从Java中的字符串值获得枚举值?

假设我有一个枚举public enum Blah {A, B, C, D}我想找到一个字符串的枚举值&#xff0c;例如"A"&#xff0c;它是Blah.A。怎么可能做到这一点&#xff1f;我需要的方法是Enum.valueOf()吗&#xff1f;如果是的话&#xff0c;我怎么用这个&#xff1f;是的&#xff0…

ADO.NET数据集添加虚拟字段

在使用DataSet的时候&#xff0c;经常会根据遇到一些外键列。我们需要根据一些外键关联对结果集进行补充字段&#xff0c;我们习惯使用的sql语句如下&#xff1a; SELECT PurchaseID, UserName, OrderItemID, PaymentMethod, Quantity, Price, TransactionID, Notes, Cr…

ffmpeg检测文件是否损坏_教你一招如何检测硬盘,让你知道硬盘是否有损坏?还有几天寿命?...

8月底的南方小城镇依然非常炎热&#xff0c;临近下班&#xff0c;坐上我的敞篷座机-电动小毛驴&#xff0c;正准备开启兜风模式&#xff0c;美-女同-事小莉叫住了我&#xff0c;说她家里的电脑这几天老是蓝屏&#xff0c;让我去帮她看看。美-女有-约&#xff0c;怎么能忍心拒绝…

动态规划算法练习题

45. 跳跃游戏 II 中等 2K 相关企业 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说&#xff0c;如果你在 nums[i] 处&#xff0c;你可以跳转到任意 nums[i j] 处: 0 < j < nums[i] i j &…

Gridview应用技巧——如何为行添加事件

Gridview应用技巧——如何为行添加事件收藏 下面的代码实现了如何为Gridview添加鼠标经过、离开、单击、双击的事件 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { e.Row.Attributes.Add("BorderColor ", &…

python 画折线图_Python让你的数据生成可视化图形

ID&#xff1a;pk哥公众号&#xff1a;Python知识圈最近的技术分享被老板说了&#xff0c;分享内容不错&#xff0c;可是这些统计图差了点。作为一个做技术的&#xff0c;这是不能忍受的。因为 Python 除了不会生孩子&#xff0c;其他的都会。直接进入今天的正题&#xff0c;Ec…

selenium rc java_selenium笔记一--selenium RC+JAVA环境搭建

3.选择options—format&#xff0c;选择java /Junit4/remote control ,选择工作区中的source标签&#xff0c;即显示java脚本51Testing软件测试网5^,_{8Ke5o$~h.F#HY2H,H.lS,u(e0脚本如下&#xff0c;只需修改一下红色部分&#xff0c;即可在Eclipse里运行"w;\J6U9g,D[0pa…

如何清理不必要的事件日志分类

在我们的计算机上面&#xff0c;经常安装一些重要的软件的话&#xff0c;可能会在事件查看器中遗留一些东西。有些软件会创建自己的事件日志类型&#xff08;或者称为分类更合适&#xff09;&#xff0c;但可能在删除的时候忘记清理。如下面所示 那么如何才能清理掉他们呢&…

es6 数组合并_13个不low的JS数组操作,你需要知道一下

作者 | 火狼1来源 | https://juejin.im/post/5c92e385e51d450ce11df1d1前言本文主要从应用来讲数组api的一些骚操作&#xff1b;如一行代码扁平化n维数组、数组去重、求数组最大值、数组求和、排序、对象和数组的转化等&#xff1b;这些应用场景你可以用一行代码实现吗&#xf…

java控制cmd导出dmp文件_cmd的操作命令导出导入.dmp文件

1:G:\Oracle\product\10.1.0\Client_1\NETWORK\ADMIN目录下有个tnsname.ora文件&#xff0c;内容如下&#xff1a;hz_rmdb (DESCRIPTION (ADDRESS (PROTOCOL TCP)(HOST 19.109.113.36)(PORT 1521))(CONNECT_DATA (SERVER DEDICATED)(SERVICE_NAME rmdb)))其中&#xff1a…

web developer tips (1):创建、管理、应用样式表的强大工具

原文链接&#xff1a;Powerful CSS Tools to Create, Manage and Apply Styles Visual Studio 2008 包含了三个新的CSS样式工具窗口&#xff1a; 1、应用样式&#xff08;Apply Styles &#xff09; 2、管理样式&#xff08;Manage Styles&#xff09; 3、CSS属性&#xff08;C…

excel去重怎么操作_excel数据技巧:不用公式如何快速去重

编按&#xff1a;哈喽&#xff0c;大家好&#xff01;在我们平时处理数据的时候&#xff0c;经常会发现一些重复的数据&#xff0c;这不仅会降低我们的工作效率&#xff0c;还会影响我们后续对数据的分析。今天就为大家分享4种不借助公式就能在excel中删除重复值的方法&#xf…

java制作h5视频聊天_JAVA实现大华摄像头WEB方式实时显示视频,H5界面展示方式思路。...

JAVA实现大华摄像头WEB方式实时显示视频,H5界面展示方式思路。2018-09-17问题:大华IPC枪型摄像头需要在WEB中显示实时监控视频,官方提供的SDK只有C#的桌面程序访问方式。解决思路:RTSP协议访问方式将RTSP流转换成hls文件在H5的video播放器中进行播放实时视频。一、首先将摄像头…

python用电度数设计_无所不能的Python之配电设计自动化系统

诚如题目所言&#xff0c;本人结合Python程序设计与配电设计的互补性打算开发一个配电设计自动化系统&#xff0c;用来提高配电设计的工作效率。本人目前处在配电设计行业&#xff0c;已深耕多年&#xff0c;期间一直有学习Python&#xff0c;后来发现Python的很多库都能解决配…

Google Maps地图投影全解析

原文出处&#xff1a;http://www.cnblogs.com/LionGG/archive/2009/04/20/1439905.html Google Maps、Virtual Earth等网络地理所使用的地图投影&#xff0c;常被称作Web Mercator或Spherical Mercator&#xff0c;它与常规墨卡托投影的主要区别就是把地球模拟为球体而非椭球体…

java内存模型 创建类_JVM内存模型及String对象内存分配

昨天看了一篇关于《Java后端程序员1年工作经验总结》的文章&#xff0c;其中有一段关于String和StringBuffer的描述&#xff0c;对于执行结果仍然把握不准&#xff0c;趁此机会也总结了下JVM内存模型。1、JVM运行时数据区域关于JVM内存模型之前也了解过一些&#xff0c;也是看过…

微信小程序数据拼接_微信小程序 数据预拉取

数据预拉取预拉取能够在小程序冷启动的时候通过微信后台提前向第三方服务器拉取业务数据&#xff0c;当代码包加载完时可以更快地渲染页面&#xff0c;减少用户等待时间&#xff0c;从而提升小程序的打开速度 。使用流程1. 配置数据下载地址登录小程序 MP 管理后台&#xff0c;…

给ULWOW 写的广告效果(缓动切换)

应 幽狼魔兽 站长所托&#xff0c;写了一个 广告切换效果&#xff08;点击查看DEMO&#xff09; 形式是常见的形式&#xff0c;但是在功能上有一定的拓展。 主要功能&#xff1a; 1&#xff0c;自动检测广告图片个数 生产广告序列 2&#xff0c;缓动切换&#xff0c;仿原版FLA…