metatech created AMQ-5659:
-----------------------------
Summary: Add safety measure against infinite loop when store
exception prevents message removal
Key: AMQ-5659
URL: https://issues.apache.org/jira/browse/AMQ-5659
Project: ActiveMQ
Issue Type: Improvement
Components: Broker
Affects Versions: 5.7.0
Environment: ServiceMix 4.5.3
Reporter: metatech
When the broker is configured with a database store, the "purge" operation
enters an infinite loop when the message removal operation fails, for instance
when the broker datasource is being restarted (see example stack trace below).
Here is a patch which adds a safety measure, in case the "dequeue" count of the
queue does not increase between 2 messages removal operations. The check is
not garanteed to detect the problem on the next iteration, because a business
consumer might also be dequeuing messages from the queue. But the "purge" is
probably much faster than the business consumer, so if it fails to remove 2
messages in a row, it is enough to detect the problem and abort the infinite
loop.
{code}
2015-03-05 15:38:30,353 | WARN | 14571659-2202099 | | JDBCPersistenceAdapter
| Could not get JDBC connection: Data source is closed
java.sql.SQLException: Data source is closed
at
org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1362)
at
org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044)
at
org.apache.activemq.store.jdbc.TransactionContext.getConnection(TransactionContext.java:58)
at
org.apache.activemq.store.jdbc.adapter.DefaultJDBCAdapter.getStoreSequenceId(DefaultJDBCAdapter.java:285)
at
org.apache.activemq.store.jdbc.JDBCPersistenceAdapter.getStoreSequenceIdForMessageId(JDBCPersistenceAdapter.java:787)
at
org.apache.activemq.store.jdbc.JDBCMessageStore.removeMessage(JDBCMessageStore.java:194)
at
org.apache.activemq.store.memory.MemoryTransactionStore.removeMessage(MemoryTransactionStore.java:358)
at
org.apache.activemq.store.memory.MemoryTransactionStore$1.removeAsyncMessage(MemoryTransactionStore.java:166)
at org.apache.activemq.broker.region.Queue.acknowledge(Queue.java:846)
at
org.apache.activemq.broker.region.Queue.removeMessage(Queue.java:1602)
at
org.apache.activemq.broker.region.Queue.removeMessage(Queue.java:1594)
at
org.apache.activemq.broker.region.Queue.removeMessage(Queue.java:1579)
at org.apache.activemq.broker.region.Queue.purge(Queue.java:1158)
at org.apache.activemq.broker.jmx.QueueView.purge(QueueView.java:54)
{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)