This is an automated email from the ASF dual-hosted git repository.
clebertsuconic pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/activemq-artemis.git
The following commit(s) were added to refs/heads/main by this push:
new c858323f07 ARTEMIS-4520 JMSContext.acknowledge() doesn't work if last
message received is null
c858323f07 is described below
commit c858323f07a1133c3c3590c2030da3f6ef9427c5
Author: Justin Bertram <[email protected]>
AuthorDate: Thu Nov 30 11:39:22 2023 -0600
ARTEMIS-4520 JMSContext.acknowledge() doesn't work if last message received
is null
---
.../artemis/jms/client/ActiveMQJMSConsumer.java | 14 +++----
.../artemis/jms/client/ActiveMQJMSContext.java | 4 +-
.../integration/jms/jms2client/JmsContextTest.java | 44 ++++++++++++++++++++++
3 files changed, 53 insertions(+), 9 deletions(-)
diff --git
a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQJMSConsumer.java
b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQJMSConsumer.java
index e359f5b575..1e50bef053 100644
---
a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQJMSConsumer.java
+++
b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQJMSConsumer.java
@@ -63,7 +63,7 @@ public class ActiveMQJMSConsumer implements JMSConsumer {
@Override
public Message receive() {
try {
- return context.setLastMessage(this, consumer.receive());
+ return context.setLastMessage(consumer.receive());
} catch (JMSException e) {
throw JmsExceptionUtils.convertToRuntimeException(e);
}
@@ -72,7 +72,7 @@ public class ActiveMQJMSConsumer implements JMSConsumer {
@Override
public Message receive(long timeout) {
try {
- return context.setLastMessage(this, consumer.receive(timeout));
+ return context.setLastMessage(consumer.receive(timeout));
} catch (JMSException e) {
throw JmsExceptionUtils.convertToRuntimeException(e);
}
@@ -81,7 +81,7 @@ public class ActiveMQJMSConsumer implements JMSConsumer {
@Override
public Message receiveNoWait() {
try {
- return context.setLastMessage(this, consumer.receiveNoWait());
+ return context.setLastMessage(consumer.receiveNoWait());
} catch (JMSException e) {
throw JmsExceptionUtils.convertToRuntimeException(e);
}
@@ -100,7 +100,7 @@ public class ActiveMQJMSConsumer implements JMSConsumer {
public <T> T receiveBody(Class<T> c) {
try {
Message message = consumer.receive();
- context.setLastMessage(ActiveMQJMSConsumer.this, message);
+ context.setLastMessage(message);
return message == null ? null : message.getBody(c);
} catch (JMSException e) {
throw JmsExceptionUtils.convertToRuntimeException(e);
@@ -111,7 +111,7 @@ public class ActiveMQJMSConsumer implements JMSConsumer {
public <T> T receiveBody(Class<T> c, long timeout) {
try {
Message message = consumer.receive(timeout);
- context.setLastMessage(ActiveMQJMSConsumer.this, message);
+ context.setLastMessage(message);
return message == null ? null : message.getBody(c);
} catch (JMSException e) {
throw JmsExceptionUtils.convertToRuntimeException(e);
@@ -122,7 +122,7 @@ public class ActiveMQJMSConsumer implements JMSConsumer {
public <T> T receiveBodyNoWait(Class<T> c) {
try {
Message message = consumer.receiveNoWait();
- context.setLastMessage(ActiveMQJMSConsumer.this, message);
+ context.setLastMessage(message);
return message == null ? null : message.getBody(c);
} catch (JMSException e) {
throw JmsExceptionUtils.convertToRuntimeException(e);
@@ -139,7 +139,7 @@ public class ActiveMQJMSConsumer implements JMSConsumer {
@Override
public void onMessage(Message message) {
- context.setLastMessage(ActiveMQJMSConsumer.this, message);
+ context.setLastMessage(message);
context.getThreadAwareContext().setCurrentThread(false);
try {
diff --git
a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQJMSContext.java
b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQJMSContext.java
index ae3ab5d75e..9f13e077ae 100644
---
a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQJMSContext.java
+++
b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQJMSContext.java
@@ -582,8 +582,8 @@ public class ActiveMQJMSContext implements JMSContext {
/**
* this is to ensure Context.acknowledge would work on ClientACK
*/
- Message setLastMessage(final JMSConsumer consumer, final Message
lastMessageReceived) {
- if (sessionMode == CLIENT_ACKNOWLEDGE) {
+ Message setLastMessage(final Message lastMessageReceived) {
+ if (sessionMode == CLIENT_ACKNOWLEDGE && lastMessageReceived != null) {
lastMessagesWaitingAck = lastMessageReceived;
}
return lastMessageReceived;
diff --git
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/jms2client/JmsContextTest.java
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/jms2client/JmsContextTest.java
index 0e77f07e99..c557b33699 100644
---
a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/jms2client/JmsContextTest.java
+++
b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/jms/jms2client/JmsContextTest.java
@@ -511,6 +511,50 @@ public class JmsContextTest extends JMSTestBase {
}
}
+ @Test
+ public void receiveNullAckTest() throws Exception {
+ // Create JMSContext with CLIENT_ACKNOWLEDGE
+
+ try (JMSContext context =
cf.createContext(JMSContext.CLIENT_ACKNOWLEDGE)) {
+ int numMessages = 10;
+
+ TextMessage textMessage = null;
+
+ // Create JMSConsumer from JMSContext
+ JMSConsumer consumer = context.createConsumer(queue1);
+
+ // Create JMSProducer from JMSContext
+ JMSProducer producer = context.createProducer();
+
+ // send messages
+ for (int i = 0; i < numMessages; i++) {
+ String message = "text message " + i;
+ textMessage = context.createTextMessage(message);
+ textMessage.setStringProperty("COM_SUN_JMS_TESTNAME",
"recoverAckTest" + i);
+ producer.send(queue1, textMessage);
+ }
+
+ // receive messages but do not acknowledge
+ for (int i = 0; i < numMessages; i++) {
+ textMessage = (TextMessage) consumer.receive(5000);
+ assertNotNull(textMessage);
+ }
+
+ assertNull(consumer.receiveNoWait());
+
+ // Acknowledge all messages
+ context.acknowledge();
+ }
+
+ // doing this check with another context / consumer to make sure it was
acked.
+ try (JMSContext context =
cf.createContext(JMSContext.CLIENT_ACKNOWLEDGE)) {
+ // Create JMSConsumer from JMSContext
+ JMSConsumer consumer = context.createConsumer(queue1);
+
+ assertNull(consumer.receiveNoWait());
+ }
+ }
+
@Test
public void bytesMessage() throws Exception {
context = cf.createContext();