[
https://issues.apache.org/jira/browse/AMQ-6598?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Dominik Maier closed AMQ-6598.
------------------------------
Resolution: Fixed
> SQLException when moving messages to DLQ
> ----------------------------------------
>
> Key: AMQ-6598
> URL: https://issues.apache.org/jira/browse/AMQ-6598
> Project: ActiveMQ
> Issue Type: Bug
> Components: JDBC
> Affects Versions: 5.12.0, 5.14.3
> Reporter: Dominik Maier
> Priority: Minor
>
> ActiveMQ raises a SQLException when moving messages from two or more queues
> to the configured dead-letter-queue. It only happens with two or more queues
> and multiple messages. The exception is logged on level WARN and it seems
> that no messages are lost. First affected version is 5.12.0, but also happens
> with the current version 5.14.3.
> {code}
> java.io.IOException: Failed to broker message:
> ID:server-amq-46753-1486658241250-4:5:3:1:13 in container:
> java.sql.SQLException: org.apache.commons.dbcp2.DelegatingPreparedStatement
> with address: "NULL" is closed.
> at
> org.apache.activemq.util.IOExceptionSupport.create(IOExceptionSupport.java:34)
> ~[activemq-client-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.store.jdbc.JDBCMessageStore.addMessage(JDBCMessageStore.java:163)
> ~[activemq-jdbc-store-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.store.memory.MemoryTransactionStore.addMessage(MemoryTransactionStore.java:352)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.store.memory.MemoryTransactionStore$1.asyncAddQueueMessage(MemoryTransactionStore.java:159)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.region.Queue.doMessageSend(Queue.java:837)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at org.apache.activemq.broker.region.Queue.send(Queue.java:727)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.region.AbstractRegion.send(AbstractRegion.java:503)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.region.RegionBroker.send(RegionBroker.java:468)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.jmx.ManagedRegionBroker.send(ManagedRegionBroker.java:293)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.BrokerFilter.send(BrokerFilter.java:153)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.scheduler.SchedulerBroker.send(SchedulerBroker.java:195)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.CompositeDestinationBroker.send(CompositeDestinationBroker.java:96)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.TransactionBroker.send(TransactionBroker.java:293)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.MutableBrokerFilter.send(MutableBrokerFilter.java:158)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.util.LoggingBrokerPlugin.send(LoggingBrokerPlugin.java:275)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.MutableBrokerFilter.send(MutableBrokerFilter.java:158)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.util.BrokerSupport.doResend(BrokerSupport.java:69)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.util.BrokerSupport.resendNoCopy(BrokerSupport.java:38)
> ~[activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.region.RegionBroker.sendToDeadLetterQueue(RegionBroker.java:799)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.BrokerFilter.sendToDeadLetterQueue(BrokerFilter.java:319)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.BrokerFilter.sendToDeadLetterQueue(BrokerFilter.java:319)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.BrokerFilter.sendToDeadLetterQueue(BrokerFilter.java:319)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.MutableBrokerFilter.sendToDeadLetterQueue(MutableBrokerFilter.java:331)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.util.LoggingBrokerPlugin.sendToDeadLetterQueue(LoggingBrokerPlugin.java:505)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.MutableBrokerFilter.sendToDeadLetterQueue(MutableBrokerFilter.java:331)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.region.PrefetchSubscription.sendToDLQ(PrefetchSubscription.java:535)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.region.PrefetchSubscription.acknowledge(PrefetchSubscription.java:394)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.region.AbstractRegion.acknowledge(AbstractRegion.java:526)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.region.RegionBroker.acknowledge(RegionBroker.java:484)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.BrokerFilter.acknowledge(BrokerFilter.java:88)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.BrokerFilter.acknowledge(BrokerFilter.java:88)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.TransactionBroker.acknowledge(TransactionBroker.java:276)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.MutableBrokerFilter.acknowledge(MutableBrokerFilter.java:98)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.util.LoggingBrokerPlugin.acknowledge(LoggingBrokerPlugin.java:162)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.MutableBrokerFilter.acknowledge(MutableBrokerFilter.java:98)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.TransportConnection.processMessageAck(TransportConnection.java:590)
> [activemq-broker-5.14.3.jar:5.14.3]
> at org.apache.activemq.command.MessageAck.visit(MessageAck.java:245)
> [activemq-client-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.TransportConnection.service(TransportConnection.java:336)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.broker.TransportConnection$1.onCommand(TransportConnection.java:200)
> [activemq-broker-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.transport.MutexTransport.onCommand(MutexTransport.java:50)
> [activemq-client-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.transport.WireFormatNegotiator.onCommand(WireFormatNegotiator.java:125)
> [activemq-client-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.transport.AbstractInactivityMonitor.onCommand(AbstractInactivityMonitor.java:301)
> [activemq-client-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83)
> [activemq-client-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:233)
> [activemq-client-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:215)
> [activemq-client-5.14.3.jar:5.14.3]
> at java.lang.Thread.run(Thread.java:745) [?:1.8.0_121]
> Caused by: java.sql.SQLException:
> org.apache.commons.dbcp2.DelegatingPreparedStatement with address: "NULL" is
> closed.
> at
> org.apache.commons.dbcp2.DelegatingStatement.checkOpen(DelegatingStatement.java:122)
> ~[commons-dbcp2-2.1.1.jar:2.1.1]
> at
> org.apache.commons.dbcp2.DelegatingPreparedStatement.setString(DelegatingPreparedStatement.java:143)
> ~[commons-dbcp2-2.1.1.jar:2.1.1]
> at
> org.apache.activemq.store.jdbc.adapter.DefaultJDBCAdapter.doAddMessage(DefaultJDBCAdapter.java:233)
> ~[activemq-jdbc-store-5.14.3.jar:5.14.3]
> at
> org.apache.activemq.store.jdbc.JDBCMessageStore.addMessage(JDBCMessageStore.java:159)
> ~[activemq-jdbc-store-5.14.3.jar:5.14.3]
> ... 44 more
> {code}
> h5. Setup to reproduce:
> Configure jdbcPersistenceAdapter with a MySQL datasource and a
> individualDeadLetterStrategy:
> {code}
> ...
> <policyEntry queue=">">
> <deadLetterStrategy>
> <individualDeadLetterStrategy queuePrefix="DLQ."
> useQueueForQueueMessages="true"/>
> </deadLetterStrategy>
> </policyEntry>
> ...
> <persistenceAdapter>
> <jdbcPersistenceAdapter dataDirectory="${activemq.data}" cleanupPeriod="0"
> dataSource="#mysql-ds"/>
> </persistenceAdapter>
> ...
> <bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource"
> destroy-method="close">
> <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
> <property name="url"
> value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
> <property name="username" value="user"/>
> <property name="password" value="password"/>
> <property name="poolPreparedStatements" value="true"/>
> </bean>
> ...
> {code}
> Setup two consumers and producers for two different queues, e.g test.queue.1
> and test.queue.2
> The consumers should have no client-side redelivery and directly throw an
> exception when consuming the message to trigger the DLQ mechanism on the
> broker.
> Send around 1000 messages with each producer in a loop.
> After a few seconds you see the above mentioned SQLException in the
> ActiveMQ.log on level WARN.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)