我要实现的目标:
我想创建一个对Amazon SQS进行轮询的dropwizard客户端。 只要在队列中找到一条消息,就会对其进行处理和存储。
有关已处理邮件的某些信息将通过API提供。
为什么我选择了Dropwizard:
似乎是制作REST客户端的不错选择。我需要具有指标,数据库连接并与一些Java服务集成。
我需要什么帮助:
尚不清楚在典型的dropwizard应用程序中SQS轮询的方式和位置。
应该是托管资源吗?还是控制台记者console-reporter?还是其他的东西。
答案 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()。