【问题标题】:Avoiding using Thread.sleep() when working with SqsListener使用 SqsListener 时避免使用 Thread.sleep()
【发布时间】:2022-02-04 13:16:53
【问题描述】:

我有 SQS 监听器,在某种情况下,我需要等待 120 秒才能执行 method1()。但据我所知,SQS 监听器是多线程的。有没有办法避免使用 Thread.sleep() 重用线程而不是让它等待? 这是监听器代码:

 @SqsListener(value = "${test}", deletionPolicy = SqsMessageDeletionPolicy.ON_SUCCESS)
public void listenTransactionEvent(@Payload SQSEvent sqsEvent) {
    String sqsPlainMessage = sqsEvent.getMessage();
    if (sqsPlainMessage.equals("test")) {
        Thread.sleep(120 * 1000L);
        method1();
    } else {
        method2();
    }
}

和配置:

@Bean
public QueueMessageHandlerFactory queueMessageHandlerFactory(
        final ObjectMapper mapper,
        final AmazonSQSAsync amazonSQSAsync
) {
    final QueueMessageHandlerFactory queueHandlerFactory = new QueueMessageHandlerFactory();
    queueHandlerFactory.setAmazonSqs(amazonSQSAsync);
    queueHandlerFactory.setArgumentResolvers(Collections.singletonList(
            new PayloadMethodArgumentResolver(jackson2MessageConverter(mapper))
    ));
    return queueHandlerFactory;
}

【问题讨论】:

    标签: java multithreading amazon-sqs


    【解决方案1】:

    我相信您可能正在寻找java.util.Timer 来安排TimeTask 甚至使用java.util.concurrent.Future 可以释放调用listenTransactionEvent 的线程,但等待只会改变位置,有时取决于上下文Thread.sleep 可能是一个可接受的解决方案。

    最好的问候。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 2019-06-20
      • 1970-01-01
      • 2019-05-27
      • 1970-01-01
      • 2016-05-03
      • 1970-01-01
      相关资源
      最近更新 更多