使用dropwizard轮询SQS

3

我想实现的目标:

我要制作一个Dropwizard客户端,用于轮询Amazon SQS。每当在队列中发现一条消息时,它就会被处理和存储。

某些已处理消息的信息将通过API可用。

为什么选择Dropwizard:

看起来是制作REST客户端的好选择。我需要有度量,数据库连接,并与一些Java服务集成。

我需要帮助:

在典型的Dropwizard应用程序中,不太清楚SQS轮询应该如何以及在哪里适合。
它应该是托管资源吗?还是控制台报告 console-reporter?还是其他什么。


你需要哪种类型的轮询?是固定时间间隔还是只要队列中有消息可用就进行轮询? - Dhruvil Vaghela
我必须实现一种“智能”的轮询(长轮询+退避策略+消息阻塞)。虽然这些是我的用例的实现级别细节。第一个答案是指向正确方向的足够好的指针 :) - fzn
2个回答

3
您可以使用com.google.common.util.concurrent.AbstractScheduledService创建一个消费者线程,并将其添加到Dropwizard的环境生命周期中作为ManagedTask。以下是伪代码 -
public class YourSQSConsumer extends AbstractScheduledService {
  @Override
  protected void startUp() {
    // may be print something
  }

  @Override
  protected void shutDown() {
    // may be print something
  }

  @Override
  protected void runOneIteration() {
    // code to poll on SQS 
  }

  @Override
  protected Scheduler scheduler() {
     return newFixedRateSchedule(5, 1, SECONDS);
  }
}

Main 中执行以下操作 -
YourSQSConsumer consumer = new YourSQSConsumer();
Managed managedTask = new ManagedTask(consumer);
environment.lifecycle().manage(managedTask);

3
作为RishikeshDhokare的回答的替代方案,您也可以使用以下代码,无需在项目中包含其他jar依赖项,以使超级jar尽可能轻巧。
public class SQSPoller implements Managed, Runnable {

    private ScheduledExecutorService mainRunner;

    @Override
    public void start() throws Exception {
        mainRunner = Executors.newSingleThreadScheduledExecutor()
        mainRunner.scheduleWithFixedDelay(this, 0, 100, TimeUnit.MILLISECONDS);
    }

    @Override
    public void run() {
        // poll SQS here
    }

    @Override
    public void stop() throws Exception {
        mainRunner.shutdown();
    }
}

在您的应用程序类的run()方法中,您可以按照以下方式注册上述类。

environment.lifecycle().manage(new SQSPoller());

你可以根据使用场景选择scheduleWithFixedDelay()scheduleAtFixedRate()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接