Я хочу запустить некоторые задания сразу после загрузки контекста Spring, но я не знаю, как это сделать.
Вы не знаете, как это сделать?
Как выполнять задания сразу после spring загружает контекст приложения?
Ответ 1
Благодарю всех вас за ваш ответ. На самом деле я пропустил небольшую деталь в своем вопросе, я хотел запустить Quartz Job сразу после загрузки контекста приложения. Я попробовал решение stakfeman, но у меня были некоторые проблемы с работой Quartz Jobs. Наконец, я нашел это решение: используйте Quartz внутри Spring, вот код:
<!--
===========================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>
еще раз спасибо за помощь, и я приношу свои извинения, если вопрос не очень ясен ": (
Ответ 2
Другая возможность - зарегистрировать прослушиватель для событий контекста приложения(). В основном это то же самое, что решение скаффмана, просто выполните:
org.springframework.context.ApplicationListener<org.springframework.context.event.ContextRefreshedEvent>
вместо Lifecycle. У него есть только один метод вместо трех.: -)
Ответ 3
Если вы хотите запустить задание после запуска 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
}
}
Ответ 4
Вы можете написать класс bean, который реализует интерфейс org.springframework.context.Lifecycle
. Добавьте этот bean в свой контекст, и метод start()
будет вызван контейнером, как только этот контекст завершит запуск.
Ответ 5
Используйте аннотацию @PostConstruct
. Чем вы можете комбинировать любые свойства задания и гарантировать запуск вашего метода в контексте нагрузки.