<code>stream:
jms:
services:
usecase1:
broker-url: broker-url for usecase1
user: user for usecase1
password: password for usecase1
usecase2:
broker-url: broker-url for usecase2
user: user for usecase2
password: password for usecase2
usecase3:
broker-url: broker-url for usecase3
user: user for usecase3
password: password for usecase3
# SSL/TLS Configuration
ssl:
trust-store: same truststore for all usecase
trust-store-password: same trust-store-password for all usecase
trust-store-type: same trust-store-type for all usecase
</code>
<code>stream:
jms:
services:
usecase1:
broker-url: broker-url for usecase1
user: user for usecase1
password: password for usecase1
usecase2:
broker-url: broker-url for usecase2
user: user for usecase2
password: password for usecase2
usecase3:
broker-url: broker-url for usecase3
user: user for usecase3
password: password for usecase3
# SSL/TLS Configuration
ssl:
trust-store: same truststore for all usecase
trust-store-password: same trust-store-password for all usecase
trust-store-type: same trust-store-type for all usecase
</code>
stream:
jms:
services:
usecase1:
broker-url: broker-url for usecase1
user: user for usecase1
password: password for usecase1
usecase2:
broker-url: broker-url for usecase2
user: user for usecase2
password: password for usecase2
usecase3:
broker-url: broker-url for usecase3
user: user for usecase3
password: password for usecase3
# SSL/TLS Configuration
ssl:
trust-store: same truststore for all usecase
trust-store-password: same trust-store-password for all usecase
trust-store-type: same trust-store-type for all usecase
<code>@Component
@ConfigurationProperties("stream.jms")
@Data
public class JmsServicesProperties {
private Map<String, ServiceProperties> services;
private SslProperties sslInfos;
@Data
public static class ServiceProperties {
private String brokerUrl;
private String user;
private String password;
}
@Data
public static class SslProperties {
private String trustStore;
private String trustStorePassword;
private String trustStoreType;
}
}
</code>
<code>@Component
@ConfigurationProperties("stream.jms")
@Data
public class JmsServicesProperties {
private Map<String, ServiceProperties> services;
private SslProperties sslInfos;
@Data
public static class ServiceProperties {
private String brokerUrl;
private String user;
private String password;
}
@Data
public static class SslProperties {
private String trustStore;
private String trustStorePassword;
private String trustStoreType;
}
}
</code>
@Component
@ConfigurationProperties("stream.jms")
@Data
public class JmsServicesProperties {
private Map<String, ServiceProperties> services;
private SslProperties sslInfos;
@Data
public static class ServiceProperties {
private String brokerUrl;
private String user;
private String password;
}
@Data
public static class SslProperties {
private String trustStore;
private String trustStorePassword;
private String trustStoreType;
}
}
<code>@Configuration
@EnableConfigurationProperties(JmsServicesProperties.class)
@EnableJms
public class JmsConfig {
@Bean
public JmsConsumerConfig jmsConsumerConfig(ConfigurableEnvironment environment,
ObservationRegistry observationRegistry){
return new JmsConsumerConfig(environment, observationRegistry);
}
}
</code>
<code>@Configuration
@EnableConfigurationProperties(JmsServicesProperties.class)
@EnableJms
public class JmsConfig {
@Bean
public JmsConsumerConfig jmsConsumerConfig(ConfigurableEnvironment environment,
ObservationRegistry observationRegistry){
return new JmsConsumerConfig(environment, observationRegistry);
}
}
</code>
@Configuration
@EnableConfigurationProperties(JmsServicesProperties.class)
@EnableJms
public class JmsConfig {
@Bean
public JmsConsumerConfig jmsConsumerConfig(ConfigurableEnvironment environment,
ObservationRegistry observationRegistry){
return new JmsConsumerConfig(environment, observationRegistry);
}
}
<code>public class JmsConsumerConfig implements BeanDefinitionRegistryPostProcessor {
private final Environment environment;
private final ObservationRegistry observationRegistry;
private final Map<String, JmsServicesProperties.ServiceProperties> services;
private final JmsServicesProperties.SslProperties sslProperties;
public JmsConsumerConfig(Environment environment, ObservationRegistry observationRegistry) {
this.environment = environment;
this.services = Binder.get(environment)
.bind("stream.jms.services", Bindable.mapOf(String.class,
JmsServicesProperties.ServiceProperties.class))
.get();
this.sslProperties = Binder.get(environment)
.bind("stream.jms.ssl",
Bindable.of(SslProperties.class)).orElse(null);
this.observationRegistry = observationRegistry;
}
private static ActiveMQSslConnectionFactory getActiveMQSslConnectionFactory(
ServiceProperties serviceProperties, SslProperties sslProperties) throws Exception {
ActiveMQSslConnectionFactory connectionFactory = new ActiveMQSslConnectionFactory();
connectionFactory.setBrokerURL(serviceProperties.getBrokerUrl());
connectionFactory.setUserName(serviceProperties.getUser());
connectionFactory.setPassword(serviceProperties.getPassword());
connectionFactory.setTrustStore(sslProperties.getTrustStore());
connectionFactory.setTrustStorePassword(sslProperties.getTrustStorePassword());
connectionFactory.setTrustStoreType(sslProperties.getTrustStoreType());
return connectionFactory;
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
throws BeansException {
for (Map.Entry<String, JmsServicesProperties.ServiceProperties> entry : services.entrySet()) {
String serviceContainerFactoryName = entry.getKey();
JmsServicesProperties.ServiceProperties serviceValue = entry.getValue();
try {
DefaultJmsListenerContainerFactory factory = createJmsListenerContainerFactory(
serviceValue, sslProperties);
ActiveMQSslConnectionFactory connectionFactory = getActiveMQSslConnectionFactory(
serviceValue, sslProperties);
factory.setObservationRegistry(observationRegistry);
factory.setConnectionFactory(connectionFactory);
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(DefaultJmsListenerContainerFactory.class);
beanDefinition.setInstanceSupplier(() -> factory);
registry.registerBeanDefinition(serviceContainerFactoryName, beanDefinition);
JmsTemplate jmsTemplate = new JmsTemplate();
jmsTemplate.setObservationRegistry(observationRegistry);
jmsTemplate.setConnectionFactory(connectionFactory);
GenericBeanDefinition jmsTemplateBeanDefinition = new GenericBeanDefinition();
jmsTemplateBeanDefinition.setBeanClass(JmsTemplate.class);
jmsTemplateBeanDefinition.setInstanceSupplier(() -> jmsTemplate);
registry.registerBeanDefinition(serviceContainerFactoryName + "JmsTemplate",
jmsTemplateBeanDefinition);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
public DefaultJmsListenerContainerFactory createJmsListenerContainerFactory(
ServiceProperties serviceProperties, SslProperties sslProperties) throws Exception {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
return factory;
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
}
}
</code>
<code>public class JmsConsumerConfig implements BeanDefinitionRegistryPostProcessor {
private final Environment environment;
private final ObservationRegistry observationRegistry;
private final Map<String, JmsServicesProperties.ServiceProperties> services;
private final JmsServicesProperties.SslProperties sslProperties;
public JmsConsumerConfig(Environment environment, ObservationRegistry observationRegistry) {
this.environment = environment;
this.services = Binder.get(environment)
.bind("stream.jms.services", Bindable.mapOf(String.class,
JmsServicesProperties.ServiceProperties.class))
.get();
this.sslProperties = Binder.get(environment)
.bind("stream.jms.ssl",
Bindable.of(SslProperties.class)).orElse(null);
this.observationRegistry = observationRegistry;
}
private static ActiveMQSslConnectionFactory getActiveMQSslConnectionFactory(
ServiceProperties serviceProperties, SslProperties sslProperties) throws Exception {
ActiveMQSslConnectionFactory connectionFactory = new ActiveMQSslConnectionFactory();
connectionFactory.setBrokerURL(serviceProperties.getBrokerUrl());
connectionFactory.setUserName(serviceProperties.getUser());
connectionFactory.setPassword(serviceProperties.getPassword());
connectionFactory.setTrustStore(sslProperties.getTrustStore());
connectionFactory.setTrustStorePassword(sslProperties.getTrustStorePassword());
connectionFactory.setTrustStoreType(sslProperties.getTrustStoreType());
return connectionFactory;
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
throws BeansException {
for (Map.Entry<String, JmsServicesProperties.ServiceProperties> entry : services.entrySet()) {
String serviceContainerFactoryName = entry.getKey();
JmsServicesProperties.ServiceProperties serviceValue = entry.getValue();
try {
DefaultJmsListenerContainerFactory factory = createJmsListenerContainerFactory(
serviceValue, sslProperties);
ActiveMQSslConnectionFactory connectionFactory = getActiveMQSslConnectionFactory(
serviceValue, sslProperties);
factory.setObservationRegistry(observationRegistry);
factory.setConnectionFactory(connectionFactory);
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(DefaultJmsListenerContainerFactory.class);
beanDefinition.setInstanceSupplier(() -> factory);
registry.registerBeanDefinition(serviceContainerFactoryName, beanDefinition);
JmsTemplate jmsTemplate = new JmsTemplate();
jmsTemplate.setObservationRegistry(observationRegistry);
jmsTemplate.setConnectionFactory(connectionFactory);
GenericBeanDefinition jmsTemplateBeanDefinition = new GenericBeanDefinition();
jmsTemplateBeanDefinition.setBeanClass(JmsTemplate.class);
jmsTemplateBeanDefinition.setInstanceSupplier(() -> jmsTemplate);
registry.registerBeanDefinition(serviceContainerFactoryName + "JmsTemplate",
jmsTemplateBeanDefinition);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
public DefaultJmsListenerContainerFactory createJmsListenerContainerFactory(
ServiceProperties serviceProperties, SslProperties sslProperties) throws Exception {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
return factory;
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
}
}
</code>
public class JmsConsumerConfig implements BeanDefinitionRegistryPostProcessor {
private final Environment environment;
private final ObservationRegistry observationRegistry;
private final Map<String, JmsServicesProperties.ServiceProperties> services;
private final JmsServicesProperties.SslProperties sslProperties;
public JmsConsumerConfig(Environment environment, ObservationRegistry observationRegistry) {
this.environment = environment;
this.services = Binder.get(environment)
.bind("stream.jms.services", Bindable.mapOf(String.class,
JmsServicesProperties.ServiceProperties.class))
.get();
this.sslProperties = Binder.get(environment)
.bind("stream.jms.ssl",
Bindable.of(SslProperties.class)).orElse(null);
this.observationRegistry = observationRegistry;
}
private static ActiveMQSslConnectionFactory getActiveMQSslConnectionFactory(
ServiceProperties serviceProperties, SslProperties sslProperties) throws Exception {
ActiveMQSslConnectionFactory connectionFactory = new ActiveMQSslConnectionFactory();
connectionFactory.setBrokerURL(serviceProperties.getBrokerUrl());
connectionFactory.setUserName(serviceProperties.getUser());
connectionFactory.setPassword(serviceProperties.getPassword());
connectionFactory.setTrustStore(sslProperties.getTrustStore());
connectionFactory.setTrustStorePassword(sslProperties.getTrustStorePassword());
connectionFactory.setTrustStoreType(sslProperties.getTrustStoreType());
return connectionFactory;
}
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry)
throws BeansException {
for (Map.Entry<String, JmsServicesProperties.ServiceProperties> entry : services.entrySet()) {
String serviceContainerFactoryName = entry.getKey();
JmsServicesProperties.ServiceProperties serviceValue = entry.getValue();
try {
DefaultJmsListenerContainerFactory factory = createJmsListenerContainerFactory(
serviceValue, sslProperties);
ActiveMQSslConnectionFactory connectionFactory = getActiveMQSslConnectionFactory(
serviceValue, sslProperties);
factory.setObservationRegistry(observationRegistry);
factory.setConnectionFactory(connectionFactory);
GenericBeanDefinition beanDefinition = new GenericBeanDefinition();
beanDefinition.setBeanClass(DefaultJmsListenerContainerFactory.class);
beanDefinition.setInstanceSupplier(() -> factory);
registry.registerBeanDefinition(serviceContainerFactoryName, beanDefinition);
JmsTemplate jmsTemplate = new JmsTemplate();
jmsTemplate.setObservationRegistry(observationRegistry);
jmsTemplate.setConnectionFactory(connectionFactory);
GenericBeanDefinition jmsTemplateBeanDefinition = new GenericBeanDefinition();
jmsTemplateBeanDefinition.setBeanClass(JmsTemplate.class);
jmsTemplateBeanDefinition.setInstanceSupplier(() -> jmsTemplate);
registry.registerBeanDefinition(serviceContainerFactoryName + "JmsTemplate",
jmsTemplateBeanDefinition);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
public DefaultJmsListenerContainerFactory createJmsListenerContainerFactory(
ServiceProperties serviceProperties, SslProperties sslProperties) throws Exception {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
return factory;
}
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
throws BeansException {
}
}
<code>@Component
@Slf4j
@EnableJms
public class usecase1JmsListener {
private final JmsTemplate jmsTemplate;
private final String queue;
public usecase1JmsListener(
@Qualifier("usecase1JmsTemplate") JmsTemplate jmsTemplate,
@Value("${usecase1.queue}") String queue) {
this.jmsTemplate = jmsTemplate;
this.queue = queue;
}
@JmsListener(destination = "${usecase1queues}", containerFactory = "usecase1")
public void receiveusecase1Message(Message message) {
log.info("Received message: {}", message);
}
}
</code>
<code>@Component
@Slf4j
@EnableJms
public class usecase1JmsListener {
private final JmsTemplate jmsTemplate;
private final String queue;
public usecase1JmsListener(
@Qualifier("usecase1JmsTemplate") JmsTemplate jmsTemplate,
@Value("${usecase1.queue}") String queue) {
this.jmsTemplate = jmsTemplate;
this.queue = queue;
}
@JmsListener(destination = "${usecase1queues}", containerFactory = "usecase1")
public void receiveusecase1Message(Message message) {
log.info("Received message: {}", message);
}
}
</code>
@Component
@Slf4j
@EnableJms
public class usecase1JmsListener {
private final JmsTemplate jmsTemplate;
private final String queue;
public usecase1JmsListener(
@Qualifier("usecase1JmsTemplate") JmsTemplate jmsTemplate,
@Value("${usecase1.queue}") String queue) {
this.jmsTemplate = jmsTemplate;
this.queue = queue;
}
@JmsListener(destination = "${usecase1queues}", containerFactory = "usecase1")
public void receiveusecase1Message(Message message) {
log.info("Received message: {}", message);
}
}
<code>11:48:24.877 [org.springframework.jms.JmsListenerEndpointContainer#1-1] INFO [jms-demo-receiver, traceId: , spanId: ] --- Received message: ActiveMQTextMessage {commandId = 5, responseRequired = false, messageId = ID:MMDG276R6PL4W-57386-1725344293494-1:1:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:MMDG276R6PL4W-57386-1725344293494-1:1:1:1, destination = queue:internaltest, transactionId = null, deliveryTime = 0, expiration = 0, timestamp = 1725344295126, arrival = 0, brokerInTime = 1725344295254, brokerOutTime = 1725344304806, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = org.apache.activemq.util.ByteSequence@5f6711ad, marshalledProperties = org.apache.activemq.util.ByteSequence@c51affe, dataStructure = null, redeliveryCounter = 0, size = 0, properties = {b3=66d6aa251334644eee09a2c4bcc92833-21e0b7d8bca24e40-1-ee09a2c4bcc92833, SiteId=Site-123, CustomerId=Cust-123, __AMQ_CID=ID:MMDG276R6PL4W-57386-1725344293494-0:1, EventType=usecase1EventType}, readOnlyProperties = true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = false, text = Connectivity Testing}
</code>
<code>11:48:24.877 [org.springframework.jms.JmsListenerEndpointContainer#1-1] INFO [jms-demo-receiver, traceId: , spanId: ] --- Received message: ActiveMQTextMessage {commandId = 5, responseRequired = false, messageId = ID:MMDG276R6PL4W-57386-1725344293494-1:1:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:MMDG276R6PL4W-57386-1725344293494-1:1:1:1, destination = queue:internaltest, transactionId = null, deliveryTime = 0, expiration = 0, timestamp = 1725344295126, arrival = 0, brokerInTime = 1725344295254, brokerOutTime = 1725344304806, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = org.apache.activemq.util.ByteSequence@5f6711ad, marshalledProperties = org.apache.activemq.util.ByteSequence@c51affe, dataStructure = null, redeliveryCounter = 0, size = 0, properties = {b3=66d6aa251334644eee09a2c4bcc92833-21e0b7d8bca24e40-1-ee09a2c4bcc92833, SiteId=Site-123, CustomerId=Cust-123, __AMQ_CID=ID:MMDG276R6PL4W-57386-1725344293494-0:1, EventType=usecase1EventType}, readOnlyProperties = true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = false, text = Connectivity Testing}
</code>
11:48:24.877 [org.springframework.jms.JmsListenerEndpointContainer#1-1] INFO [jms-demo-receiver, traceId: , spanId: ] --- Received message: ActiveMQTextMessage {commandId = 5, responseRequired = false, messageId = ID:MMDG276R6PL4W-57386-1725344293494-1:1:1:1:1, originalDestination = null, originalTransactionId = null, producerId = ID:MMDG276R6PL4W-57386-1725344293494-1:1:1:1, destination = queue:internaltest, transactionId = null, deliveryTime = 0, expiration = 0, timestamp = 1725344295126, arrival = 0, brokerInTime = 1725344295254, brokerOutTime = 1725344304806, correlationId = null, replyTo = null, persistent = true, type = null, priority = 4, groupID = null, groupSequence = 0, targetConsumerId = null, compressed = false, userID = null, content = org.apache.activemq.util.ByteSequence@5f6711ad, marshalledProperties = org.apache.activemq.util.ByteSequence@c51affe, dataStructure = null, redeliveryCounter = 0, size = 0, properties = {b3=66d6aa251334644eee09a2c4bcc92833-21e0b7d8bca24e40-1-ee09a2c4bcc92833, SiteId=Site-123, CustomerId=Cust-123, __AMQ_CID=ID:MMDG276R6PL4W-57386-1725344293494-0:1, EventType=usecase1EventType}, readOnlyProperties = true, readOnlyBody = true, droppable = false, jmsXGroupFirstForConsumer = false, text = Connectivity Testing}
My above code is all about dynamically register beans based to yml file. I have added ObservationRegistry in DefaultJmsListenerContainerFactory and JmsTemplate for all services the beans are cretaed but as you can see the
traceId and spanId is printed yet. how to get traceId and spanId from this above code in spring boot.
I have tried manually creation of ObservationRegistry bean and also @Postconstruct ObservationRegistry set in DefaultJmsListenerContainerFactory and JmsTemplate for all services the beans are cretaed but it didn’t work out
1