当前位置: 首页 > 知识库问答 >
问题:

Dropwizard日晷库每次都会创建一个计划对象的新实例。我们无论如何都能避免吗。比如java定时器

华昕
2023-03-14

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

共有1个答案

潘宪
2023-03-14

因此,解决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中注册它将导致框架在服务器启动或停止时调用start和stop方法。

在类中定义一个executer(已调度),并将其实现为可运行(无需创建多个对象)

开始时,您可以按照所需的配置延迟和时间安排任务。

停止时,您将关闭计划程序。

线程池是一个deamon线程,因此它不会阻止JVM的关闭。

您需要在run方法中捕获异常,因为threadpool executor框架会在异常发生后自动删除任务。

运行内部()方法将执行您需要的任何逻辑。

配置可以通过DI框架完成(我使用的是集成了guice和DW的guicey),也可以通过编程完成,请参见:http://www.dropwizard.io/0.9.2/docs/manual/core.html#managed-物体

这当然不能真正回答你的问题——这只是一个替代解决方案。很遗憾,我从来没有使用过你的框架,所以我不能对此发表评论。但是上面是一个轻量级的解决方案,不需要任何其他框架被拉入你的应用程序。

我希望这能给一些内部。

阿图尔

 类似资料: