我正在尝试设置一个作业,该作业将每 x 分钟/秒/毫秒/其他时间运行一次,并轮询 Amazon SQS 队列以获取要处理的消息。我的问题是最好的方法是什么。我是否应该创建一个具有 x 个线程的 ScheduledThreadPoolExecutor 并使用 ScheduleAtFixedRate 方法调度单个任务,然后经常运行它(例如 10 毫秒),以便在需要时使用多个线程,或者,正如我向同事建议的那样,创建一个具有 x 个线程的 ScheduledThreadPoolExecutor,然后以稍微偏移的间隔创建多个计划任务,但运行频率较低。对我来说,这听起来像是 STPE 的用途。
通常我使用 Spring/Quartz 来处理此类事情,但目前还没有这种情况。
那么你有什么想法呢?
最佳答案
我建议您使用long polling在 SQS 上,这使得您的 ReceiveMessage
调用的行为更像是对 BlockingQueue
上的 take
的调用(这意味着您不需要使用计划任务从队列中轮询 - 您只需要一个在无限循环中轮询的线程,如果连接超时则重试)
关于java - ScheduledThreadPoolExecutor - 经常运行的单个任务/线程或运行频率较低的多个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17816274/