Skip to content

Commit eb85078

Browse files
garyrussellartembilan
authored andcommitted
GH-1038: RT: Fix evaluatedFastReplyTo
Fixes #1038 Don't set `evaluatedFastReplyTo` if we didn't actually evaluate it because the broker is down on the first request. **cherry-pick to all 2.x; backport to 1.7.x**
1 parent f9f6976 commit eb85078

File tree

2 files changed

+20
-3
lines changed

2 files changed

+20
-3
lines changed

spring-rabbit/src/main/java/org/springframework/amqp/rabbit/core/RabbitTemplate.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.util.concurrent.TimeoutException;
3737
import java.util.concurrent.atomic.AtomicInteger;
3838

39+
import org.springframework.amqp.AmqpConnectException;
3940
import org.springframework.amqp.AmqpException;
4041
import org.springframework.amqp.AmqpIllegalStateException;
4142
import org.springframework.amqp.AmqpRejectAndDontRequeueException;
@@ -945,11 +946,13 @@ protected boolean useDirectReplyTo() {
945946
}
946947
if (this.replyAddress == null || Address.AMQ_RABBITMQ_REPLY_TO.equals(this.replyAddress)) {
947948
try {
948-
execute(channel -> {
949+
return execute(channel -> {
949950
channel.queueDeclarePassive(Address.AMQ_RABBITMQ_REPLY_TO);
950-
return null;
951+
return true;
951952
});
952-
return true;
953+
}
954+
catch (AmqpConnectException ex) {
955+
throw ex;
953956
}
954957
catch (Exception e) {
955958
if (logger.isDebugEnabled()) {

spring-rabbit/src/test/java/org/springframework/amqp/rabbit/core/RabbitTemplateTests.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import static org.assertj.core.api.Assertions.assertThat;
2020
import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
21+
import static org.assertj.core.api.Assertions.assertThatThrownBy;
2122
import static org.assertj.core.api.Assertions.fail;
2223
import static org.mockito.ArgumentMatchers.any;
2324
import static org.mockito.ArgumentMatchers.anyBoolean;
@@ -27,6 +28,7 @@
2728
import static org.mockito.BDDMockito.given;
2829
import static org.mockito.BDDMockito.willAnswer;
2930
import static org.mockito.BDDMockito.willReturn;
31+
import static org.mockito.BDDMockito.willThrow;
3032
import static org.mockito.Mockito.mock;
3133
import static org.mockito.Mockito.times;
3234
import static org.mockito.Mockito.verify;
@@ -47,6 +49,7 @@
4749
import org.mockito.Mockito;
4850

4951
import org.springframework.amqp.AmqpAuthenticationException;
52+
import org.springframework.amqp.AmqpConnectException;
5053
import org.springframework.amqp.AmqpException;
5154
import org.springframework.amqp.core.Address;
5255
import org.springframework.amqp.core.Message;
@@ -62,6 +65,7 @@
6265
import org.springframework.amqp.rabbit.connection.SingleConnectionFactory;
6366
import org.springframework.amqp.support.converter.SimpleMessageConverter;
6467
import org.springframework.amqp.utils.SerializationUtils;
68+
import org.springframework.amqp.utils.test.TestUtils;
6569
import org.springframework.context.ApplicationContext;
6670
import org.springframework.expression.Expression;
6771
import org.springframework.expression.spel.standard.SpelExpressionParser;
@@ -227,6 +231,16 @@ public void testRetry() throws Exception {
227231
assertThat(count.get()).isEqualTo(3);
228232
}
229233

234+
@Test
235+
public void testEvaluateDirectReplyToWithConnectException() throws Exception {
236+
org.springframework.amqp.rabbit.connection.ConnectionFactory mockConnectionFactory =
237+
mock(org.springframework.amqp.rabbit.connection.ConnectionFactory.class);
238+
willThrow(new AmqpConnectException(null)).given(mockConnectionFactory).createConnection();
239+
RabbitTemplate template = new RabbitTemplate(mockConnectionFactory);
240+
assertThatThrownBy(() -> template.convertSendAndReceive("foo")).isInstanceOf(AmqpConnectException.class);
241+
assertThat(TestUtils.getPropertyValue(template, "evaluatedFastReplyTo", Boolean.class)).isFalse();
242+
}
243+
230244
@Test
231245
public void testRecovery() throws Exception {
232246
ConnectionFactory mockConnectionFactory = mock(ConnectionFactory.class);

0 commit comments

Comments
 (0)