Skip to content

Commit 521d4f2

Browse files
committed
Remove flaky test in JMS observation
There is no way to consistently test this use case because listener container implementations have different behavior for unhandled errors and might retry or close the container altogether. See gh-32458
1 parent 039cbb3 commit 521d4f2

File tree

1 file changed

+4
-53
lines changed

1 file changed

+4
-53
lines changed

spring-jms/src/test/java/org/springframework/jms/listener/MessageListenerContainerObservationTests.java

+4-53
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@
2121
import java.util.concurrent.atomic.AtomicReference;
2222
import java.util.stream.Stream;
2323

24-
import io.micrometer.jakarta9.instrument.jms.JmsProcessObservationContext;
2524
import io.micrometer.observation.Observation;
26-
import io.micrometer.observation.ObservationHandler;
2725
import io.micrometer.observation.tck.TestObservationRegistry;
2826
import jakarta.jms.MessageListener;
2927
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
@@ -65,15 +63,15 @@ void setupServer() {
6563
@ParameterizedTest(name = "[{index}] {0}")
6664
@MethodSource("listenerContainers")
6765
void shouldRecordJmsProcessObservations(AbstractMessageListenerContainer listenerContainer) throws Exception {
68-
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
69-
jmsTemplate.convertAndSend("spring.test.observation", "message content");
7066
CountDownLatch latch = new CountDownLatch(1);
7167
listenerContainer.setConnectionFactory(connectionFactory);
7268
listenerContainer.setObservationRegistry(registry);
7369
listenerContainer.setDestinationName("spring.test.observation");
7470
listenerContainer.setMessageListener((MessageListener) message -> latch.countDown());
7571
listenerContainer.afterPropertiesSet();
7672
listenerContainer.start();
73+
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
74+
jmsTemplate.convertAndSend("spring.test.observation", "message content");
7775
latch.await(2, TimeUnit.SECONDS);
7876
assertThat(registry).hasObservationWithNameEqualTo("jms.message.process")
7977
.that()
@@ -86,8 +84,6 @@ void shouldRecordJmsProcessObservations(AbstractMessageListenerContainer listene
8684
@ParameterizedTest(name = "[{index}] {0}")
8785
@MethodSource("listenerContainers")
8886
void shouldHaveObservationScopeInErrorHandler(AbstractMessageListenerContainer listenerContainer) throws Exception {
89-
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
90-
jmsTemplate.convertAndSend("spring.test.observation", "message content");
9187
CountDownLatch latch = new CountDownLatch(1);
9288
AtomicReference<Observation> observationInErrorHandler = new AtomicReference<>();
9389
listenerContainer.setConnectionFactory(connectionFactory);
@@ -102,64 +98,19 @@ void shouldHaveObservationScopeInErrorHandler(AbstractMessageListenerContainer l
10298
});
10399
listenerContainer.afterPropertiesSet();
104100
listenerContainer.start();
105-
latch.await(2, TimeUnit.SECONDS);
106-
Assertions.assertThat(observationInErrorHandler.get()).isNotNull();
107-
assertThat(registry).hasObservationWithNameEqualTo("jms.message.process")
108-
.that()
109-
.hasHighCardinalityKeyValue("messaging.destination.name", "spring.test.observation")
110-
.hasLowCardinalityKeyValue("exception", "none");
111-
assertThat(registry).hasNumberOfObservationsEqualTo(1);
112-
listenerContainer.stop();
113-
listenerContainer.shutdown();
114-
}
115-
116-
@ParameterizedTest(name = "[{index}] {0}")
117-
@MethodSource("listenerContainers")
118-
void shouldHaveObservationErrorWhenRethrown(AbstractMessageListenerContainer listenerContainer) throws Exception {
119101
JmsTemplate jmsTemplate = new JmsTemplate(connectionFactory);
120102
jmsTemplate.convertAndSend("spring.test.observation", "message content");
121-
CountDownLatch latch = new CountDownLatch(1);
122-
registry.observationConfig().observationHandler(new ErrorHandlerObservationHandler(latch));
123-
listenerContainer.setConnectionFactory(connectionFactory);
124-
listenerContainer.setObservationRegistry(registry);
125-
listenerContainer.setDestinationName("spring.test.observation");
126-
listenerContainer.setMessageListener((MessageListener) message -> {
127-
throw new IllegalStateException("error");
128-
});
129-
listenerContainer.setErrorHandler(error -> {
130-
throw new IllegalStateException("not handled");
131-
});
132-
listenerContainer.afterPropertiesSet();
133-
listenerContainer.start();
134103
latch.await(2, TimeUnit.SECONDS);
104+
Assertions.assertThat(observationInErrorHandler.get()).isNotNull();
135105
assertThat(registry).hasObservationWithNameEqualTo("jms.message.process")
136106
.that()
137107
.hasHighCardinalityKeyValue("messaging.destination.name", "spring.test.observation")
138-
.hasLowCardinalityKeyValue("exception", "IllegalStateException");
108+
.hasLowCardinalityKeyValue("exception", "none");
139109
assertThat(registry).hasNumberOfObservationsEqualTo(1);
140110
listenerContainer.stop();
141111
listenerContainer.shutdown();
142112
}
143113

144-
static class ErrorHandlerObservationHandler implements ObservationHandler<JmsProcessObservationContext> {
145-
146-
private final CountDownLatch latch;
147-
148-
ErrorHandlerObservationHandler(CountDownLatch latch) {
149-
this.latch = latch;
150-
}
151-
152-
@Override
153-
public boolean supportsContext(Observation.Context context) {
154-
return context instanceof JmsProcessObservationContext;
155-
}
156-
157-
@Override
158-
public void onError(JmsProcessObservationContext context) {
159-
this.latch.countDown();
160-
}
161-
}
162-
163114
static Stream<Arguments> listenerContainers() {
164115
return Stream.of(
165116
arguments(named(DefaultMessageListenerContainer.class.getSimpleName(), new DefaultMessageListenerContainer())),

0 commit comments

Comments
 (0)