2011-08-12 35 views
13

Chúng tôi có một số công việc Quartz được cấu hình trong ứng dụng của chúng tôi. Trong quá trình phát triển, chúng tôi để lịch trình thạch anh ở chế độ chờ - tuy nhiên, đôi khi chúng tôi muốn bắt đầu một công việc thủ công (cho mục đích phát triển). Nếu tôi gọi fireTrigger, nó cho tôi biết tôi cần khởi động trình lên lịch. Tuy nhiên, nếu tôi bắt đầu lịch trình, nó cũng sẽ lập lịch trình ngay lập tức tất cả các công việc khác, đó không phải là những gì tôi muốn (vì chúng có thể kích hoạt trong khi tôi đang gỡ lỗi công việc được kích hoạt thủ công).Công việc Firing Quartz thủ công

tôi có thể tạm dừng tất cả kích hoạt khi tôi bắt đầu lên lịch, nhưng sau đó tôi phải đối phó với các hướng dẫn Misfire, vv

Có một cách đơn giản để bắn ra một công việc bằng tay mà không cần phải đối phó với tạm dừng và Misfire (tức là một fireTrigger hoạt động ngay cả khi bộ lập lịch đang ở chế độ chờ)?

Trả lời

0

Bạn có thể cố gắng thêm một bộ lọc kích hoạt trong lịch trình của bạn

this.scheduler.addGlobalTriggerListener(new DebugExecutionFilter()); 

Các debug lọc thực hiện sẽ thêm một quyền phủ quyết khi thực hiện không phải là dễ bay hơi (không dự kiến ​​sẽ chạy ngay lập tức) và bạn đang ở trong chế độ gỡ lỗi.

Dưới đây là một ví dụ thực hiện:

private static class DebugExecutionFilter implements TriggerListener 
{ 

    public DebugExecutionFilter() 
    { 
    } 

    @Override 
    public String getName() 
    { 
     return "Task execution filter"; 
    } 

    @Override 
    public void triggerFired(Trigger trigger, JobExecutionContext context) 
    { 
     // Do nothing 
    } 

    /* (non-Javadoc) 
    * 
    * @see org.quartz.TriggerListener#vetoJobExecution(org.quartz.Trigger, org.quartz.JobExecutionContext) */ 
    @Override 
    @SuppressWarnings("unchecked") 
    /** 
    * A veto is added if : 
    * - For non volatile trigger if we are in debug mode 
    */ 
    public boolean vetoJobExecution(Trigger trigger, JobExecutionContext context) 
    { 

     try 
     { 
      // 
      if (!trigger.isVolatile() && isDebugMode()) 
      { 
       return true; 
      } 

      //task is run by scheduler.triggerJobWithVolatileTrigger() for immediate schedule 
      //or task is schedule and we are not in debugMode 
      return false; 
    } 


    @Override 
    public void triggerMisfired(Trigger trigger) 
    { 
     // do nothing 
    } 

    @Override 
    public void triggerComplete(Trigger trigger, JobExecutionContext context, int triggerInstructionCode) 
    { 
     // do nothing 
    } 

} 
+0

Cảm ơn câu trả lời mmounirou! Có lẽ tôi đã không mô tả chính xác vấn đề, nhưng tôi thực sự muốn các trình kích hoạt không tạm dừng được kích hoạt trong chế độ phát triển. Chỉ trong chế độ phát triển, các bộ lập lịch được để ở chế độ chờ và tất cả các trigger được tạm dừng theo mặc định. Nếu bây giờ tôi đi đến trang công việc đã lên lịch và bắt đầu một trong các bộ lập lịch với ý định chạy một trong các công việc thủ công (bên cạnh mỗi công việc, chúng ta có một nút "chạy ngay bây giờ"), tất cả các công việc khác bắt đầu misfiring. Tôi về cơ bản muốn tạm dừng công việc để làm gì trên misfire trong chế độ phát triển - có thể có một cách toàn cầu để làm điều này? –

16

đây là vòng lặp bạn sẽ yêu cầu để bắn các công việc bằng tay:

scheduler = stdSchedulerFactory.getScheduler(); 
    //note: "stdSchedulerFactory" is the object created of 
    //the schedulerFactory(Standard) class. 


    // loop jobs by group 
    for (String groupName : scheduler.getJobGroupNames()) { 

    // get jobkey 
    for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher 
     .jobGroupEquals(groupName))) { 

     String jobName = jobKey.getName(); 
     String jobGroup = jobKey.getGroup(); 

     scheduler.triggerJob(jobName, jobGroup); 
    } 

    } 
+1

đừng quên đánh dấu UP nếu câu trả lời này phù hợp với bạn! –

+0

Không hoạt động nữa trên 2.2.1 như triggerJob() nhận JobKey làm tham số. [Xem doc] (http://www.quartz-scheduler.org/api/2.2.1/org/quartz/Scheduler.html#triggerJob (org.quartz.JobKey)) Sử dụng @ Minarul-Haque respsonse để thay thế –

0

Không cần start-timeend-time.

<trigger> 
     <cron> 
     <name>TestTrigger</name> 
     <group>CronSampleTrigger</group> 
     <description>CronSampleTrigger</description> 
     <job-name>TestJob</job-name> 
     <job-group>jobGroup1</job-group>  

    <!--<start-time>1982-06-28T18:15:00.0Z</start-time> 
     <end-time>2020-05-04T18:13:51.0Z</end-time>--> 

     <cron-expression>0 0/1 * * * ?</cron-expression> 
     </cron> 
</trigger> 
2

Tất cả công việc đã đăng ký trong Bộ lập lịch thạch anh được nhận dạng duy nhất bởi JobKey bao gồm tên và nhóm. Bạn có thể kích hoạt công việc có một JobKey cụ thể ngay lập tức bằng cách gọi triggerJob(JobKey jobKey) của cá thể Trình lập lịch biểu của bạn.

//Create a new Job 
    JobKey jobKey = JobKey.jobKey("myNewJob", "myJobGroup"); 
    JobDetail job =JobBuilder.newJob(MyJob.class).withIdentity(jobKey).storeDurably().build(); 

    //Register this job to the scheduler 
    scheduler.addJob(job, true); 

    //Immediately fire the Job MyJob.class 
    scheduler.triggerJob(jobKey); 

Lưu ý:

  • scheduler là dụ Scheduler sử dụng trong suốt ứng dụng của bạn. Phương thức start() của nó nên được gọi sau khi nó được tạo ra.
  • Công việc là công việc lâu bền không thể đính kèm bất kỳ trình kích hoạt hoặc cron nào vào nó. Nó chỉ có thể được kích hoạt bằng cách gọi triggerJob(JobKey jobKey).
  • Các vấn đề liên quan