2011-07-20 43 views
5

Tôi cần trợ giúp. Tôi đang cố gắng tìm ra cách sắp xếp các công việc trong Quartz.Net. Việc làm trong Quartz tương ứng với các tác vụ trong Ứng dụng web của tôi, mỗi ứng dụng đều nằm ngoài một Ứng dụng trong Ứng dụng web của tôi. Tôi muốn người dùng có thể khởi chạy một công việc (WebApplication Context) theo yêu cầu và chạy nó ngay lập tức hoặc lên lịch công việc trong tương lai và, có thể lặp lại trong một khoảng thời gian nhất định. Tôi biết làm thế nào tất cả các mặt hàng này được thực hiện trong Quartz riêng, nhưng tôi đang có một thời gian khó khăn đặt tất cả lại với nhau.Lập kế hoạch công việc phụ thuộc trong Quartz.Net

Ví dụ, trong ứng dụng web của tôi, tôi có thể có một công việc với một số nhiệm vụ, theo một thứ tự cụ thể. Tôi muốn có thể lên lịch các tác vụ này trong thạch anh để chúng thực thi theo cùng thứ tự được xác định trong Ứng dụng web của tôi. Có ai có ý tưởng làm thế nào để làm điều này? Tôi đã đọc trên tài liệu Quartz nói rằng để lưu trữ Job tiếp theo trong JobDataMap, chỉ cần đấu tranh với nó.

Tôi hiện đang chờ tạo các công việc Thạch anh cho đến khi người dùng yêu cầu lịch biểu cho Công việc hoặc Chạy công việc đó. Bạn có nghĩ rằng tôi nên tạo công việc và kích hoạt khi tạo nhiệm vụ trong ứng dụng Web và sau đó kéo thông tin đó từ đối tượng nhiệm vụ để lên lịch trong Quartz?

Trả lời

4

Trong đoạn thứ hai: Nếu tôi hiểu chính xác bạn, bạn có một bộ công việc, từ đó người dùng có thể chọn và đặt theo thứ tự thực hiện nhất định. Tôi sẽ tiếp cận nó bằng cách tạo một thể hiện công việc của mọi loại công việc do người dùng chọn. Để duy trì thứ tự của công việc, bạn có thể lưu trữ tên nhóm và tên công việc của công việc tiếp theo trong JobDataMap của công việc trước đó. Sau đó, bạn có thể có một JobListener chung, được đăng ký với tất cả các công việc. Người nghe sẽ được thông báo khi một công việc được thực hiện và sẽ được chuyển qua gói công việc như một đối số. JobListener có thể liệt kê JobDataMap của công việc vừa được thực thi. Nếu nó tìm thấy một cặp khóa-giá trị với khóa "nextjobname", JobListener sẽ truy vấn trình lập lịch biểu cho công việc này. Tham chiếu đến trình lên lịch cũng có sẵn trong gói công việc. Nếu trình lên lịch trả về một thể hiện của JobDetail cho tên đã cho, JobListener sẽ thực thi nó, sẽ được thông báo khi nó hoàn thành và cứ như vậy cho đến khi nó được thực hiện với một công việc với "nextjobname" trong JobDataMap.
Ngoài ra, nếu bạn không muốn có Trình nghe công việc, bạn có thể có một lớp Cơ sở thực hiện chức năng này. Tất cả công việc của bạn sẽ xuất phát từ lớp này và sẽ ghi đè phương thức Thực thi ảo của nó. Bạn có thể gọi base.Execute (context) ngay trước khi trả về thực thi ghi đè.

public class Basejob : IJob 
{ 
    public virtual void Execute(JobExecutionContext context) 
    { 
     string nextJob = context.MergedJobDataMap["nextjobname"]; 
     JobDetail nextjob = context.Scheduler.GetJobDetail(context.MergedJobDataMap["nextjobname"], 
              context.MergedJobDataMap["nextjobgroupname"]); 
     if(nextjob != null) 
     { 
      context.Scheduler.ScheduleJob(nextjob, new SimpleTrigger(nextjob.Name + "trigger")); // this will fire the job immediately 
     } 
    } 
} 

public class MyJob : BaseJob 
{ 
    public override void Execute(JobExecutionContext context) 
    { 
     //do work 
     base.Execute(context); 
    } 
} 
+0

này có ý nghĩa. Bạn có ví dụ nào về lớp JobListener hoặc Job class cơ bản không? – M4V3R1CK

+0

Một câu hỏi nhanh khác: làm cách nào để tôi chuyển nhượng các trình kích hoạt cho các công việc được thực thi thông qua người nghe? Từ sự hiểu biết của tôi để lên kế hoạch một công việc bạn phải vượt qua chỉ là một kích hoạt (với một công việc liên kết với nó) hoặc một kích hoạt và công việc. – M4V3R1CK

+0

Trong trường hợp ai đó đang tự hỏi, _scheduler.AddJob (JobDetail job, bool Replace) cho phép bạn thêm công việc vào kho dữ liệu mà không có kích hoạt liên quan ... DUHHHHHHHHHHHHHHHHHHH – M4V3R1CK

10

Những gì bạn cần là lớp JobChainingJobListener, mà ở đó để giúp bạn tạo ra một chuỗi các thực cho công việc của bạn theo một thứ tự cụ thể mà bạn mong muốn ..

using System; 
using System.Text; 
using Quartz; 
using Quartz.Impl; 
using Quartz.Impl.Calendar; 
using Quartz.Listener; 
using Quartz.Impl.Matchers; 
using System.Threading; 

namespace QuartzNET.Samples 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      // Create RAMJobStore instance 
      DirectSchedulerFactory.Instance.CreateVolatileScheduler(5); 
      ISchedulerFactory factory = DirectSchedulerFactory.Instance; 

      // Get scheduler and add object 
      IScheduler scheduler = factory.GetScheduler();   

      StringBuilder history = new StringBuilder("Runtime History: "); 
      scheduler.Context.Add("History", history); 

      JobKey firstJobKey = JobKey.Create("FirstJob", "Pipeline"); 
      JobKey secondJobKey = JobKey.Create("SecondJob", "Pipeline"); 
      JobKey thirdJobKey = JobKey.Create("ThirdJob", "Pipeline"); 

      // Create job and trigger 
      IJobDetail firstJob = JobBuilder.Create<FirstJob>() 
             .WithIdentity(firstJobKey) 
             //.StoreDurably(true) 
             .Build(); 

      IJobDetail secondJob = JobBuilder.Create<SecondJob>() 
             .WithIdentity(secondJobKey)          
             .StoreDurably(true)          
             .Build(); 

      IJobDetail thirdJob = JobBuilder.Create<ThirdJob>() 
             .WithIdentity(thirdJobKey) 
             .StoreDurably(true) 
             .Build(); 

      ITrigger firstJobTrigger = TriggerBuilder.Create() 
              .WithIdentity("Trigger", "Pipeline") 
              .WithSimpleSchedule(x => x 
               .WithMisfireHandlingInstructionFireNow() 
               .WithIntervalInSeconds(5)  
               .RepeatForever()) 
              .Build(); 

      JobChainingJobListener listener = new JobChainingJobListener("Pipeline Chain"); 
      listener.AddJobChainLink(firstJobKey, secondJobKey); 
      listener.AddJobChainLink(secondJobKey, thirdJobKey);    

      scheduler.ListenerManager.AddJobListener(listener, GroupMatcher<JobKey>.GroupEquals("Pipeline")); 

      // Run it all in chain 
      scheduler.Start(); 
      scheduler.ScheduleJob(firstJob, firstJobTrigger); 
      scheduler.AddJob(secondJob, false, true); 
      scheduler.AddJob(thirdJob, false, true); 

      Console.ReadLine(); 
      scheduler.Shutdown(); 
      Console.WriteLine("Scheduler shutdown."); 
      Console.WriteLine(history); 
      Console.ReadLine(); 
     } 
    } 

    class FirstJob : IJob 
    { 
     public void Execute(IJobExecutionContext context) 
     { 
      var history = context.Scheduler.Context["History"] as StringBuilder; 
      history.AppendLine(); 
      history.AppendFormat("First {0}", DateTime.Now);    
      Console.WriteLine("First {0}", DateTime.Now); 
     } 
    } 

    class SecondJob : IJob 
    { 
     public void Execute(IJobExecutionContext context) 
     { 
      var history = context.Scheduler.Context["History"] as StringBuilder; 
      history.AppendLine(); 
      history.AppendFormat("Second {0}", DateTime.Now); 
      Console.WriteLine("Second {0}", DateTime.Now);    
     } 
    } 

    class ThirdJob : IJob 
    { 
     public void Execute(IJobExecutionContext context) 
     { 
      var history = context.Scheduler.Context["History"] as StringBuilder; 
      history.AppendLine(); 
      history.AppendFormat("Third {0}", DateTime.Now); 
      Console.WriteLine("Third {0}", DateTime.Now); 
      Console.WriteLine(); 
     } 
    } 
} 
Các vấn đề liên quan