【问题标题】:Spring, Run task once when application startedSpring,应用程序启动时运行一次任务
【发布时间】:2016-12-16 10:01:32
【问题描述】:

我的应用程序基于 Spring Boot。 我想创建一个应该在应用程序启动后只运行一次的任务。

目前,我正在研究两种解决方案:

  1. 使用@Scheduled 和布尔属性来确定逻辑是否应该运行。

    @Scheduled public void method(){ if(method_run_propery){ //do something; } }

  2. 使用Quartz。不过我之前没用过。

请告诉我在这种情况下使用的最佳方法是什么。

【问题讨论】:

  • spring.io/blog/2015/02/11/… - 我没有任何理由需要安排一次运行一次任务
  • @shachar。应用程序启动后,我正在检查内存数据网格中是否有任何数据。如果它是空的,我将获取数据并存储它。这就是为什么我只想这样做一次。

标签: spring scheduled-tasks quartz-scheduler quartz-core


【解决方案1】:

Spring 有一个 @PostConstruct 注释可以做到这一点。在 bean 初始化并添加所有依赖项后运行。

【讨论】:

  • 在 post 构造中执行对另一个 api 的请求是一种好方法吗?
  • 取决于应用程序启动所需的内容。如果在完成应用程序启动之前需要来自其他 api 的数据来补充缓存,那么我看不出你是如何绕过它的。如果它只是一次性请求,那么您可能需要进行某种非阻塞调用,以便 @PostConstruct 方法可以返回并允许应用程序完成启动。
  • 好的。我会试试你的方法。并带来结果
  • PostConstruct 如果您打算等待的只是这个 bean(及其依赖项)已准备好,那么它是很好的。 OP 询问正在启动的应用程序,这意味着所有 bean 都已准备好并且一切都已完全初始化。如果后者实际上是意图,@Shirish Singh 的答案更可取。
【解决方案2】:

如果它必须在应用程序初始化后立即运行一次,我会简单地从单例 bean 的 init 方法启动它。 Spring 确保在运行时所有依赖的 bean 都已初始化。

例如,假设一个 Java 注释 Spring 配置,您可以使用如下内容:

@Bean(init_method="init")
class TaskLauncher {

    @Autowired DependantBeanClass dependant Bean;
    ...

    public void init() {
        // execute or start the task, eventually using the autowired dependant beans
        ...
    }
}

当上下文刷新时,Spring 自动装配所有内容,初始化依赖的 bean,然后调用一次 TaskLauncher bean 的 init 方法。

如果您只需要在 Spring 初始化时启动某些东西,则不需要 @Scheduler 或 Quartz

【讨论】:

  • 您能否更详细地描述您的方法?
【解决方案3】:

其中一种方法是实现ApplicationListener

一旦 spring 上下文被初始化,你的类实现了 ApplicationListener 然后将调用 onApplicationEvent 方法,您的逻辑可以进入此方法。

【讨论】:

  • 我会补充一点,ApplicationReadyEvent 可能是您在这种情况下想要的。该接口将事件类型作为泛型类型arg,因此您实现ApplicationListener<ApplicationReadyEvent>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-09
  • 2015-11-20
  • 1970-01-01
相关资源
最近更新 更多