我在dropwizard项目中使用日d来安排工作。我观察到,每次计划作业时,都会创建计划任务的新对象。这不是很糟糕的设计。另一方面,调度TimerTask的java Timer仅创建对象一次,并在每个调度上调用run方法。
因此,解决DW问题的一种方法是使用托管方法。DW提供了一个名为Managed的界面,您可以向码头注册。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注册它会导致框架调用start和stop方法。
您在类中定义了一个执行器(预定的)并将其实现为Runnable(不创建多个对象)
在开始时,您可以根据需要配置的延迟和期限来安排任务。
停止时,您将关闭调度程序。
线程池是一个守护进程线程,因此它不会阻止JVM的关闭。
您需要在run方法中捕获异常,因为线程池执行程序框架将在出现异常后以静默方式删除任务。
runInner()方法将执行您需要的任何逻辑。
可以通过DI框架(我使用的是集成了guice和DW的guicey)或通过编程来完成配置,请参见:http : //www.dropwizard.io/0.9.2/docs/manual/core.html#managed-objects
当然,这并不能真正回答您的问题-只是替代解决方案。遗憾的是,我从未与您的框架合作过,因此无法对此发表评论。但是以上是一个轻量级的解决方案,不需要将任何其他框架引入到您的应用程序中。
我希望能给里面一些。
阿图尔
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句