Dropwizard日su库每次都会创建一个新的计划对象实例。无论如何我们可以避免它。像java计时器之类的东西

时间:2016-06-29 07:55:07

标签: java dropwizard timertask

我在我的dropwizard项目中使用日程进行作业调度。我观察到,每次调度作业时,它都会创建计划任务的新对象。是不是很差的设计。 另一方面,调度TimerTask的java Timer只创建一次对象并在每个调度上调用run方法。

1 个答案:

答案 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

这当然不能真正回答你的问题 - 它只是一种替代解决方案。我遗憾地从未使用过您的框架,所以我无法评论它。但上面是一个轻量级的解决方案,不需要将任何其他框架提取到您的应用程序中。

我希望能给一些内心。

阿图尔