2009-02-18 74 views
6

在我的應用程序中,需要能夠根據進來的(動態)請求的類型創建Scheduled Job(s)。在Spring中使用Quartz

我仍然可以使用Spring創建和觸發作業嗎?如果是,如何?

任何幫助將是有用的。

回答

4

看看CronTriggerBeanJobDetailBean。下面的「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> 
2

您還可以得到Spring來觸發使用Quartz您豆類方法(即youdon't需要創建任何特定的石英類的話)在包中的MethodInvokingJobDetailFactoryBeanorg.springframework.scheduling.quartz

12

鑑於SchedulerFactoryBean公開了一個本機Quartz Scheduler對象,可以直接將它連接到您的控制器類,然後使用Scheduler對象動態創建並註冊觸發器和作業。

Spring本身不能用於動態創建作業的調度,因爲Spring的bean支持將用於靜態配置的作業,但本機Quartz Scheduler API足夠合理,可以單獨使用。作爲工作的觸發者,Quartz的工作,而不是Spring的工作。

編輯:要麼我誤解了原來的問題,要麼其他人都是。其他答案都詳細說明了如何靜態線了使用Spring系列石英工作,但問題是如何動態調度作業的請求進來,

+0

我以同樣的方式理解問題。我還想知道後來創建的靜態定義的作業和作業之間的關係。 – 2012-06-09 10:01:57

3

您可以從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> 

1

一一年後,我發現自己不得不非常相似。通過Google搜索,我找到了this link,它描述了通過JobExecutionContext從計劃作業中訪問應用程序上下文。我想我會創建一個抽象類型的作業,它可以完成一些實際的作業創建,並使用原型來在作業需要運行時實際注入所需的服務。

4

這似乎沒有太多完整的信息。這就是我如何動態地安排工作。當然,你可以用其他觸發器代替簡單的觸發器。

的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); 
    }