如何在spring加载应用程序上下文后执行作业?

时间:2010-10-22 07:51:46

标签: java spring

我想在加载Spring上下文之后运行一些工作,但我不知道该怎么做。
你知道怎么做吗?

5 个答案:

答案 0 :(得分:22)

另一种可能性是将监听器注册到应用程序上下文事件()。基本上它与skaffman的解决方案相同,只需实现:

org.springframework.context.ApplicationListener<org.springframework.context.event.ContextRefreshedEvent>

而不是Lifecycle。它只有一种方法而不是三种方法。 : - )

答案 1 :(得分:16)

如果你想在Spring的上下文开始后运行一个工作,那么你可以使用ApplicationListener和事件ContextRefreshedEvent

public class YourJobClass implements ApplicationListener<ContextRefreshedEvent>{

    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent ) {
             // do what you want - you can use all spring beans (this is the difference between init-method and @PostConstructor where you can't)
             // this class can be annotated as spring service, and you can use @Autowired in it

    }
}

答案 2 :(得分:5)

您可以编写实现org.springframework.context.Lifecycle接口的bean类。将此bean添加到您的上下文中,一旦该上下文完成启动,容器将调用start()方法。

答案 3 :(得分:5)

使用@PostConstruct注释。您可以组合任何作业属性并保证在加载上下文中运行您的方法。

答案 4 :(得分:2)

谢谢大家的回复。 事实上我在我的问题中错过了一些细节,我想在加载应用程序上下文后运行Quartz Job。 我尝试了解决方案stakfeman,但我在运行Quartz Jobs时遇到了一些问题。 最后我找到了解决方案:在Spring中使用Quartz,这里是代码:

<!--
        ===========================Quartz configuration====================
    -->
    <bean id="jobDetail"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="processLauncher" />
        <property name="targetMethod" value="execute" />
    </bean>

    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
        <!-- see the example of method invoking job above -->
        <property name="jobDetail" ref="jobDetail" />
        <!-- 10 seconds -->
        <property name="startDelay" value="10000" />
        <!-- repeat every 50 seconds -->
        <property name="repeatInterval" value="50000" />
    </bean>

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="simpleTrigger" />
            </list>
        </property>
    </bean>

再次感谢你的帮助,如果问题不是很清楚我会道歉':(