[ https://issues.apache.org/jira/browse/ARTEMIS-5418?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Justin Bertram closed ARTEMIS-5418. ----------------------------------- Assignee: Justin Bertram > Scheduled messages cannot be rolled back > ---------------------------------------- > > Key: ARTEMIS-5418 > URL: https://issues.apache.org/jira/browse/ARTEMIS-5418 > Project: ActiveMQ Artemis > Issue Type: Bug > Components: Broker > Affects Versions: 2.33.0 > Reporter: Frank Schwarz > Assignee: Justin Bertram > Priority: Major > Fix For: 2.40.0 > > > We are seeing NullPointerExceptions in the Artemis broker when rolling back > messages with a scheduled delivery time. > For the exception to occure reliably {{ConsumerWindowSize}} must be set to > {{{}0{}}}. > The exception occurs when a message with a scheduled delivery time is rolled > back while at the same moment a new message without delivery time is > committed to the queue. > As a consequence, the rolled back message disappears. It is still visible for > the queue message counter but will not be redelivered until you restart the > Artemis broker. > {noformat} > 2025-04-10 16:04:58,032 WARN > [org.apache.activemq.artemis.utils.actors.OrderedExecutor] null > java.lang.NullPointerException: null > at > org.apache.activemq.artemis.core.server.impl.MessageReferenceImpl$MessageReferenceComparatorSequence.compare(MessageReferenceImpl.java:50) > ~[artemis-server-2.33.0.jar:2.33.0] > at > org.apache.activemq.artemis.core.server.impl.MessageReferenceImpl$MessageReferenceComparatorSequence.compare(MessageReferenceImpl.java:42) > ~[artemis-server-2.33.0.jar:2.33.0] > at > org.apache.activemq.artemis.utils.collections.LinkedListImpl.scanLeft(LinkedListImpl.java:286) > ~[artemis-commons-2.33.0.jar:2.33.0] > at > org.apache.activemq.artemis.utils.collections.LinkedListImpl.addSorted(LinkedListImpl.java:248) > ~[artemis-commons-2.33.0.jar:2.33.0] > at > org.apache.activemq.artemis.utils.collections.PriorityLinkedListImpl.addSorted(PriorityLinkedListImpl.java:93) > ~[artemis-commons-2.33.0.jar:2.33.0] > at > org.apache.activemq.artemis.core.server.impl.QueueImpl.internalAddSorted(QueueImpl.java:3065) > ~[artemis-server-2.33.0.jar:2.33.0] > at > org.apache.activemq.artemis.core.server.impl.QueueImpl.addSorted(QueueImpl.java:1167) > ~[artemis-server-2.33.0.jar:2.33.0] > at > org.apache.activemq.artemis.core.server.impl.QueueImpl.addSorted(QueueImpl.java:1202) > ~[artemis-server-2.33.0.jar:2.33.0] > at > org.apache.activemq.artemis.core.server.impl.QueueImpl.postRollback(QueueImpl.java:4227) > ~[artemis-server-2.33.0.jar:2.33.0] > at > org.apache.activemq.artemis.core.server.impl.RefsOperation.afterRollback(RefsOperation.java:131) > ~[artemis-server-2.33.0.jar:2.33.0] > at > org.apache.activemq.artemis.core.transaction.impl.TransactionImpl.afterRollback(TransactionImpl.java:600) > ~[artemis-server-2.33.0.jar:2.33.0] > at > org.apache.activemq.artemis.core.transaction.impl.TransactionImpl$4.done(TransactionImpl.java:436) > ~[artemis-server-2.33.0.jar:2.33.0] > at > org.apache.activemq.artemis.core.persistence.impl.journal.OperationContextImpl$1.run(OperationContextImpl.java:320) > ~[artemis-server-2.33.0.jar:2.33.0] > at > org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:57) > ~[artemis-commons-2.33.0.jar:2.33.0] > at > org.apache.activemq.artemis.utils.actors.OrderedExecutor.doTask(OrderedExecutor.java:32) > ~[artemis-commons-2.33.0.jar:2.33.0] > at > org.apache.activemq.artemis.utils.actors.ProcessorBase.executePendingTasks(ProcessorBase.java:68) > ~[artemis-commons-2.33.0.jar:2.33.0] > at > java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) > [?:?] > at > java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) > [?:?] > at > org.apache.activemq.artemis.utils.ActiveMQThreadFactory$1.run(ActiveMQThreadFactory.java:118) > [artemis-commons-2.33.0.jar:2.33.0] > {noformat} > Here is the test case: > {code:java} > package org.apache.activemq.artemis.tests.integration.xa; > import java.util.HashMap; > import javax.transaction.xa.XAResource; > import javax.transaction.xa.Xid; > import org.apache.activemq.artemis.api.core.QueueConfiguration; > import org.apache.activemq.artemis.api.core.RoutingType; > import org.apache.activemq.artemis.api.core.SimpleString; > import org.apache.activemq.artemis.api.core.client.ClientConsumer; > import org.apache.activemq.artemis.api.core.client.ClientMessage; > import org.apache.activemq.artemis.api.core.client.ClientProducer; > import org.apache.activemq.artemis.api.core.client.ClientSession; > import org.apache.activemq.artemis.api.core.client.ClientSessionFactory; > import org.apache.activemq.artemis.api.core.client.ServerLocator; > import org.apache.activemq.artemis.core.server.ActiveMQServer; > import org.apache.activemq.artemis.core.settings.impl.AddressSettings; > import org.apache.activemq.artemis.tests.util.ActiveMQTestBase; > import org.junit.Before; > import org.junit.Test; > public class RollbackScheduledMessageTest extends ActiveMQTestBase { > private static final SimpleString ADDRESS = new > SimpleString("RollbackScheduledMessageTestq"); > private ActiveMQServer server; > private ServerLocator sharedLocator; > private ClientSessionFactory sharedSf; > @Override > @Before > public void setUp() throws Exception { > super.setUp(); > HashMap<String, AddressSettings> settings = new HashMap<>(); > server = createServer(true, createDefaultInVMConfig(), 10024, 200024, > settings); > server.start(); > server.createQueue(new > QueueConfiguration(ADDRESS).setRoutingType(RoutingType.ANYCAST)); > } > @Test > public void testRollbackScheduledMessage() throws Exception { > sharedLocator = createInVMNonHALocator(); > sharedLocator.setConsumerWindowSize(0); > sharedSf = createSessionFactory(sharedLocator); > ClientSession clientSession = > addClientSession(sharedSf.createSession(true, false, false)); > Xid xid = newXID(); > Xid xid2 = newXID(); > ClientProducer clientProducer = clientSession.createProducer(ADDRESS); > ClientMessage m1 = createTextMessage(clientSession, "m1"); > ClientMessage m2 = createTextMessage(clientSession, "m2"); > clientSession.start(xid, XAResource.TMNOFLAGS); > m1.setScheduledDeliveryTime(System.currentTimeMillis() + 100); > clientProducer.send(m1); > m2.setScheduledDeliveryTime(System.currentTimeMillis() + 100); > clientProducer.send(m2); > clientSession.end(xid, XAResource.TMSUCCESS); > clientSession.commit(xid, true); > Xid xidRec = newXID(); > ClientSession recSession = > addClientSession(sharedSf.createSession(true, false, false)); > recSession.start(); > recSession.start(xidRec, XAResource.TMNOFLAGS); > ClientConsumer clientConsumer = recSession.createConsumer(ADDRESS); > ClientMessage message = clientConsumer.receive(500); > assertNotNull(message); > // commit a new message while processing the first one > ClientMessage m3 = createTextMessage(clientSession, "m3"); > clientSession.start(xid2, XAResource.TMNOFLAGS); > clientProducer.send(m3); > clientSession.end(xid2, XAResource.TMSUCCESS); > clientSession.commit(xid2, true); > // rollback the scheduled message > recSession.end(xidRec, XAResource.TMFAIL); > // the rollback is not successful > recSession.rollback(xidRec); > } > } > {code} -- This message was sent by Atlassian Jira (v8.20.10#820010) --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@activemq.apache.org For additional commands, e-mail: issues-h...@activemq.apache.org For further information, visit: https://activemq.apache.org/contact