Skip to content

Commit e481891

Browse files
garyrussellartembilan
authored andcommitted
GH-1347: DMLC Ignored Authentication Failures
Resolves #1347 Container starts and keeps trying to connect instead of honoring the property. **cherry-pick to 2.2.x** # Conflicts: # spring-rabbit/src/test/java/org/springframework/amqp/rabbit/listener/DirectMessageListenerContainerIntegrationTests.java # src/reference/asciidoc/amqp.adoc
1 parent 38d07c1 commit e481891

File tree

4 files changed

+44
-5
lines changed

4 files changed

+44
-5
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
@@ -997,10 +997,14 @@ protected boolean isMismatchedQueuesFatal() {
997997

998998

999999
public void setPossibleAuthenticationFailureFatal(boolean possibleAuthenticationFailureFatal) {
1000-
this.possibleAuthenticationFailureFatal = possibleAuthenticationFailureFatal;
1000+
doSetPossibleAuthenticationFailureFatal(possibleAuthenticationFailureFatal);
10011001
this.possibleAuthenticationFailureFatalSet = true;
10021002
}
10031003

1004+
protected final void doSetPossibleAuthenticationFailureFatal(boolean possibleAuthenticationFailureFatal) {
1005+
this.possibleAuthenticationFailureFatal = possibleAuthenticationFailureFatal;
1006+
}
1007+
10041008
public boolean isPossibleAuthenticationFailureFatal() {
10051009
return this.possibleAuthenticationFailureFatal;
10061010
}

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

Lines changed: 19 additions & 2 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
/**
@@ -418,6 +421,22 @@ protected void actualStart() {
418421
super.doStart();
419422
final String[] queueNames = getQueueNames();
420423
checkMissingQueues(queueNames);
424+
if (isPossibleAuthenticationFailureFatal()) {
425+
Connection connection = null;
426+
try {
427+
getConnectionFactory().createConnection();
428+
}
429+
catch (AmqpAuthenticationException ex) {
430+
throw ex;
431+
}
432+
catch (Exception ex) { // NOSONAR
433+
}
434+
finally {
435+
if (connection != null) {
436+
connection.close();
437+
}
438+
}
439+
}
421440
long idleEventInterval = getIdleEventInterval();
422441
if (this.taskScheduler == null) {
423442
afterPropertiesSet();
@@ -434,9 +453,7 @@ protected void actualStart() {
434453
if (queueNames.length > 0) {
435454
doRedeclareElementsIfNecessary();
436455
getTaskExecutor().execute(() -> { // NOSONAR never null here
437-
438456
startConsumers(queueNames);
439-
440457
});
441458
}
442459
else {

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
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;
21+
import static org.awaitility.Awaitility.await;
2022
import static org.mockito.ArgumentMatchers.anyBoolean;
2123
import static org.mockito.ArgumentMatchers.anyMap;
2224
import static org.mockito.ArgumentMatchers.anyString;
@@ -45,6 +47,7 @@
4547
import org.junit.jupiter.api.TestInfo;
4648
import org.mockito.ArgumentCaptor;
4749

50+
import org.springframework.amqp.AmqpAuthenticationException;
4851
import org.springframework.amqp.core.Queue;
4952
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
5053
import org.springframework.amqp.rabbit.connection.Connection;
@@ -126,6 +129,15 @@ public void captureTestName(TestInfo info) {
126129
this.testName = info.getDisplayName();
127130
}
128131

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

src/reference/asciidoc/amqp.adoc

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5668,11 +5668,17 @@ a| image::images/tickmark.png[]
56685668
FailureFatal
56695669
(possible-authentication-failure-fatal)
56705670

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

56745674
Since _version 2.0_.
56755675

5676+
**DirectMessageListenerContainer**
5677+
5678+
When set to `false` (default), each consumer will attempt to reconnect according to the `monitorInterval`.
5679+
5680+
**SimpleMessageListenerContainer**
5681+
56765682
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.
56775683
The container will attempt to recover according to the `recoveryInterval` property.
56785684
During each recovery attempt, each consumer will again try 4 times to start.

0 commit comments

Comments
 (0)