我在我的dropwizard项目中使用日程进行作业调度。我观察到,每次调度作业时,它都会创建计划任务的新对象。是不是很差的设计。 另一方面,调度TimerTask的java Timer只创建一次对象并在每个调度上调用run方法。
答案 0 :(得分:1)
因此,解决DW问题的一种方法是使用托管方法。 DW提供了一个名为Managed的接口,您可以使用jetty注册。 Jetty负责启动和停止这些操作,您可以完全控制任务的执行。使用DI框架,您可以定义自己的执行规则。
想象一下以下课程:
public class MessageTask implements Managed, Runnable {
private static final Logger log = Logger.getLogger(MessageTask.class);
private ScheduledExecutorService mainRunner = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryBuilder().setDaemon(true).setNameFormat("task-%d").build());
// injected by DI or set programatically
@Inject
private long delay;
@Inject
private long period;
@Override
public void start() throws Exception {
mainRunner.scheduleAtFixedRate(this, delay, period, TimeUnit.MILLISECONDS);
}
@Override
public void stop() throws Exception {
mainRunner.shutdown();
}
@Override
public void run() {
try {
runInner();
} catch (Exception e) {
log.error("Error executing task", e);
}
}
private void runInner() throws Exception {
// do your timer task work here
}
}
这是一项托管任务。使用DW注册它将导致框架在服务器启动或停止时调用启动和停止方法。
您在类中定义执行者(已调度)并将其实现为Runnable(无多个对象创建)
一开始,您可以使用所需的配置延迟和时间安排任务。
停止时,您将关闭调度程序。
线程池是一个deamon线程,因此它不会阻止JVM的关闭。
您需要在run方法中捕获异常,因为线程池执行程序框架将在异常后以静默方式删除任务。
runInner()方法将执行您需要的任何逻辑。
配置可以通过DI框架(我使用guicey集成guice和DW)或以编程方式完成,请参阅:http://www.dropwizard.io/0.9.2/docs/manual/core.html#managed-objects
这当然不能真正回答你的问题 - 它只是一种替代解决方案。我遗憾地从未使用过您的框架,所以我无法评论它。但上面是一个轻量级的解决方案,不需要将任何其他框架提取到您的应用程序中。
我希望能给一些内心。
阿图尔