Dropwizard 日晷库每次都会创建一个新的调度对象实例。无论如何我们都可以避免它吗?像 java 计时器之类的东西
Dropwizard sundial library creates a new instance of scheduled object every time. Can we avoid it anyhow. Something like java timer
我在我的 dropwizard 项目中使用日晷来安排作业。我观察到它每次安排工作时,都会创建一个新的计划任务对象。这不是很糟糕的设计吗。
另一方面,调度 TimerTask 的 java 计时器只创建一次对象并在每个调度时调用 运行 方法。
因此,解决 DW 问题的一种方法是使用托管方法。 DW 提供了一个名为 Managed 的接口,您可以向 jetty 注册。 Jetty 负责启动和停止这些任务,您可以完全控制任务的执行。使用 DI 框架,您可以定义自己的执行规则。
想象一下 class:
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会导致框架在服务器启动或停止时调用启动和停止方法。
您在 class 中定义一个执行器(预定)并将其实现为 Runnable(不创建多个对象)
开始时,您可以根据需要的配置延迟和时间安排任务。
停止时,您将关闭调度程序。
线程池是守护线程,因此不会阻止 JVM 的关闭。
您需要在 运行 方法中捕获异常,否则线程池执行器框架将在异常发生后静静地删除任务。
运行Inner() 方法将执行您需要的任何逻辑。
可以通过 DI 框架(我正在使用集成了 guice 和 DW 的 guicey)或以编程方式进行配置,请参阅:http://www.dropwizard.io/0.9.2/docs/manual/core.html#managed-objects
这当然不能真正回答您的问题 - 它只是一个替代解决方案。遗憾的是,我从未使用过您的框架,因此无法对其发表评论。但以上是一个轻量级的解决方案,不需要将任何其他框架拉入您的应用程序。
希望能给点内幕。
亚瑟
我在我的 dropwizard 项目中使用日晷来安排作业。我观察到它每次安排工作时,都会创建一个新的计划任务对象。这不是很糟糕的设计吗。 另一方面,调度 TimerTask 的 java 计时器只创建一次对象并在每个调度时调用 运行 方法。
因此,解决 DW 问题的一种方法是使用托管方法。 DW 提供了一个名为 Managed 的接口,您可以向 jetty 注册。 Jetty 负责启动和停止这些任务,您可以完全控制任务的执行。使用 DI 框架,您可以定义自己的执行规则。
想象一下 class:
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会导致框架在服务器启动或停止时调用启动和停止方法。
您在 class 中定义一个执行器(预定)并将其实现为 Runnable(不创建多个对象)
开始时,您可以根据需要的配置延迟和时间安排任务。
停止时,您将关闭调度程序。
线程池是守护线程,因此不会阻止 JVM 的关闭。
您需要在 运行 方法中捕获异常,否则线程池执行器框架将在异常发生后静静地删除任务。
运行Inner() 方法将执行您需要的任何逻辑。
可以通过 DI 框架(我正在使用集成了 guice 和 DW 的 guicey)或以编程方式进行配置,请参阅:http://www.dropwizard.io/0.9.2/docs/manual/core.html#managed-objects
这当然不能真正回答您的问题 - 它只是一个替代解决方案。遗憾的是,我从未使用过您的框架,因此无法对其发表评论。但以上是一个轻量级的解决方案,不需要将任何其他框架拉入您的应用程序。
希望能给点内幕。
亚瑟