应用程序开始使用Spring

时间:2018-08-06 12:09:14

标签: java spring multithreading

我在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 Application完全初始化之后,它将在TimerTask内部执行run()方法。然后,在几分钟内从parametroService.getParametro()获得给定时间后,再次执行此任务。

我试图按照以下文档中的链接操作: https://docs.spring.io/spring/docs/current/spring-framework-reference/integration.html#scheduling-annotation-support

但是似乎我无法确定要执行特定任务的延迟时间

5 个答案:

答案 0 :(得分:2)

您可以使用run()注释@EventListener方法,或创建一个新的带有注释的方法,该方法将调用run()

@EventListener
public void handleContextRefresh(ContextRefreshedEvent event) {
    run();
}

如果您不使用支持refresh()操作的上下文,那应该没问题。 如果您使用这样的上下文(并且您不希望run()在上下文刷新时执行),请确保将此状态存储在bean中。

More info on standard Spring events

答案 1 :(得分:2)

您是正确的,注释@Scheduled不允许您动态读取延迟参数。因此,由于该批注仅以毫秒为单位或不方便用户使用的crone表达式采用了delay参数,因此我编写了自己的实用程序来执行此操作。该实用程序可作为开源MgntUtils库的一部分使用。您将需要编写类来扩展库中提供的类,然后才能获得所需的功能。但这确实需要一点工作。但是,该库随附示例包,该包具有在Javadoc中带有详细说明的工作示例的源代码。如果您有兴趣,可以在GithubMaven Central上找到图书馆。在这两个地方都可以使用source和javadoc。所需的功能在javadoc中进行了详细描述。如果将javadoc下载并解压缩到文件夹c:\ tmp中,请查看URL file:///C:/tmp/javadoc/com/mgnt/lifecycle/management/backgroundrunner/package-summary.html,以获取有关如何使用此功能的详细说明。有关工作代码示例,请查看软件包com.mgnt.lifecycle.management.backgroundrunner.example中的源代码
此外,还有一篇文章介绍了该库的功能,只是该文章中尚未描述该特定功能。这是链接:Open Source Java library with stack trace filtering, Silent String parsing, Unicode converter and Version comparison

答案 2 :(得分:1)

您可以实现spring SmartLifecycle接口。完全加载Spring上下文时,将调用此方法。然后,您可以启动timertask。

public class TimerTaskInvoker implements SmartLifecycle{
@override
public void start(){
  timer.scheduleAtFixedRate(timerTask);
  }
}

您可以查看参考-https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/SmartLifecycle.html

答案 3 :(得分:1)

function Foo(){} Object.defineProperty(Foo.prototype, 'test', { get() { console.log('123'); Object.defineProperty(this, 'test', { get(){ console.log('456'); return '456'; } }) return '123' } }); var a = new Foo(); a.test; //FirstTime: 123, a.test; //and then always: 456, 可能是您需要的注释。

https://www.baeldung.com/running-setup-logic-on-startup-in-spring

答案 4 :(得分:0)

您可以使用 spring scheduler 并使用initialDelay批注指定fixedRate@Scheduled

@EnableScheduling
class CustomScheduler{

  @Scheduled(fixedRate = 1000, initialDelay = 1000)
  public void taskYouWantToPerform() {

      List<IntRaptMec> allPointments =  getNotValidated();
      for(IntRaptMec pointment : allPointments) {
          controller.validate(pointment.getIdTemp());
      }
  }
}

有关更多详细信息,请参见this