-1

I am using spring JMS to send and recieve message to AWS SQS. Below is my JMS configuration class.

I am using spring sleuth to log trace id.

What i want to achive is the trace id when logged should be same in producer class and in consumer class. But i am seeing different trace id. How to solve this issue?



import javax.jms.ConnectionFactory;
import javax.jms.Session;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
import org.springframework.jms.annotation.EnableJms;
import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.support.converter.MappingJackson2MessageConverter;
import org.springframework.jms.support.converter.MessageConverter;
import org.springframework.jms.support.converter.MessageType;
import org.springframework.jms.support.destination.DynamicDestinationResolver;

import com.amazon.sqs.javamessaging.SQSConnectionFactory;
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain;
import com.amazonaws.regions.Region;
import com.amazonaws.regions.Regions;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.databind.util.ISO8601DateFormat;

import brave.Tracing;
import brave.jms.JmsTracing;
import brave.messaging.MessagingTracing;

/**
 * Description of JMSConfig
 *
 * @author
 * @version Nov 25, 2020
 */
@Configuration
@EnableJms
@Profile({ "Generic" })
public class JmsConfig {

    @Autowired
    private Tracing tracing;

    SQSConnectionFactory connectionFactory = SQSConnectionFactory.builder().withRegion(Region.getRegion(
            Regions.US_EAST_1)).withAWSCredentialsProvider(new DefaultAWSCredentialsProviderChain()).build();

    @Bean
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
        ConnectionFactory tracingConnectionFactory = getConnectionFactoryWrappedWithTracing(connectionFactory);
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(tracingConnectionFactory);
        factory.setDestinationResolver(new DynamicDestinationResolver());
        factory.setConcurrency("3-10");
        factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
        factory.setMessageConverter(messageConverter());
        return factory;
    }

    @Bean
    public MessageConverter messageConverter() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.serializationInclusion(JsonInclude.Include.NON_EMPTY);
        builder.dateFormat(new ISO8601DateFormat());

        org.springframework.jms.support.converter.MappingJackson2MessageConverter mappingJackson2MessageConverter = new MappingJackson2MessageConverter();

        mappingJackson2MessageConverter.setObjectMapper(builder.build());
        mappingJackson2MessageConverter.setTargetType(MessageType.TEXT);
        mappingJackson2MessageConverter.setTypeIdPropertyName("documentType");
        return mappingJackson2MessageConverter;
    }

    @Bean
    public JmsTemplate defaultJmsTemplate() {
        JmsTemplate jmsTemplate = new JmsTemplate(this.connectionFactory);
        jmsTemplate.setMessageConverter(messageConverter());
        return jmsTemplate;
    }

    @Bean
    public ConnectionFactory getConnectionFactoryWrappedWithTracing(SQSConnectionFactory sqsConnectionFactory) {
        MessagingTracing messagingTracing = MessagingTracing.newBuilder(tracing).build();
        JmsTracing jmsTracing = JmsTracing.create(messagingTracing);
        ConnectionFactory tracingConnectionFactory = jmsTracing.connectionFactory(sqsConnectionFactory);
        return tracingConnectionFactory;
    }
}

MEssage sender method

public String postMessage(String message) {
        log.info("Sending message");

        jmsTemplate.convertAndSend(queueName, new User(message));
        return message;
    }

Message reciever


    @JmsListener(destination = "${app.queue.name}", containerFactory = "jmsListenerContainerFactory")
    public void receiveMessage(User message) throws JsonProcessingException {
        log.info("Received message: " + message);

        log.info("Received message: {}", message.getName());

    }

When i try to send message i can see different trace id 676d14076ee1cbb7 for producer and 32mc3464298c2503b35 for consumer. Ideally i want trace id to be same.

13:37:12 INFO  cloud-messaging-service 676d14076ee1cbb7 GenericMessageProducer: Sending message
13:37:14 INFO  cloud-messaging-service 676d14076ee1cbb7 SQSMessageProducer: Message sent to SQS with SQS-assigned messageId: 443f6d62-ac20-406a-9ab4-be4bfb1db8d3
13:37:14 INFO  cloud-messaging-service 676d14076ee1cbb7 SQSSession: Shutting down SessionCallBackScheduler executor
13:37:21 INFO  cloud-messaging-service c3464298c2503b35 GenericMessageConsumer: Received message: User{name=viyaan}
13:37:21 INFO  cloud-messaging-service c3464298c2503b35 GenericMessageConsumer: Received message: viyaan

POM Dependency

        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk</artifactId>
            <version>${aws-java-sdk}</version>
        </dependency>

        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>amazon-sqs-java-messaging-lib</artifactId>
            <version>${amazon-sqs-java-messaging-lib}</version>
            <type>jar</type>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
        </dependency>
        <dependency>
            <groupId>io.zipkin.aws</groupId>
            <artifactId>brave-instrumentation-aws-java-sdk-sqs</artifactId>
            <version>${brave-instrumentation-aws-java-sdk-sqs}</version>
        </dependency>
VIJ
  • 1,516
  • 1
  • 18
  • 34

1 Answers1

0

I had to tweak JMSTemplate, i have to add tracingConnectionFactory in JMsTemplate to make it work

    @Bean
    public JmsTemplate defaultJmsTemplate() {
        ConnectionFactory tracingConnectionFactory = getConnectionFactoryWrappedWithTracing(sqsConnectionFactory());
        JmsTemplate jmsTemplate = new JmsTemplate(tracingConnectionFactory);
        jmsTemplate.setMessageConverter(messageConverter());
        return jmsTemplate;
    }
VIJ
  • 1,516
  • 1
  • 18
  • 34