Ранее я задавал вопрос об отправке сообщений в sqs по темам sns и получил сбой конвертации с использованием Spring Cloud. Это была моя другая попытка использования JMS, и теперь я получаю сообщения о том, что не могу найти свойство _type, когда получатель получает сообщение, любая помощь очень ценится:
Конфигурация SNS:
@Bean
public AmazonSNS snsClient() {
AmazonSNS snsClient = AmazonSNSClientBuilder.standard()
.withEndpointConfiguration(<endpoint-stuff>)).build();
return snsClient;
}
Сообщение производителя:
public void send() throws Exception {
MessageDto message = new MessageDto();
message.setMessageA("Hello");
message.setMessageB("Again");
String className = message.getClass().getName();
MessageAttributeValue objectType = new MessageAttributeValue()
.withDataType("String")
.withStringValue(className);
Map<String, MessageAttributeValue> attributes = new HashMap<>();
attributes.put("_type", objectType);
String messageAsJson = objectMapper.writeValueAsString(message);
PublishRequest publishRequest = new PublishRequest()
.withMessageAttributes(attributes)
.withTopicArn(topicArn)
.withMessage(messageAsJson);
snsClient.publish(publishRequest);
}
потребительская конфигурация:
@Bean
public SQSConnectionFactory sqsConnectionFactory() {
AmazonSQS sqsClient = AmazonSQSClientBuilder
.standard()
.withEndpointConfiguration(<endpoint stuff>)
.build();
return new SQSConnectionFactory(new
ProviderConfiguration(),sqsClient);
}
@Bean
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory(SQSConnectionFactory connectionFactory,
MessageConverter messageConverter)
{
DefaultJmsListenerContainerFactory factory =
new DefaultJmsListenerContainerFactory();
factory.setConnectionFactory(connectionFactory);
factory.setDestinationResolver(new DynamicDestinationResolver());
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
factory.setMessageConverter(messageConverter);
return factory;
}
@Bean
public MessageConverter messageConverter(ObjectMapper objectMapper) {
MappingJackson2MessageConverter mappingJackson2MessageConverter = new MappingJackson2MessageConverter();
mappingJackson2MessageConverter.setObjectMapper(objectMapper);
mappingJackson2MessageConverter.setTargetType(MessageType.TEXT);
mappingJackson2MessageConverter.setTypeIdPropertyName("_type");
Map<String, Class<?>> typeIdMappings = new HashMap<>();
typeIdMappings.put(MessageDto.class.getName(), MessageDto.class);
mappingJackson2MessageConverter.setTypeIdMappings(typeIdMappings);
return mappingJackson2MessageConverter;
}
Потребитель сообщения:
@JmsListener(destination = "my_queue")
public void onReceive(Message<MessageClass> receivedMsg) throws JMSException {
LOGGER.info("Message received. Payload: {}, headers: {}", receivedMsg.getPayload(), receivedMsg.getHeaders());
}
Ошибка, которую я получал, была _type не найдена, когда я удалил ее из конфигурации, я получил сообщение о том, что имя свойства не должно быть пустым