Skip to content

Commit 94fe1f4

Browse files
committed
Guard for Micrometer Core usage in JMS instrumentation
This commit ensures that the Observability instrumentation for `@JmsListener` does not assume that micrometer-core is on the classpath and guards against direct usage. Closes gh-30335
1 parent 20d27e4 commit 94fe1f4

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

spring-jms/src/main/java/org/springframework/jms/listener/AbstractMessageListenerContainer.java

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.springframework.jms.support.QosSettings;
3838
import org.springframework.jms.support.converter.MessageConverter;
3939
import org.springframework.lang.Nullable;
40+
import org.springframework.util.ClassUtils;
4041
import org.springframework.util.ErrorHandler;
4142

4243
/**
@@ -149,7 +150,8 @@
149150
public abstract class AbstractMessageListenerContainer extends AbstractJmsListeningContainer
150151
implements MessageListenerContainer {
151152

152-
private static final JmsProcessObservationConvention DEFAULT_CONVENTION = new DefaultJmsProcessObservationConvention();
153+
private static final boolean micrometerCorePresent = ClassUtils.isPresent(
154+
"io.micrometer.core.instrument.binder.jms.JmsInstrumentation", AbstractMessageListenerContainer.class.getClassLoader());
153155

154156
@Nullable
155157
private volatile Object destination;
@@ -703,8 +705,7 @@ protected void doExecuteListener(Session session, Message message) throws JMSExc
703705
}
704706

705707
try {
706-
Observation observation = JmsObservationDocumentation.JMS_MESSAGE_PROCESS
707-
.observation(null, DEFAULT_CONVENTION, () -> new JmsProcessObservationContext(message), this.observationRegistry);
708+
Observation observation = createObservation(message);
708709
observation.observeChecked(() -> invokeListener(session, message));
709710
}
710711
catch (JMSException | RuntimeException | Error ex) {
@@ -714,6 +715,15 @@ protected void doExecuteListener(Session session, Message message) throws JMSExc
714715
commitIfNecessary(session, message);
715716
}
716717

718+
private Observation createObservation(Message message) {
719+
if (micrometerCorePresent) {
720+
return ObservationFactory.create(this.observationRegistry, message);
721+
}
722+
else {
723+
return Observation.NOOP;
724+
}
725+
}
726+
717727
/**
718728
* Invoke the specified listener: either as standard JMS MessageListener
719729
* or (preferably) as Spring SessionAwareMessageListener.
@@ -758,8 +768,7 @@ protected void doInvokeListener(SessionAwareMessageListener listener, Session se
758768

759769
Connection conToClose = null;
760770
Session sessionToClose = null;
761-
Observation observation = JmsObservationDocumentation.JMS_MESSAGE_PROCESS
762-
.observation(null, DEFAULT_CONVENTION, () -> new JmsProcessObservationContext(message), this.observationRegistry);
771+
Observation observation = createObservation(message);
763772
try {
764773
Session sessionToUse = session;
765774
if (!isExposeListenerSession()) {
@@ -982,4 +991,14 @@ protected void invokeErrorHandler(Throwable ex) {
982991
private static class MessageRejectedWhileStoppingException extends RuntimeException {
983992
}
984993

994+
private static abstract class ObservationFactory {
995+
996+
private static final JmsProcessObservationConvention DEFAULT_CONVENTION = new DefaultJmsProcessObservationConvention();
997+
998+
static Observation create(@Nullable ObservationRegistry registry, Message message) {
999+
return JmsObservationDocumentation.JMS_MESSAGE_PROCESS
1000+
.observation(null, DEFAULT_CONVENTION, () -> new JmsProcessObservationContext(message), registry);
1001+
}
1002+
}
1003+
9851004
}

0 commit comments

Comments
 (0)