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

这当然不能真正回答您的问题 - 它只是一个替代解决方案。遗憾的是,我从未使用过您的框架,因此无法对其发表评论。但以上是一个轻量级的解决方案,不需要将任何其他框架拉入您的应用程序。

希望能给点内幕。

亚瑟