2013-07-16 26 views
23

Kuvars JOB'larını dinamik olarak tanımlamak için bir kullanıcı arabirimini açığa çıkarmak istiyorum. Nerede kullanıcı İŞ adı, cron ifade veya zaman aralığı, vb görevJava Örnek: Quartz ile Dinamik İş Çizelgeleme

bu özelliği kolaylaştıran herhangi Açık Kaynak var mı özgü java sınıfı gibi İŞLER özelliklerini tanımlamak için tesis olmalı? Veya, Dinamik Quartz Zamanlayıcı için kendi modülümü oluşturmak istersem, bunu yapmanın yolu ne olmalı? Dinamik Kuvars İŞ Zamanlama için

+0

[bu] bir göz atın (http://quartz-scheduler.org/documentation/quartz-2.x/cookbook/JobInitPlugin) – Shinchan

cevap

20

örnek kod:

Maven bağımlılıklar

  <dependency> 
      <groupId>org.quartz-scheduler</groupId> 
      <artifactId>quartz</artifactId> 
      <version>1.8.5</version> 
     </dependency> 
      <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-beans</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-context-support</artifactId> 
      <version>${spring.version}</version> 
     </dependency> 

Uygulama Bağlam Dosyası (dinamik-jobs.xml)

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:context="http://www.springframework.org/schema/context" 
    xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" 
    xsi:schemaLocation=" 
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
      http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd 
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
      http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd 
      http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
      http://www.springmodules.org/schema/ehcache http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd"> 


    <!-- The Task Bean--> 
    <bean id="myTask" class="com.xxx.example.dynamicjob.MyTask" /> 

    <!-- The quartz scheduler configuration --> 
    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"/> 

</beans> 

Java sınıfı için Görev

package com.xxx.example.dynamicjob; 

    public class MyTask 
    { 
     public void performAction() { 
      System.out.println("Hey, you reached me...:)"); 
     }   
    } 

Java Sınıf Dinamik İşi

package com.xxx.example.dynamicjob; 
import org.quartz.JobDetail; 
import org.quartz.Scheduler; 
import org.springframework.beans.factory.xml.XmlBeanFactory; 
import org.springframework.core.io.ClassPathResource; 
import org.springframework.scheduling.quartz.CronTriggerBean; 
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean; 

public class DynamicJobExample { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

       ClassPathResource res = new ClassPathResource("dynamic-jobs.xml"); 
       XmlBeanFactory factory = new XmlBeanFactory(res); 

       //get the quartzFactory bean 
       Scheduler scheduler = (Scheduler) factory.getBean("scheduler"); 

       //get the task bean 
       MyTask myTask = (MyTask) factory.getBean("myTask"); 

       try { 
       // create JOB 
       MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean(); 
       jobDetail.setTargetObject(myTask); 
       jobDetail.setTargetMethod("performAction"); 
       jobDetail.setName("MyJobDetail"); 
       jobDetail.setConcurrent(false); 
       jobDetail.afterPropertiesSet(); 

       /* SimpleTriggerBean trigger = new SimpleTriggerBean(); 
       trigger.setBeanName("MyTrigger"); 
       trigger.setJobDetail((JobDetail) jobDetail.getObject()); 
       trigger.setRepeatInterval(5000); 
       trigger.afterPropertiesSet(); 
       */ 

       // create CRON Trigger 
       CronTriggerBean cronTrigger = new CronTriggerBean(); 
       cronTrigger.setBeanName("CRON0001"); 

       // Execute after each 5 second 
       String expression = "5 * * * * ?"; 
       cronTrigger.setCronExpression(expression); 
       cronTrigger.afterPropertiesSet(); 

       //scheduler.scheduleJob(jobDetail, cronTrigger); 

       scheduler.scheduleJob((JobDetail) jobDetail.getObject(), cronTrigger); 

       // Start Scheduler   
       scheduler.start(); 

       } catch (Exception e) {      
        e.printStackTrace(); 
       } 
    } 
} 
+1

Kalıcı işler için çalışmıyor! – isah

+0

Yukarıdaki kod her zaman bana bir istisna verir "org.quartz.SchedulerException: Tetik olamaz null", herhangi bir alternatif yolu var .. ?? –

1
Sen JobDetail oluşturabilir

oluşturma ve Tetik da bu şekilde nesneleri için:

JobDetail jobDetail; 
String myJobClass = "com.MyJobClass"; 
String myJobName = "myJobName"; 
String myJobGroup ="myJobGroup"; 
Class myJobClassType= Class.forName(myJobClass);    
jobDetail =JobBuilder.newJob().ofType(myJobClassType) 
.withIdentity(myJobName, myJobGroup).build(); 


String myGroup = "myGroup"; 
String name = "TriggerName"; 
String expresion = "5 * * * * ?"; 


Trigger trigger = TriggerBuilder 
.newTrigger() 
.withIdentity(name, myGroup) 
.withSchedule(
CronScheduleBuilder.cronSchedule(expresion)) 
.build(); 
9

İlkbahar 4 Bana herhangi olmadan bunu sağlar sorun (Kuvars 2.0) - yay memuru-servlet.xml

Bahar fasulye veya Servis Class içine oluşturulan fasulye üstünde
<task:annotation-driven executor="myExecutor" scheduler="myScheduler"/> 
<task:scheduler id="myScheduler" pool-size="10"/> 
<task:executor id="myExecutor" pool-size="1"/> 

enjekte

@Service 
public class DynamicJobExample { 

@Autowired 
@Qualifier("myScheduler") 
private TaskScheduler scheduler; 

public void schedule() throws ParseException { 
    scheduler.schedule(new MyTask(), new CronTrigger("5 * * * * ?")); 
    } 
} 

MyTask olmalı bir Runnable Sınıf

public class MyTask implements Runnable{ 

@Override 
public void run() { 
    System.out.println("Hey, you reached me...:)"); 
    } 
} 

Maven bağımlılıklar vardır (pom.xml)

<spring.version>4.1.0.RELEASE</spring.version> 

    <dependency> 
     <groupId>org.quartz-scheduler</groupId> 
     <artifactId>quartz</artifactId> 
     <version>2.2.1</version> 
    </dependency> 
+1

Bu da iyi bir yaklaşım gibi görünüyor. Bunu paylaştığın için teşekkürler. –

+0

Ben fasulye yaratırken "java.lang.IllegalArgumentException: Başlangıç ​​zamanı boş olamaz" özel durum alıyorum. Bunun hakkında bir fikrin var mı? – prageeth

+0

Bu özellikle, veritabanı depolanmış crons'tan cron işlerini yeniden programlamak için kullanışlıdır. XML'in eksik olduğunu düşünüyorum. –

0
package com.myproject; 

import java.text.ParseException; 

import org.quartz.JobBuilder; 
import org.quartz.JobDetail; 
import org.quartz.Scheduler; 
import org.quartz.SchedulerException; 
import org.quartz.SchedulerFactory; 
import org.quartz.impl.triggers.CronTriggerImpl; 
import org.springframework.stereotype.Component; 

@Component 
public class QuartzSchedulerExample { 
    public QuartzSchedulerExample() { 
     SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory(); 
     Scheduler scheduler; 
     try { 
      scheduler = schedFact.getScheduler(); 
      JobDetail details = JobBuilder.newJob(MyMailBean.class) 
        .withDescription("something") 
        .withIdentity("mejob","myGroup") 
        .storeDurably(true).build(); 

      CronTriggerImpl trigger = new CronTriggerImpl(); 
      trigger.setName("T1"); 

      try { 
       trigger.setCronExpression("0 0 0 * * ? *"); 
      } catch (ParseException e) { 
       e.printStackTrace(); 
      } 
      trigger.setDescription("desc"); 
      scheduler.scheduleJob(details,trigger); 
      scheduler.start(); 
     } catch (SchedulerException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

İş w hasta çalışma her gün 00:00:00 (saat: dakika: saniye)