我想实现的目标:
我要制作一个Dropwizard客户端,用于轮询Amazon SQS。每当在队列中发现一条消息时,它就会被处理和存储。
某些已处理消息的信息将通过API可用。
为什么选择Dropwizard:
看起来是制作REST客户端的好选择。我需要有度量,数据库连接,并与一些Java服务集成。
我需要帮助:
在典型的Dropwizard应用程序中,不太清楚SQS轮询应该如何以及在哪里适合。
它应该是托管资源吗?还是控制台报告 console-reporter?还是其他什么。
我想实现的目标:
我要制作一个Dropwizard客户端,用于轮询Amazon SQS。每当在队列中发现一条消息时,它就会被处理和存储。
某些已处理消息的信息将通过API可用。
为什么选择Dropwizard:
看起来是制作REST客户端的好选择。我需要有度量,数据库连接,并与一些Java服务集成。
我需要帮助:
在典型的Dropwizard应用程序中,不太清楚SQS轮询应该如何以及在哪里适合。
它应该是托管资源吗?还是控制台报告 console-reporter?还是其他什么。
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);
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());