Dropwizard日d库每次都会创建一个新的计划对象实例。我们能避免它吗?像Java Timer这样的东西

永远的程序

我在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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档