在我的应用程序中,需要能够根据进来的(动态)请求的类型创建Scheduled Job(s)。在Spring中使用Quartz
我仍然可以使用Spring创建和触发作业吗?如果是,如何?
任何帮助将是有用的。
在我的应用程序中,需要能够根据进来的(动态)请求的类型创建Scheduled Job(s)。在Spring中使用Quartz
我仍然可以使用Spring创建和触发作业吗?如果是,如何?
任何帮助将是有用的。
看看CronTriggerBean和JobDetailBean。下面的“MyJob”课堂被嘲笑为QuartzJobBean的一个实例。 cron表达式就是你所期望的,但是秒作为它的第一个值。
<beans>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="startupDelay" value="5"/>
<property name="waitForJobsToCompleteOnShutdown" value="false"/>
<property name="triggers">
<list>
<bean class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail">
<bean class="org.springframework.scheduling.quartz.JobDetailBean">
<property name="jobClass" value="edu.vt.MyJob"/>
<property name="jobDataAsMap">
<map>
<entry key="messageSource" value-ref="messageSource"/>
<entry>
<key><value>anotherProperty</value></key>
<bean class="edu.vt.MyUsefulBean">
<constructor-arg index="0" value="..."/>
</bean>
</entry>
</map>
</property>
</bean>
</property>
<property name="cronExpression" value="0 * * * * ?"/>
</bean>
</list>
</property>
</bean>
</beans>
您还可以得到Spring来触发使用Quartz您豆类方法(即youdon't需要创建任何特定的石英类的话)在包中的MethodInvokingJobDetailFactoryBean
org.springframework.scheduling.quartz
鉴于SchedulerFactoryBean公开了一个本机Quartz Scheduler对象,可以直接将它连接到您的控制器类,然后使用Scheduler对象动态创建并注册触发器和作业。
Spring本身不能用于动态创建作业的调度,因为Spring的bean支持将用于静态配置的作业,但本机Quartz Scheduler API足够合理,可以单独使用。作为工作的触发者,Quartz的工作,而不是Spring的工作。
编辑:要么我误解了原来的问题,要么其他人都是。其他答案都详细说明了如何静态线了使用Spring系列石英工作,但问题是如何动态调度作业的请求进来,
您可以从this link
<?xml version="1.0" encoding="UTF-8"?>
下载示例源代码
<!-- scheduler factory -->
<bean id="com.notary.app.invoicing.scheduler.SchedulerFactory"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="ASFImportTrigger"/>
</list>
</property>
<property name="dataSource">
<ref bean="datasource"/>
</property>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
<prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.MSSQLDelegate</prop>
<prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
<prop key="org.quartz.jobStore.selectWithLockSQL">SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?</prop>
<prop key="org.quartz.plugin.triggHistory.class">org.quartz.plugins.history.LoggingTriggerHistoryPlugin</prop>
<prop key="org.quartz.plugin.triggHistory.triggerFiredMessage">Trigger {1}.{0} fired job {6}.{5} at: {4, date, HH:mm:ss dd/MM/yyyy}</prop>
<prop key="org.quartz.plugin.triggHistory.triggerCompleteMessage">Trigger {1}.{0} completed firing job {6}.{5} at {4, date, HH:mm:ss dd/MM/yyyy} with resulting trigger instruction code: {9}</prop>
<prop key="org.quartz.plugin.jobHistory.class">org.quartz.plugins.history.LoggingJobHistoryPlugin</prop>
<prop key="org.quartz.plugin.jobHistory.jobSuccessMessage">Job {1}.{0} fired at: {2, date, dd/MM/yyyy HH:mm:ss} result=OK</prop>
<prop key="org.quartz.plugin.jobHistory.jobFailedMessage">Job {1}.{0} fired at: {2, date, dd/MM/yyyy HH:mm:ss} result=ERROR</prop>
</props>
</property>
<property name="overwriteExistingJobs" value="true"/>
<property name="startupDelay" value="50"/>
<property name="applicationContextSchedulerContextKey">
<value>applicationContext</value>
</property>
</bean>
一一年后,我发现自己不得不非常相似。通过Google搜索,我找到了this link,它描述了通过JobExecutionContext从计划作业中访问应用程序上下文。我想我会创建一个抽象类型的作业,它可以完成一些实际的作业创建,并使用原型来在作业需要运行时实际注入所需的服务。
这似乎没有太多完整的信息。这就是我如何动态地安排工作。当然,你可以用其他触发器代替简单的触发器。
的Spring bean:
<bean name="dailyUpdateJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.somecompany.scheduler.DailyUpdates" />
</bean>
<bean id="dailyCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="dailyUpdateJob" />
<!-- run every morning at 4:15 AM -->
<property name="cronExpression" value="00 15 04 * * ?" />
</bean>
<bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="dailyCronTrigger" />
<ref bean="weeklyReportsCronTrigger" />
</list>
</property>
<property name="applicationContextSchedulerContextKey">
<value>applicationContext</value>
</property>
</bean>
运行作业立即得到调度和作业参考,附上一个简单的触发器,放入调度,就像这样:
@Autowired
SchedulerFactoryBean scheduler;
@Autowired
@Qualifier("dailyUpdateJob")
JobDetailFactoryBean dailyJob;
public void dynamicJobTrigger() throws Exception {
// Create a trigger for "now"
SimpleTrigger trigger = (SimpleTrigger) newTrigger()
.startAt(new Date())
.forJob(dailyJob.getObject())
.build();
// And drop it into the scheduler for immediate execution
scheduler.getScheduler().scheduleJob(trigger);
}
Spring 3(写作时的最新版本)支持几乎完全使用注释设置作业。
我以同样的方式理解问题。我还想知道后来创建的静态定义的作业和作业之间的关系。 – 2012-06-09 10:01:57