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
This commit is contained in:
@@ -37,6 +37,7 @@ import org.springframework.jms.support.JmsUtils;
|
||||
import org.springframework.jms.support.QosSettings;
|
||||
import org.springframework.jms.support.converter.MessageConverter;
|
||||
import org.springframework.lang.Nullable;
|
||||
import org.springframework.util.ClassUtils;
|
||||
import org.springframework.util.ErrorHandler;
|
||||
|
||||
/**
|
||||
@@ -149,7 +150,8 @@ import org.springframework.util.ErrorHandler;
|
||||
public abstract class AbstractMessageListenerContainer extends AbstractJmsListeningContainer
|
||||
implements MessageListenerContainer {
|
||||
|
||||
private static final JmsProcessObservationConvention DEFAULT_CONVENTION = new DefaultJmsProcessObservationConvention();
|
||||
private static final boolean micrometerCorePresent = ClassUtils.isPresent(
|
||||
"io.micrometer.core.instrument.binder.jms.JmsInstrumentation", AbstractMessageListenerContainer.class.getClassLoader());
|
||||
|
||||
@Nullable
|
||||
private volatile Object destination;
|
||||
@@ -703,8 +705,7 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen
|
||||
}
|
||||
|
||||
try {
|
||||
Observation observation = JmsObservationDocumentation.JMS_MESSAGE_PROCESS
|
||||
.observation(null, DEFAULT_CONVENTION, () -> new JmsProcessObservationContext(message), this.observationRegistry);
|
||||
Observation observation = createObservation(message);
|
||||
observation.observeChecked(() -> invokeListener(session, message));
|
||||
}
|
||||
catch (JMSException | RuntimeException | Error ex) {
|
||||
@@ -714,6 +715,15 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen
|
||||
commitIfNecessary(session, message);
|
||||
}
|
||||
|
||||
private Observation createObservation(Message message) {
|
||||
if (micrometerCorePresent) {
|
||||
return ObservationFactory.create(this.observationRegistry, message);
|
||||
}
|
||||
else {
|
||||
return Observation.NOOP;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Invoke the specified listener: either as standard JMS MessageListener
|
||||
* or (preferably) as Spring SessionAwareMessageListener.
|
||||
@@ -758,8 +768,7 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen
|
||||
|
||||
Connection conToClose = null;
|
||||
Session sessionToClose = null;
|
||||
Observation observation = JmsObservationDocumentation.JMS_MESSAGE_PROCESS
|
||||
.observation(null, DEFAULT_CONVENTION, () -> new JmsProcessObservationContext(message), this.observationRegistry);
|
||||
Observation observation = createObservation(message);
|
||||
try {
|
||||
Session sessionToUse = session;
|
||||
if (!isExposeListenerSession()) {
|
||||
@@ -982,4 +991,14 @@ public abstract class AbstractMessageListenerContainer extends AbstractJmsListen
|
||||
private static class MessageRejectedWhileStoppingException extends RuntimeException {
|
||||
}
|
||||
|
||||
private static abstract class ObservationFactory {
|
||||
|
||||
private static final JmsProcessObservationConvention DEFAULT_CONVENTION = new DefaultJmsProcessObservationConvention();
|
||||
|
||||
static Observation create(@Nullable ObservationRegistry registry, Message message) {
|
||||
return JmsObservationDocumentation.JMS_MESSAGE_PROCESS
|
||||
.observation(null, DEFAULT_CONVENTION, () -> new JmsProcessObservationContext(message), registry);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user