应用程序开始使用Spring后执行一个方法

我在 Spring 的 Service 组件中有这个结构:


@Autowired

PointController controller;

@Autowired

ParametroService parametroService;


Timer timer = new Timer();

TimerTask timerTask = new TimerTask() {

    @Override

    public void run() {

        List<IntRaptMec> allPointments =  getNotValidated();


        for(IntRaptMec pointment : allPointments) {

           controller.validate(pointment.getIdTemp());

        }

    }

};        


public void doValidationsTask() {       


    Parametro parametroTempo = parametroService.getParametro("1", "ATRC_MEC", "TEMPO_VERIFICACAO");

    timer.scheduleAtFixedRate(

            timerTask,

            Integer.parseInt(parametroTempo.getValor()) * oneMinute,

            Integer.parseInt(parametroTempo.getValor()) * oneMinute

    );  


}

我想要的只是在 Spring 应用程序完全初始化之后,它将执行 TimerTask 中的 run() 方法。然后,在从 parametroService.getParametro() 获得的给定时间(以分钟为单位)之后,再次执行此任务。


我试图从文档中遵循此链接:https : //docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#scheduling-annotation-support


但似乎我无法动态设置将执行特定任务的延迟时间


天涯尽头无女友
浏览 143回答 3
3回答

holdtom

您是正确的,注释@Scheduled不允许您动态读取延迟参数。出于这个原因,并且因为此注释仅以毫秒为单位接受延迟参数或作为对用户不友好的 crone 表达式,我编写了自己的实用程序来执行此操作。该实用程序作为开源 MgntUtils 库的一部分提供。您将需要编写将扩展库中提供的类的类,然后您将获得所需的功能。但这确实需要一些工作。然而,该库带有示例包,其中包含工作示例的源代码,并在 javadoc 中进行了详细说明。如果您有兴趣,可以在Github和Maven Central找到库.&nbsp;在这两个地方都可以使用源代码和 javadoc。javadoc 中详细描述了所需的功能。如果您将 javadoc 下载并解压到文件夹 c:\tmp 中,请查看 URL&nbsp;file:///C:/tmp/javadoc/com/mgnt/lifecycle/management/backgroundrunner/package-summary.html以获取有关如何使用的详细说明此功能。对于工作代码示例,请查看 package 的源代码com.mgnt.lifecycle.management.backgroundrunner.example

当年话下

您可以run()使用@EventListener或创建一个新的此类带注释的方法来注释您的方法,该方法将调用run():@EventListenerpublic void handleContextRefresh(ContextRefreshedEvent event) {&nbsp; &nbsp; run();}如果你不使用支持refresh()操作的上下文,你应该没问题。如果您使用这样的上下文(并且您不想run()在上下文刷新时执行),请确保将此状态存储在您的 bean 中。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java