我在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
但是似乎我无法确定要执行特定任务的延迟时间
答案 0 :(得分:2)
您可以使用run()
注释@EventListener
方法,或创建一个新的带有注释的方法,该方法将调用run()
:
@EventListener
public void handleContextRefresh(ContextRefreshedEvent event) {
run();
}
如果您不使用支持refresh()
操作的上下文,那应该没问题。
如果您使用这样的上下文(并且您不希望run()
在上下文刷新时执行),请确保将此状态存储在bean中。
答案 1 :(得分:2)
您是正确的,注释@Scheduled
不允许您动态读取延迟参数。因此,由于该批注仅以毫秒为单位或不方便用户使用的crone表达式采用了delay参数,因此我编写了自己的实用程序来执行此操作。该实用程序可作为开源MgntUtils库的一部分使用。您将需要编写类来扩展库中提供的类,然后才能获得所需的功能。但这确实需要一点工作。但是,该库随附示例包,该包具有在Javadoc中带有详细说明的工作示例的源代码。如果您有兴趣,可以在Github和Maven 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);
}
}
答案 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