Skip to content

Commit 0b346dc

Browse files
committed
spring-projectsGH-1347: DMLC Ignored Authentication Failures
Resolves spring-projects#1347 Container starts and keeps trying to connect instead of honoring the property.
1 parent a31d143 commit 0b346dc

File tree

4 files changed

+43
-3
lines changed

4 files changed

+43
-3
lines changed

spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/AbstractMessageListenerContainer.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1001,10 +1001,14 @@ protected boolean isMismatchedQueuesFatal() {
10011001

10021002

10031003
public void setPossibleAuthenticationFailureFatal(boolean possibleAuthenticationFailureFatal) {
1004-
this.possibleAuthenticationFailureFatal = possibleAuthenticationFailureFatal;
1004+
doSetPossibleAuthenticationFailureFatal(possibleAuthenticationFailureFatal);
10051005
this.possibleAuthenticationFailureFatalSet = true;
10061006
}
10071007

1008+
protected final boolean doSetPossibleAuthenticationFailureFatal(boolean possibleAuthenticationFailureFatal) {
1009+
return this.possibleAuthenticationFailureFatal = possibleAuthenticationFailureFatal;
1010+
}
1011+
10081012
public boolean isPossibleAuthenticationFailureFatal() {
10091013
return this.possibleAuthenticationFailureFatal;
10101014
}

spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/DirectMessageListenerContainer.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
import org.apache.commons.logging.Log;
4242

4343
import org.springframework.amqp.AmqpApplicationContextClosedException;
44+
import org.springframework.amqp.AmqpAuthenticationException;
4445
import org.springframework.amqp.AmqpConnectException;
4546
import org.springframework.amqp.AmqpException;
4647
import org.springframework.amqp.AmqpIOException;
@@ -145,6 +146,7 @@ public class DirectMessageListenerContainer extends AbstractMessageListenerConta
145146
*/
146147
public DirectMessageListenerContainer() {
147148
setMissingQueuesFatal(false);
149+
doSetPossibleAuthenticationFailureFatal(false);
148150
}
149151

150152
/**
@@ -154,6 +156,7 @@ public DirectMessageListenerContainer() {
154156
public DirectMessageListenerContainer(ConnectionFactory connectionFactory) {
155157
setConnectionFactory(connectionFactory);
156158
setMissingQueuesFatal(false);
159+
doSetPossibleAuthenticationFailureFatal(false);
157160
}
158161

159162
/**
@@ -422,6 +425,22 @@ protected void actualStart() {
422425
super.doStart();
423426
final String[] queueNames = getQueueNames();
424427
checkMissingQueues(queueNames);
428+
if (isPossibleAuthenticationFailureFatal()) {
429+
Connection connection = null;
430+
try {
431+
getConnectionFactory().createConnection();
432+
}
433+
catch (AmqpAuthenticationException ex) {
434+
throw ex;
435+
}
436+
catch (Exception ex) { // NOSONAR
437+
}
438+
finally {
439+
if (connection != null) {
440+
connection.close();
441+
}
442+
}
443+
}
425444
long idleEventInterval = getIdleEventInterval();
426445
if (this.taskScheduler == null) {
427446
afterPropertiesSet();

spring-rabbit/src/test/java/org/springframework/amqp/rabbit/listener/DirectMessageListenerContainerIntegrationTests.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.springframework.amqp.rabbit.listener;
1818

1919
import static org.assertj.core.api.Assertions.assertThat;
20+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
2021
import static org.awaitility.Awaitility.await;
2122
import static org.mockito.ArgumentMatchers.anyBoolean;
2223
import static org.mockito.ArgumentMatchers.anyMap;
@@ -45,6 +46,7 @@
4546
import org.junit.jupiter.api.TestInfo;
4647
import org.mockito.ArgumentCaptor;
4748

49+
import org.springframework.amqp.AmqpAuthenticationException;
4850
import org.springframework.amqp.core.Queue;
4951
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
5052
import org.springframework.amqp.rabbit.connection.Connection;
@@ -126,6 +128,15 @@ public void captureTestName(TestInfo info) {
126128
this.testName = info.getDisplayName();
127129
}
128130

131+
@Test
132+
void authFailed() {
133+
CachingConnectionFactory cf = new CachingConnectionFactory("localhost");
134+
cf.setUsername("junk");
135+
DirectMessageListenerContainer dmlc = new DirectMessageListenerContainer(cf);
136+
dmlc.setPossibleAuthenticationFailureFatal(true);
137+
assertThatExceptionOfType(AmqpAuthenticationException.class).isThrownBy(() -> dmlc.start());
138+
}
139+
129140
@SuppressWarnings("unchecked")
130141
@Test
131142
public void testSimple() throws Exception {

src/reference/asciidoc/amqp.adoc

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6146,11 +6146,17 @@ FailureFatal
61466146
(possible-authentication-
61476147
failure-fatal)
61486148

6149-
a|When set to `true` (default), if a `PossibleAuthenticationFailureException` is thrown during connection, it is considered fatal.
6150-
This causes the application context to fail to initialize during startup.
6149+
a|When set to `true` (default for SMLC), if a `PossibleAuthenticationFailureException` is thrown during connection, it is considered fatal.
6150+
This causes the application context to fail to initialize during startup (if the container is configured with auto startup).
61516151

61526152
Since _version 2.0_.
61536153

6154+
**DirectMessageListenerContainer**
6155+
6156+
When set to `false` (default), each consumer will attempt to reconnect according to the `monitorInterval`.
6157+
6158+
**SimpleMessageListenerContainer**
6159+
61546160
When set to `false`, after making the 3 retries, the container will go into recovery mode, as with other problems, such as the broker being down.
61556161
The container will attempt to recover according to the `recoveryInterval` property.
61566162
During each recovery attempt, each consumer will again try 4 times to start.

0 commit comments

Comments
 (0)