使用dropwizard轮询SQS

时间:2018-08-30 11:56:38

标签: java amazon-web-services dropwizard amazon-sqs

我要实现的目标:

我想创建一个对Amazon SQS进行轮询的dropwizard客户端。 只要在队列中找到一条消息,就会对其进行处理和存储。

有关已处理邮件的某些信息将通过API提供。

为什么我选择了Dropwizard:

似乎是制作REST客户端的不错选择。我需要具有指标,数据库连接并与一些Java服务集成。

我需要什么帮助:

尚不清楚在典型的dropwizard应用程序中SQS轮询的方式和位置。
应该是托管资源吗?还是控制台记者console-reporter?还是其他的东西。

2 个答案:

答案 0 :(得分:2)

您可以使用com.google.common.util.concurrent.AbstractScheduledService创建使用者线程并将其作为ManagedTask添加到dropwizard的环境生命周期中。以下是伪代码-

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);

答案 1 :(得分:1)

作为RishikeshDhokare's answer的替代方法,还可以继续执行以下代码,该代码不需要在项目中包含其他jar作为依赖项,以使uber 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();
    }
}

在Application类的run()中,您可以按以下方式注册上述类。

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

您可以根据使用情况使用scheduleWithFixedDelay()scheduleAtFixedRate()