我想在加载Spring上下文后运行一些作业,但我不知道如何执行此操作。
你有什么想法该怎么做?如何在弹簧加载应用程序上下文后执行作业?
回答
谢谢大家的回复。 事实上,我错过了我的问题中的一个小细节,我想在加载应用程序上下文后运行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>
再次感谢你的帮助,我很抱歉,如果问题不是很清楚“:(
您可以编写一个实现org.springframework.context.Lifecycle
接口的bean类。将此Bean添加到您的上下文中,一旦该上下文启动完成,将由容器调用方法start()
。
另一种可能性是将监听器注册到应用程序上下文事件()。基本上它与skaffman的解决方案一样,只是执行:
org.springframework.context.ApplicationListener<org.springframework.context.event.ContextRefreshedEvent>
而不是生命周期。它只有一种方法而不是三种。 :-)
请注意,由于您使用的是Spring MVC,因此您将得到2个刷新事件。看到这篇文章的更多信息:http://stackoverflow.com/questions/6164573/why-is-my-spring-contextrefreshed-event-called-twice/6165557#6165557 – sourcedelica 2011-06-01 19:04:26
你可以找到刷新根上下文的事件测试是否event.getApplicationContext()。getRoot()== null' – 2013-12-07 12:54:54
@Philipp - 你的意思是说'event.getApplicationContext()。getParent()== null'? – htompkins 2016-06-22 18:43:56
如果你想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
}
}
关于它的蹩脚的事情是,你不能听多个事件... – kboom 2014-08-16 13:18:35
不知道你的意思。你可以用你想要的不同事件类多次实现接口,或者只是实现'ApplicationListener',在这种情况下你将得到所有的事件。 – 2015-01-31 14:41:32
使用@PostConstruct
注解。比你可以混合使用任何的工作特性,并保证运行甲基od在负载上下文中。
值得一提的是它是一个javax注释,而不是Spring特有的注释。 – kboom 2014-02-27 19:28:20
'@ PostConstruct'只保证自动装配在这个bean中完成。如果你想调用自动装配依赖关系的方法,不要使用'@ PostConstruct',因为不能保证自动装配在这些依赖关系中完成。 – 2015-10-22 19:07:17
@ Mr.Radar - 我认为你是部分错误。注入时依赖关系是完全连接的,Spring命令以一种从没有任何依赖关系的方式开始接线。但是整个上下文还没有完全初始化,因此当存在任何间接级别时系统可能会表现出不可预测的行为(如在注入的应用程序上下文中使用事件或手动搜索bean) – wciesiel 2016-05-13 20:37:30
- 1. 无法加载弹簧应用程序上下文
- 2. 如何在加载弹簧上下文后添加上下文参数
- 3. swing应用程序,弹簧应用程序上下文错误
- 4. 在基于EJB的应用程序中加载弹簧上下文
- 5. 向弹簧应用程序添加另一个上下文
- 6. 按需弹簧上下文加载
- 7. 重新加载弹簧批量作业
- 8. 弹簧启动应用与弹簧批量不运行作业
- 9. 弹簧测试DB单元:未能加载应用程序上下文
- 10. 在弹簧上下文初始化后加载webservlet
- 11. 共享上下文:property-placeholder在弹簧应用程序中
- 12. 错误的弹簧应用上下文加载测试
- 13. 如何防止在单元测试期间反复加载弹簧应用程序上下文
- 14. 未找到弹簧应用程序上下文
- 15. 弹簧3个MVC多个应用程序上下文实例
- 16. 弹簧引导配置应用程序上下文层次
- 17. 类加载应用程序上下文弹出
- 18. 从命令行加载弹簧上下文属性
- 19. 根据配置文件在弹簧应用程序上下文中加载不同的jndi.properties文件
- 20. 如何在gtk应用程序中执行定期作业?
- 21. 在websphere应用程序服务器中弹簧加载资源
- 22. 查找弹簧按执行日期筛选和排序批量作业执行
- 23. 如何运行弹簧启动应用程序作为Web应用程序以及命令行应用程序?
- 24. 启动应用程序弹簧启动后在类中执行某些方法
- 25. 执行弹簧
- 26. 弹簧批处理作业在管理器中执行方法
- 27. 我怎样才能防止加载上下文后的弹簧批处理作业
- 28. 用于独立弹簧应用的弹簧启动执行器
- 29. 用于独立弹簧启动应用的弹簧执行器
- 30. 如何在子上下文中有弹簧安全上下文
感谢您的快速回复 我试过了,我会告诉你它是否有效 – user405458 2010-10-22 08:04:39
这是不正确的。 '生命周期'是为了显式调用。只有'SmartLifecycle'会被Spring框架自动调用。 – mrembisz 2012-09-06 08:28:32