Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用dropwizard轮询SQS_Java_Amazon Web Services_Dropwizard_Amazon Sqs - Fatal编程技术网

Java 使用dropwizard轮询SQS

Java 使用dropwizard轮询SQS,java,amazon-web-services,dropwizard,amazon-sqs,Java,Amazon Web Services,Dropwizard,Amazon Sqs,我正在努力实现的目标: 我想制作一个dropwizard客户端,用于轮询Amazon SQS。 只要在队列中找到消息,就会对其进行处理和存储 有关已处理消息的一些信息将通过API提供 我选择Dropwizard的原因: 似乎是做REST客户机的好选择。我需要有度量、数据库连接并与一些Java服务集成 我需要什么帮助: 目前还不清楚SQS轮询在典型dropwizard应用程序中的适用方式和位置。 它应该是托管资源吗?还是一个安慰记者?或者其他。您可以使用com.google.common.util

我正在努力实现的目标:

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

有关已处理消息的一些信息将通过API提供

我选择Dropwizard的原因:

似乎是做REST客户机的好选择。我需要有度量、数据库连接并与一些Java服务集成

我需要什么帮助:

目前还不清楚SQS轮询在典型dropwizard应用程序中的适用方式和位置。

它应该是托管资源吗?还是一个安慰记者?或者其他。

您可以使用
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);
作为另一种选择,您还可以继续使用以下代码,这些代码不需要在项目中包含额外的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();
    }
}
在应用程序类的run()中,可以按如下方式注册上述类

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

您可以使用或,具体取决于您的用例。

您需要哪种轮询?在固定的时间间隔内,或者只要队列中有消息可用,我就必须实现某种程度上的“智能”轮询(长轮询+回退策略+消息阻塞)。不过,这些是我的用例的实现级细节。第一个答案是一个足够好的指向正确方向的指针:)