2009-02-18 36 views
6

Trong ứng dụng của tôi có một yêu cầu để có thể tạo Công việc theo lịch trình (s) tùy thuộc vào loại Yêu cầu đến trong (Động).Sử dụng Quartz với Spring

Tôi vẫn có thể sử dụng Spring để tạo và kích hoạt Công việc không? Nếu có, làm thế nào?

Bất kỳ trợ giúp nào đều hữu ích.

Trả lời

4

Nhìn vào CronTriggerBeanJobDetailBean. Lớp 'MyJob' được mô phỏng dưới đây là một ví dụ của QuartzJobBean. Biểu thức cron là những gì bạn mong đợi, nhưng với giây là giá trị đầu tiên của nó.

<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

Bạn cũng có thể nhận được mùa xuân để kích hoạt các phương pháp trên đậu của bạn sử dụng thạch anh (tức là youdon't cần phải tạo ra bất kỳ lớp thạch anh cụ thể nào cả) bằng cách sử dụng MethodInvokingJobDetailFactoryBean trong gói org.springframework.scheduling.quartz

12

Cho rằng các SchedulerFactoryBean trưng ra một đối tượng Quartz Scheduler gốc, bạn có thể nối trực tiếp vào lớp điều khiển của bạn, và sau đó tự động tạo và đăng ký các trigger và các công việc với đối tượng Scheduler.

Bản thân Spring không thể được sử dụng để lên lịch các công việc được tạo động, vì hỗ trợ bean của Spring sẽ được sử dụng cho các công việc được cấu hình tĩnh, nhưng API Scheduler Quartz tự nhiên là đủ hợp lý để sử dụng riêng nó (hầu như không). Như fr kích hoạt các công việc, công việc của Quartz, không phải của mùa xuân.

chỉnh sửa: tôi hiểu sai câu hỏi gốc hoặc mọi người khác. Những câu trả lời khác tất cả chi tiết làm thế nào để tĩnh dây lên một loạt các công việc thạch anh sử dụng Spring, nhưng câu hỏi là làm thế nào để động công việc đúng thời hạn theo yêu cầu đi vào.

+0

Tôi hiểu câu hỏi theo cùng một cách. Tôi cũng tự hỏi về mối quan hệ của các công việc và công việc được định nghĩa tĩnh được tạo ra sau này. –

+1

+1 cho "động" - tìm kiếm đưa tôi đến đây. –

3

Bạn có thể tải về mã nguồn mẫu từ 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

Một năm sau và tôi thấy mình có một cái gì đó rất giống nhau. Googling xung quanh, tôi tìm thấy this link mô tả việc truy cập vào bối cảnh ứng dụng từ bên trong một công việc theo lịch trình thông qua JobExecutionContext. Tôi nghĩ rằng tôi sẽ tạo ra một công việc kiểu trừu tượng có thể thực hiện một số việc tạo ra công việc thực tế và sử dụng một mẫu thử nghiệm cho các dịch vụ cần tiêm thực sự khi công việc cần chạy.

4

Có vẻ như không có nhiều thông tin đầy đủ về điều này. Đây là cách tôi lên lịch công việc một cách năng động. Tất nhiên bạn có thể thay thế các kích hoạt đơn giản với một số kích hoạt khác.

đậu mùa xuân:

<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>  

Để chạy công việc ngay lập tức nhận được một tài liệu tham khảo để trình lên lịch và công việc, đính kèm một kích hoạt đơn giản và đặt nó vào lịch trình, như thế này:

@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); 
    } 
1

Mùa xuân 3 (phiên bản mới nhất tại thời điểm viết bài) hỗ trợ thiết lập công việc gần như hoàn toàn với chú thích.

Xem: Spring reference on scheduling

Các vấn đề liên quan