From 9b590a03115ba279fc27eb18d93fbe733e8c40c3 Mon Sep 17 00:00:00 2001 From: Vedran Pavic Date: Thu, 8 Jun 2023 16:11:43 +0200 Subject: [PATCH 1/2] Handle custom JMS acknowledgment modes as client acknowledge This commit updates JmsAccessor to handle custom JMS acknowledgment modes as client acknowledge, which is useful when working with JMS providers that provide non-standard variations of CLIENT_ACKNOWLEDGE, such as AWS SQS and its UNORDERED_ACKNOWLEDGE mode. --- .../org/springframework/jms/support/JmsAccessor.java | 7 +++++-- .../jms/support/JmsAccessorTests.java | 12 +++++++++++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/spring-jms/src/main/java/org/springframework/jms/support/JmsAccessor.java b/spring-jms/src/main/java/org/springframework/jms/support/JmsAccessor.java index 1eea33974449..a7a45c81d55d 100644 --- a/spring-jms/src/main/java/org/springframework/jms/support/JmsAccessor.java +++ b/spring-jms/src/main/java/org/springframework/jms/support/JmsAccessor.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -223,7 +223,10 @@ protected Session createSession(Connection con) throws JMSException { * @see jakarta.jms.Session#CLIENT_ACKNOWLEDGE */ protected boolean isClientAcknowledge(Session session) throws JMSException { - return (session.getAcknowledgeMode() == Session.CLIENT_ACKNOWLEDGE); + int mode = session.getAcknowledgeMode(); + return (mode != Session.SESSION_TRANSACTED && + mode != Session.AUTO_ACKNOWLEDGE && + mode != Session.DUPS_OK_ACKNOWLEDGE); } } diff --git a/spring-jms/src/test/java/org/springframework/jms/support/JmsAccessorTests.java b/spring-jms/src/test/java/org/springframework/jms/support/JmsAccessorTests.java index 1e2f4b667637..d3fb7edb5bd2 100644 --- a/spring-jms/src/test/java/org/springframework/jms/support/JmsAccessorTests.java +++ b/spring-jms/src/test/java/org/springframework/jms/support/JmsAccessorTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -21,12 +21,15 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.mock; /** * Unit tests for the {@link JmsAccessor} class. * * @author Rick Evans * @author Chris Beams + * @author Vedran Pavic */ public class JmsAccessorTests { @@ -59,6 +62,13 @@ public void testSetAcknowledgeModeNameChokesIfBadAckModeIsSupplied() throws Exce new StubJmsAccessor().setSessionAcknowledgeModeName("Tally ho chaps!")); } + @Test + void testCustomAcknowledgeModeIsConsideredClientAcknowledge() throws Exception { + Session session = mock(Session.class); + given(session.getAcknowledgeMode()).willReturn(100); + JmsAccessor accessor = new StubJmsAccessor(); + assertThat(accessor.isClientAcknowledge(session)).isTrue(); + } /** * Crummy, stub, do-nothing subclass of the JmsAccessor class for use in testing. From db2f1d63937c1f650302579c1df3e36ef363dcb0 Mon Sep 17 00:00:00 2001 From: Vedran Pavic Date: Thu, 8 Jun 2023 16:13:49 +0200 Subject: [PATCH 2/2] Polish JmsAccessorTests This commit reduces the visibility of JmsAccessorTests and its test methods to package-private and removes unnecessary throws declarations. --- .../springframework/jms/support/JmsAccessorTests.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spring-jms/src/test/java/org/springframework/jms/support/JmsAccessorTests.java b/spring-jms/src/test/java/org/springframework/jms/support/JmsAccessorTests.java index d3fb7edb5bd2..516fc8236582 100644 --- a/spring-jms/src/test/java/org/springframework/jms/support/JmsAccessorTests.java +++ b/spring-jms/src/test/java/org/springframework/jms/support/JmsAccessorTests.java @@ -31,17 +31,17 @@ * @author Chris Beams * @author Vedran Pavic */ -public class JmsAccessorTests { +class JmsAccessorTests { @Test - public void testChokesIfConnectionFactoryIsNotSupplied() throws Exception { + void testChokesIfConnectionFactoryIsNotSupplied() { JmsAccessor accessor = new StubJmsAccessor(); assertThatIllegalArgumentException().isThrownBy( accessor::afterPropertiesSet); } @Test - public void testSessionTransactedModeReallyDoesDefaultToFalse() throws Exception { + void testSessionTransactedModeReallyDoesDefaultToFalse() { JmsAccessor accessor = new StubJmsAccessor(); assertThat(accessor.isSessionTransacted()).as("The [sessionTransacted] property of JmsAccessor must default to " + "false. Change this test (and the attendant Javadoc) if you have " + @@ -49,7 +49,7 @@ public void testSessionTransactedModeReallyDoesDefaultToFalse() throws Exception } @Test - public void testAcknowledgeModeReallyDoesDefaultToAutoAcknowledge() throws Exception { + void testAcknowledgeModeReallyDoesDefaultToAutoAcknowledge() { JmsAccessor accessor = new StubJmsAccessor(); assertThat(accessor.getSessionAcknowledgeMode()).as("The [sessionAcknowledgeMode] property of JmsAccessor must default to " + "[Session.AUTO_ACKNOWLEDGE]. Change this test (and the attendant " + @@ -57,7 +57,7 @@ public void testAcknowledgeModeReallyDoesDefaultToAutoAcknowledge() throws Excep } @Test - public void testSetAcknowledgeModeNameChokesIfBadAckModeIsSupplied() throws Exception { + void testSetAcknowledgeModeNameChokesIfBadAckModeIsSupplied() { assertThatIllegalArgumentException().isThrownBy(() -> new StubJmsAccessor().setSessionAcknowledgeModeName("Tally ho chaps!")); }