现象:
8月13日同事在测试session-clean-task工具时,发现工具起动后跑着跑着就不跑了,具体情况为:
1)分配callid的任务还在跑
2)从队列中获取callid并处理会话的线程不跑了
处理过程:
1)因没有异常日志,所以怀疑是redis堵了
操作:
在从redis队列OnlineSessions_HandingList中获取数据时,如果callid为null,则打日志
结果:
重启工具后未见取出的callid为null的日志
2)因工具的代码中每一个方法、while循环内部都作了try catch异常捕获,不至于这个都会有问题吧(即使有,至少目前没碰到过)
另外看了看application.properties的配置,发现redis.timeout=60超时时间太短,于是改成了2000ms
重启工具后,咦好像正常了,可是跑着跑着又不动了
3)实在不行,开始加日志
操作:
在SessionCleanService类中每一个小的逻辑块加一个info日志: task + "---1" task + "----2" 这样的
结果:
每次线程停住时,都指示问题出现在记录数据库会话日志那块
确定是数据库操作卡住了,但是袁园过来说明 log_user_session 表中的数据量非常少
登陆数据库后发现确实如此
4)继续查找:
进入logservice.java文件中查看代码,发现在异常后只记录了数据库日志,没有文本日志打屏
而log_flow_engine_exception表中也没有日志,认为是logging-job没有部署,导致消息未转储所致
操作:
为了方便查看日志,就在异常时打了一个logger.error
结果:
确实记录数据库日志时存在异常,但是异常内容我再现网也见到过,但是现网是正常的啊:
但是这个异常日志一旦打出来就应该会返回一个false,然后继续往后走才对啊
5)接下来,把目光定位到了工具往mq里面写异常日志的代码了:
为了验证mq是否存在问题,先是检查了mq的链接串,发现有一个地址链接不上,但是理论上一个地址链接不上也不应该出问题啊
即便如此,还是把链接不上的地址给去掉了,再次重启,发现问题依旧
6)在往mq里面记录日志的前后也加了logger.info日志,发现确实在到了记录日志的代码后,后面的日志就再也没打出来了
7)查看mq的管理系统,发现累计的日志达到了200多W,然后就想,及时mq满了也不应该导致工具一直等在那吧
后来上网查看mq链接串中的参数说明,就发现端倪了:
maxReconnectAttempts为-1时,不限制重试次数,也就是说工具会等在那里知道异常信息塞进去!!!
后来点击了管理页面上mq队列的purge操作后,工具立即就开始运行了。。。
这个参数一定要改过来,比如重试三次,否则一旦mq满了或者出现问题,所有业务就中断了,以为所有流程引擎都会往mq写日志
其他业务组件也是
相关推荐
ActiveMQ(中文)参考手册 ActiveMQ(中文)参考手册 ActiveMQ(中文)参考手册 ActiveMQ(中文)参考手册
本压缩包“activeMQ收发工具.rar”包含了用于测试和操作ActiveMQ的实用工具,主要是一个jar包文件,方便用户在安装了Java Development Kit (JDK) 的环境中运行。 ActiveMQ收发工具的核心功能是通过Java应用程序发送...
2. **配置数据库**:在 `activemq.xml` 文件中配置数据库相关的参数,例如连接字符串、驱动类等。 ```xml <com.mysql.jdbc.jdbc2.optional.MysqlXADataSource url="jdbc:mysql://localhost:3306/...
在IT领域,集成Apache ActiveMQ与Spring框架是一个常见的任务,特别...这个demo对于理解如何在实际项目中使用ActiveMQ和Spring进行消息通信具有很高的参考价值,同时也为开发者提供了实践和学习这两个关键技术的起点。
Apache ActiveMQ是开源社区中最流行的Java消息代理,也是企业级消息中间件(Message Broker)的首选之一。在最新的稳定版5.15.0中,它提供了可靠的消息传递功能,适用于分布式应用程序之间的通信,实现了异步处理、...
在分布式系统中,消息队列(Message Queue)作为解耦组件和异步处理的重要工具,Apache ActiveMQ 是一款广泛使用的开源消息中间件。本篇主要围绕"ActiveMQ中Topic持久化Demo"进行深入探讨,旨在帮助读者理解如何在...
ActiveMQ中文手册是一个关于ActiveMQ的详细手册,旨在帮助开发者更好地理解和使用ActiveMQ。下面是从手册中提炼出的相关知识点: 1. JMS基本构件 * 连接工厂:客户用来创建连接的对象,例如ActiveMQ提供的...
在bin/activemq文件中,添加了多个配置项,包括jmxremote.port、rmi.port、password.file和access.file等。这些配置项的作用是: * jmxremote.port:设置jmx监控的端口号,默认为60001。 * rmi.port:设置RMI连接的...
当与Broker的连接中断时,它会按照配置的参数(如initialReconnectDelay和maxReconnectAttempts)进行重试,确保即使在Broker故障时也能恢复连接。 - NormalConnectionFactory使用了标准的TCP传输,适用于正常情况...
通过调整客户端连接URL中的预取策略参数 `jms.prefetchPolicy.all` 可以解决这个问题。例如,将其设置为较小的数值(如2),可以使得消息更加均匀地分配给各个消费者。这样,即使某个消费者处理较慢,也不会阻止其他...
在实际使用中,你可能需要根据你的需求修改`conf/activemq.xml`配置文件,设置如网络连接、安全策略、消息队列和主题等参数。同时,通过`bin`目录下的脚本启动和监控ActiveMQ服务,确保其正常运行。 此外,ActiveMQ...
- `conf`目录:存放配置文件,如`activemq.xml`,这是ActiveMQ的主要配置文件,用于设置各种参数和特性。 - `lib`目录:存放运行所需的库文件和依赖项。 - `data`目录:默认情况下,ActiveMQ会在这里存储持久化的...
在这个例子中,我们看到了一个名为bpf.mq的连接配置,其URL包含了连接参数,如主机地址、端口号、连接超时设置等。同时,配置文件还定义了用户名bpf.mq.userName和密码bpf.mq.password,这些参数用于客户端连接到...
在ActiveMQ中,接收消息通常通过创建一个JMS消费者来实现。消费者可以是Message Listener或Message Selector。Message Listener是一个实现了javax.jms.MessageListener接口的类,它定义了一个onMessage()方法,当...
updateURIsSupported 是一个布尔值,用于控制是否可以动态修改 broker URI,该参数仅在 ActiveMQ 5.4 及更高版本中生效。默认值为 true。 在 ActiveMQ 中,还有一个重要的概念,即消息过滤。消息过滤可以根据不同的...
在ActiveMQ中,消息模型主要包括两种:点对点(Point-to-Point)和发布/订阅(Publish/Subscribe)。点对点模型中,每个消息只有一个消费者,常用于工作队列;而发布/订阅模型则允许多个消费者订阅同一主题,消息会...
ActiveMQ客户端库是用于与ActiveMQ服务器交互的接口,允许开发者在他们的应用中发送和接收消息。这个压缩包包含的是Apache ActiveMQ 5.10.0版本,它是一个稳定且广泛使用的版本。 ActiveMQ客户端的核心概念: 1. *...
在ActiveMQ配置文件中,可以调整持久化存储的相关参数,例如日志类型、存储大小限制等,以确保高效且可靠的持久化。 **整合实例代码** 整合ActiveMQ和Tomcat的具体代码示例通常包括以下部分: - 创建...
在本篇《ActiveMQ实战——实现一个简易版的聊天室》中,我们将深入探讨如何利用Apache ActiveMQ构建一个简单的在线聊天应用。ActiveMQ是Apache软件基金会的一个开源项目,它是一款功能强大的消息中间件,用于在...