代码之家  ›  专栏  ›  技术社区  ›  a-sak

使用石英与弹簧

  •  6
  • a-sak  · 技术社区  · 17 年前

    在我的应用程序中,需要能够根据传入的请求类型(动态)创建计划作业。

    任何帮助都是有用的。

    7 回复  |  直到 14 年前
        1
  •  12
  •   skaffman    17 年前

    Spring本身不能用于动态创建的作业的调度,因为Spring的bean支持将用于静态配置的作业,但原生Quartz Scheduler API足够合理,可以单独使用(勉强)。作为工作的触发,这是Quartz的工作,而不是Spring的。

    编辑:要么我误解了最初的问题,要么其他人都误解了。其他答案都详细说明了如何使用Spring静态连接一系列石英作业,但问题是如何 动态地 在收到请求时安排作业。

        2
  •  4
  •   Joe Liversedge    17 年前

    看 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>
    
        3
  •  4
  •   Rori Stumpf    14 年前

    关于这一点,似乎没有太多完整的信息。这就是我动态调度作业的方式。当然,你可以用其他触发器替换简单的触发器。

    春豆:

    <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);
        }   
    
        4
  •  3
  •   firstthumb    17 年前

    MethodInvokingJobDetailFactoryBean org.springframework.scheduling.quartz

        5
  •  2
  •   oxbow_lakes    17 年前

    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>
    

        6
  •  1
  •   Matt    16 年前

    一年后,我发现自己不得不做一些非常相似的事情。我四处搜索,发现 this link 其描述了通过JobExecutionContext从调度作业内访问应用程序上下文。我想我将创建一个抽象类型的作业,它可以完成一些实际的作业创建,并在作业需要运行时使用原型来实际注入所需的服务。

        7
  •  1
  •   Gerbrand    14 年前

    Spring 3(撰写本文时的最新版本)几乎完全支持使用注释设置作业。

    请参阅: Spring reference on scheduling