HornetQ Persistence 没有删除文件

Posted

技术标签:

【中文标题】HornetQ Persistence 没有删除文件【英文标题】:HornetQ Persistence is not removing files 【发布时间】:2018-05-25 05:47:09 【问题描述】:

在我的应用程序中,我注意到 HornetQ 2.4.1 一直在堆积消息日志文件(有时达到数千个)。我正在通过 JMS 队列使用 HornetQ,而我们正在使用 Wildfly 8.2。通常,在启动服务器实例时,HornetQ 会有 3 个消息日志和一个锁定文件。

消息日志文件堆积导致重启服务器时出现问题,我们会看到一条日志指出:

HQ221014: 54% loaded

删除文件时,服务器加载正常。我做了一些实验,这些文件中的消息似乎已经被处理过了,但我不确定为什么它们会随着时间的推移继续堆积。

编辑 1:我发现 this link 表明我们没有确认消息。但是,当我们像 connection.createSession(false,Session.AUTO_ACKNOWLEDGE); 这样创建会话时。

我会继续寻找解决方案。

【问题讨论】:

您使用的是 XA 事务还是 JMS 事务?以及如何在standalone.xml 中定义资源适配器? 我正在使用 XA 事务。稍后我会得到更多关于资源适配器的信息。 如果您使用 XA 事务,那么您对上面的会话执行什么操作并不重要。提交 XA 事务时,应确认这些消息。我不了解 HornetQ,但总的来说,这是一个很多产品都存在问题的领域。 我发现有很多处于“SCHEDULE_CANCEL”状态的交易。我有一种交易太多的感觉。当 ARJUNA 试图取消它们时,它一次只能通过一个,直到死神元素楔入并且无法继续前进。我将尝试更改数据库隔离级别,看看是否能解决我们的问题。 【参考方案1】:

我发现这是由调用afterDelivery() 方法失败引起的(出于某种原因,我目前认为它与服务器负载或网络挂起有关)。我通过不经常打那个队列来解决这个问题。它并不优雅,但它符合我的目的。

查看我在日志中找到的以下 HornetQ 消息:

HQ152006: Unable to call after delivery
javax.transaction.RollbackException: ARJUNA016053: Could not commit transaction. at org.jboss.as.ejb3.inflow.MessageEndpointInvocationHandler.afterDelivery(MessageEndpointInvocationHandler.java:87)

HQ222144: Queue could not finish waiting executors. Try increasing the thread pool size

HQ222172: Queue jms.queue.myQueue was busy for more than 10,000 milliseconds. There are possibly consumers hanging on a network operation

【讨论】:

以上是关于HornetQ Persistence 没有删除文件的主要内容,如果未能解决你的问题,请参考以下文章

Java HornetQ 客户端中的线程处理

Python 客户端产生和使用 JMS 消息(HornetQ)

将现有 JNDI HornetQ 服务设为 HA 的步骤?

JMS-bridge 配置不共享两个 hornetQ 服务器上的负载

javax.persistence.EntityNotFoundException:已删除的实体传递给持久化

具有两个数据源的 Spring Boot Batch 导致 javax.persistence.TransactionRequiredException:执行更新/删除查询