2011-03-17 76 views
3

當我的進程收到一條消息時,它需要啓動一個計時器並在X秒內執行一些邏輯。這些作業需要存儲在JDBC存儲中,據我所知,這可能與此問題無關。使用Quartz的動態作業數據

根據我讀過的內容,我應該能夠爲具有類似屬性的JobDataMap分配一個JobDataMap作爲單個Job類,但我無法找到任何文檔或示例來支持此用例。也許我的Google-fu很弱。

這有道理嗎?有一個Job類,並以某種方式存儲JobDataMap來填充該Job類並在每個消息的基礎上運行它?

回答

6

org.quartz.Trigger既有getJobDataMap()(這將new了一個如有必要),setJobDataMap()得到觸發的JobDataMap

最簡單的用法是:

Map data = new HashMap(); 
data.put("foo", "bar"); 

t.setJobDataMap(new JobDataMap(data)); 

獲取數據時,你的工作執行

public void execute(JobExecutionContext context) throws JobExecutionException 
{ 
    String fooValue = context.getMergedJobDataMap().get("foo"); 
} 

Trigger t = new SimpleTrigger(...); 
t.getJobDataMap().put("foo", "bar"); 

要與現有的地圖值初始化

Documentation on JobDataMap in the tut orial。

0

嗨坎桑(你會說西班牙語???)。 我會給你我的Quartz的例子。

public static void main(String[] args) { 

     SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory(); 
     try { 

      Scheduler sched; 
      sched = schedFact.getScheduler(); 

      sched.start(); 

      JobDetail jobd = new JobDetail("instruccion", "instrucciones", 
        Mensaje.class); 

//   TriggerExample trigger = new TriggerExample("instruccion", 
//     "instrucciones"); 

      jobd.setRequestsRecovery(true); 
      SimpleTrigger trigger2 = new SimpleTrigger("lanzador principal", "lanzadores", "instruccion","instrucciones" , Calendar.getInstance().getTime(), null, 100, 10000); 

      trigger2.setMisfireInstruction(SimpleTrigger.MISFIRE_INSTRUCTION_FIRE_NOW); 
      sched.scheduleJob(jobd, trigger2); 

      //  
      // } 
     } catch (SchedulerException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    }; 


public class Mensaje implements Job { 


    @Override 
    public void execute(JobExecutionContext arg0) throws JobExecutionException { 
     System.out.println("Hola Mundo"); 

    } 

} 


public class TriggerExample extends Trigger { 

    /** 
    * 
    */ 
    private static final long serialVersionUID = -4926331843008217753L; 

    Date fechaAEjecutar; 


    public TriggerExample(){ 

     super(); 
    } 

    public TriggerExample(String name){ 
     super(name); 
    } 

    public TriggerExample(String name, String group){ 
     super(name, group); 
    } 

    public TriggerExample(String name, String group,String jobname, String jobgroup){ 
     super(name,group,jobname,jobgroup); 
    } 



    @Override 
    public Date computeFirstFireTime(Calendar arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public int executionComplete(JobExecutionContext arg0, 
      JobExecutionException arg1) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public Date getEndTime() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Date getFinalFireTime() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Date getFireTimeAfter(Date arg0) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Date getNextFireTime() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Date getPreviousFireTime() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public Date getStartTime() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public boolean mayFireAgain() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public void setEndTime(Date arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void setStartTime(Date arg0) { 
     this.fechaAEjecutar = arg0; 
     System.out.println("Cargue la fecha el data con valor\n"); 
     System.out.println(this.fechaAEjecutar.getTime()); 

    } 

    @Override 
    public void triggered(Calendar arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void updateAfterMisfire(Calendar arg0) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    public void updateWithNewCalendar(Calendar arg0, long arg1) { 
     // TODO Auto-generated method stub 

    } 

    @Override 
    protected boolean validateMisfireInstruction(int arg0) { 
     // TODO Auto-generated method stub 
     return false; 
    } 

} 

在這一行SimpleTrigger觸發2 =新SimpleTrigger( 「lanzador主要」, 「lanzadores」, 「instruccion」, 「instrucciones」,Calendar.getInstance()的getTime(),NULL,100,10000);

你能設定執行和重複的時間嗎?