Как настроить прослушиватель JMS с идентификатором трассировки отслеживания отслеживания в SQS Communication

#spring-boot #amazon-sqs #spring-jms #spring-cloud-sleuth

#пружинный ботинок #amazon-sqs #spring-jms #весна-облако-сыщик

Вопрос:

Я использую spring JMS для отправки и получения сообщений в AWS SQS. Ниже приведен мой класс конфигурации JMS.

Я использую spring sleuth для регистрации идентификатора трассировки.

Чего я хочу добиться, так это того, что идентификатор трассировки при регистрации должен быть одинаковым в классе производителя и в классе потребителя. Но я вижу другой идентификатор трассировки. Как решить эту проблему?

 

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;
    }
}
 

Способ отправки сообщения

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

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

Приемник сообщений

 
    @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());

    }

 

Когда я пытаюсь отправить сообщение, я вижу другой идентификатор трассировки 676d14076ee1cbb7 для производителя и 32mc3464298c2503b35 для потребителя. В идеале я хочу, чтобы идентификатор трассировки был таким же.

 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>
            <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>
 

Ответ №1:

Мне пришлось настроить JmsTemplate, я должен добавить tracingConnectionFactory в JmsTemplate, чтобы заставить его работать

     @Bean
    public JmsTemplate defaultJmsTemplate() {
        ConnectionFactory tracingConnectionFactory = getConnectionFactoryWrappedWithTracing(sqsConnectionFactory());
        JmsTemplate jmsTemplate = new JmsTemplate(tracingConnectionFactory);
        jmsTemplate.setMessageConverter(messageConverter());
        return jmsTemplate;
    }