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