[英]How to start scheduled jobs dynamically with Spring (and Quartz)?
我正在按照本教程安排Spring的工作。
在本教程中,調度由以下代碼啟動:
public static void main(String args[]){
AbstractApplicationContext context = new ClassPathXmlApplicationContext("app-config.xml");
}
我不想使用main,而是希望使用可以在我的應用程序中的任何位置調用的方法來啟動作業,例如:
public void startJobs() {
// what should this method do to start the jobs?
}
以下工作可以嗎?
public void startJobs() {
AbstractApplicationContext context = new ClassPathXmlApplicationContext("app-config.xml");
}
這被認為是好習慣嗎?
基本上我想要實現的是能夠隨時啟動作業(無論何時我調用startJobs()
方法),而不是在main方法啟動時。
我怎樣才能做到這一點?
你做過調度使用石英和彈簧嗎? 如果是,它運行正常嗎? 您共享的示例鏈接屬於“任務名稱空間”
Quartz使用Trigger,Job和JobDetail對象來實現各種作業的調度。 對於Quartz背后的基本概念,請看一下
http://quartz-scheduler.org/documentation/quartz-2.2.x/quick-start
要將它與Spring集成,請同時查看
Spring和quartz的XML配置。
<bean id="jobLauncher" class="org.springframework.batch.core.launch.support.SimpleJobLauncher">
<property name="jobRepository" ref="jobRepository" />
</bean>
<bean
class="org.springframework.batch.core.configuration.support.JobRegistryBeanPostProcessor">
<property name="jobRegistry" ref="jobRegistry" />
</bean>
<bean id="jobRegistry"
class="org.springframework.batch.core.configuration.support.MapJobRegistry" />
<bean name="csvLoaderJobDetail"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.example.CSVloader.ScheduledJob" />
<property name="jobDataMap">
<map>
<entry key="csvData" value="value1" />
<entry key="date" value="25/09/2015" />
<entry key="csvId" value="1" />
<entry key="jobName" value="csvLoadJob" />
<entry key="jobLocator" value-ref="jobRegistry" />
<entry key="jobLauncher" value-ref="jobLauncher" />
</map>
</property>
<property name="durability" value="true" />
</bean>
<bean id="csvLoaderTrigger"
class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="csvLoaderJobDetail" />
<property name="cronExpression" value="0 0 12 * * ?" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<ref bean="csvLoaderJobDetail" />
</list>
</property>
<property name="triggers">
<list>
<ref bean="csvLoaderTrigger" />
</list>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.scheduler.skipUpdateCheck">true</prop>
</props>
</property>
</bean>
要手動觸發作業,需要在spring bean中注入SchedulerFactoryBean。 首先,您需要獲取在石英調度程序中創建的所有作業,然后您可以使用每個作業的作業鍵和作業組手動觸發任何作業。
@Autowired
private SchedulerFactoryBean schedulerFactory;
org.quartz.Scheduler scheduler = schedulerFactory.getScheduler();
// loop jobs by group
for (String groupName : scheduler.getJobGroupNames()) {
// get jobkey
for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher
.jobGroupEquals(groupName))) {
String jobName = jobKey.getName();
String jobGroup = jobKey.getGroup();
scheduler.triggerJob(jobName, jobGroup);
}
}
現在,您可以創建一個Object列表,其中包含jobName和jobGroup以手動觸發任何作業。
一種更好,更簡單的方法,使用@Scheduled注釋。
方法1)在@Scheduled注釋中使用固定延遲屬性的任務調度
@Scheduled(fixedDelay = 5000)
方法2)在@Scheduled注釋中使用cron表達式的任務調度
@Scheduled(cron="*/5 * * * * ?")
方法3)使用屬性文件中的cron表達式進行任務調度
@Scheduled(cron = "${cron.expression}")
你可以在這里得到完整的例子
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.