问题描述
我正在使用 spring cloud starter aws 消息
implementation 'io.awspring.cloud:spring-cloud-starter-aws'
implementation 'io.awspring.cloud:spring-cloud-starter-aws-messaging'
版本
set('springCloudAwsversion','2.3.1')
dependencyManagement {
imports {
mavenBom "io.awspring.cloud:spring-cloud-aws-dependencies:${springCloudAwsversion}"
}
}
我的配置bean
@Bean
public QueueMessagingTemplate queueMessagingTemplate(final AmazonSQSAsync amazonSqs) {
return new QueueMessagingTemplate(amazonSqs);
}
@Bean
public AmazonSQSAsync amazonSqs() {
return AmazonSQSAsyncclientBuilder.standard()
.build();
}
@Bean
public ObjectMapper messageConverter() {
return new ObjectMapper().findAndRegisterModules();
}
@Bean
public MappingJackson2MessageConverter mappingJackson2MessageConverter(final ObjectMapper objectMapper) {
final var jacksonMessageConverter = new MappingJackson2MessageConverter();
jacksonMessageConverter.setobjectMapper(objectMapper);
jacksonMessageConverter.setSerializedPayloadClass(String.class);
jacksonMessageConverter.setStrictContentTypeMatch(false);
return jacksonMessageConverter;
}
@Bean
public QueueMessageHandlerFactory queueMessageHandlerFactory(final MappingJackson2MessageConverter messageConverter) {
final var factory = new QueueMessageHandlerFactory();
factory.setArgumentResolvers(List.of(new PayloadMethodArgumentResolver(messageConverter)));
return factory;
}
@Bean
public SimpleMessageListenerContainerFactory simpleMessageListenerContainerFactory(final AmazonSQSAsync amazonSqs) {
final var factory = new SimpleMessageListenerContainerFactory();
factory.setAmazonSqs(amazonSqs);
factory.setMaxnumberOfMessages(1);
return factory;
}
当我 @inject QueueMessagingTemplate 并使用方法 sendAndConvert 时出现问题,我的 POJO 的所有 java8 时间字段都转换为单独的字段分钟小时等......对象不是字符串。 所以当我尝试反序列化我的对象映射器时会抛出异常
我尝试使用 GroupIdResolver(as null) 和相同的 mapping2jacksonConverter 注册 QueueMessagingTemplate 但结果 asyncclient 停止连接到队列
解决方法
在我的情况下,通过使用 groupId 和 deduplicationId 创建 FIFO 队列解决了问题 还将 map2jackson 添加到 queuTemplate
@Bean
public QueueMessagingTemplate queueMessagingTemplate(final AmazonSQSAsync amazonSqs) {
return new QueueMessagingTemplate(amazonSqs,(ResourceIdResolver) null,mappingJackson2MessageConverter(messageConverter()));
}