首页 > 解决方案 > spring cloud aws消息传递sqs将localdatetime序列化为字符串

问题描述

我正在使用 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
  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 停止连接到队列

标签: amazon-web-servicescloudamazon-sqsspring-cloud-aws

解决方案


在我的情况下,使用 groupId 和 deduplicationId 创建 FIFO 队列解决了问题,还将 map2jackson 添加到 queuTemplate

@Bean
  public QueueMessagingTemplate queueMessagingTemplate(final AmazonSQSAsync amazonSqs) {
    return new QueueMessagingTemplate(amazonSqs, (ResourceIdResolver) null, mappingJackson2MessageConverter(messageConverter()));
  }

推荐阅读