2014-09-29 42 views
0

異常:::「名稱爲'RemoteServer'的調度程序已經存在。」Quartz Scheduling Client Server

我正在使用單例模式。並嘗試不同的方式,但是當我一次調用它時執行得很好,我的工作執行得很好。但是當我安排第二次工作時,通過例外我陷入了這個問題。 「 」名稱爲「RemoteServer」的調度程序已存在。「 客戶端代碼::

public void SchedulenewAlert() 
    { 
     try 
     { 
      NameValueCollection properties = new NameValueCollection(); 
      properties["quartz.scheduler.instanceName"] = "RemoteClient"; 
      properties["quartz.scheduler.instanceId"] = "AUTO"; 
      // set thread pool info 
     properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool,Quartz"; 
      properties["quartz.threadPool.threadCount"] = "5"; 
      properties["quartz.threadPool.threadPriority"] = "Normal"; 

      // set remoting expoter 
      properties["quartz.scheduler.proxy"] = "true"; 
properties["quartz.scheduler.proxy.address"] = "tcp://10.0.0.46:555/QuartzScheduler";/QuartzScheduler"; 
      // First we must get a reference to a scheduler 
      ISchedulerFactory sf = new StdSchedulerFactory(properties); 
      IScheduler sched = sf.GetScheduler(); 

      String jobname = "remotelyAddedJob2" + DateTime.Now.Ticks.ToString(); 
      IJobDetail job = JobBuilder.Create<MyTest>() 
       .WithIdentity(jobname, "default1") 
       .Build(); 

      JobDataMap map = job.JobDataMap; 
      map.Put("msg", "Your remotely added job has executed!"); 

      ITrigger trigger = TriggerBuilder.Create() 
       .WithIdentity("remotelyAddedTrigger", "default") 
       .ForJob(job.Key) 
       .WithCronSchedule("/5 * * ? * *") 
       .Build(); 

var TestTrigger = TriggerBuilder.Create().ForJob(job).WithIdentity("remotelyAddedTrigger2", "default1") 
       .StartNow().Build(); 


DateTimeOffset pullReportsToQueuejobCalendar = DateBuilder.DateOf(9, 30, 17, 1, 6, 2005); 
string trgName = "pullReportsFromQueuejobTrigger" + DateTime.Now.Ticks.ToString(); 
      var pullReportsToQueuejobTrigger = new CalendarIntervalTriggerImpl 
      { 
       StartTimeUtc = pullReportsToQueuejobCalendar, 
       Name = trgName, 
       RepeatIntervalUnit = IntervalUnit.Second, 
       RepeatInterval = 40000 // every --- seconds 
      }; 
      /// while (true) 
      // { 


      // schedule the job 
      sched.ScheduleJob(job, pullReportsToQueuejobTrigger); 

     } 
     catch (Exception ex) 
     { 
      string lines = "==================Exception Client===========================\n" + DateTime.Now.TimeOfDay.ToString() + "\n====================END=========================\n"; 
System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\ExceptionClient.txt", true); 
      file.WriteLine(lines); 
      file.Close(); 
     } 
     ///} 
    } 

============================ 服務器職位代碼....

public virtual void Execute(IJobExecutionContext context) 
    { 
     // This job simply prints out its job name and the 
     // date and time that it is running 
     try 
     { 
      string lines = "==================StartClient===========================\n" 
      + DateTime.Now.TimeOfDay.ToString() + "\n====================END=========================\n"; 
      System.IO.StreamWriter file = new System.IO.StreamWriter("d:\\testClient.txt", true); 
      file.WriteLine(lines); 
      file.Close(); 
     } 
     catch(Exception ex) 
     { 

      string lines = "==================Exception at Client Calling===========================\n" 
      + DateTime.Now.TimeOfDay.ToString() + "\n====================END=========================\n"; 
      System.IO.StreamWriter file = new System.IO.StreamWriter("d:\\testExceptionClient.txt", true); 
      file.WriteLine(lines); 
      file.WriteLine("EXception........... <<<< Message "+ex.Message); 
      file.Close(); 
} 
} 
+0

我已解決它只是訪問修改問題:) – 2014-09-30 07:57:00

回答

0

混淆邏輯來處理事情。
這裏是管理石英

 public class SchedularHandler 
     { 

      private static IScheduler _scheduler; 

      public IScheduler Scheduler 
      { 
       get 
       { 
        if (_scheduler == null) 
         _scheduler = GetScheduler(); 
        return _scheduler; 
       } 

      } 
      public SchedularHandler() 
      { 

       if (_scheduler == null) 
        _scheduler = GetScheduler(); 

       if (!_scheduler.IsStarted) 
        _scheduler.Start(); 
      } 
      private NameValueCollection GetProperties() 
      { 
       NameValueCollection properties = new NameValueCollection(); 
       properties["quartz.scheduler.instanceName"] = "RemoteClient"; 
       properties["quartz.scheduler.instanceId"] = "AUTO"; 
       // set thread pool info 
       properties["quartz.threadPool.type"] = "Quartz.Simpl.SimpleThreadPool,Quartz"; 
       properties["quartz.threadPool.threadCount"] = "5"; 
       properties["quartz.threadPool.threadPriority"] = "Normal"; 

       // set remoting expoter 
       properties["quartz.scheduler.proxy"] = "true"; 
       properties["quartz.scheduler.proxy.address"] = "tcp://10.0.0.46:555/QuartzScheduler"; 
       // First we must get a reference to a scheduler 
       return properties; 

      } 
      private IScheduler GetScheduler() 
      { 

       var properties = GetProperties(); 
       var sf = new StdSchedulerFactory(properties); 
       return sf.GetScheduler(); 

      } 
     public DateTimeOffset ScheduleJob(IJobDetail jobDetail, ITrigger trigger) 
     { 

      return _scheduler.ScheduleJob(jobDetail, trigger); 
     } 

     } 

的好辦法///////////////////////////////// //////////////////////
你ScheduleAndAlert()方法是這樣的

public void SchedulenewAlert() 
    { 
     try 
     { 
      SchedularHanlder schedHandler = new SchedularHanlder() 

      String jobname = "remotelyAddedJob2" + DateTime.Now.Ticks.ToString(); 
      IJobDetail job = JobBuilder.Create<MyTest>() 
       .WithIdentity(jobname, "default1") 
       .Build(); 

      JobDataMap map = job.JobDataMap; 
      map.Put("msg", "Your remotely added job has executed!"); 

      ITrigger trigger = TriggerBuilder.Create() 
       .WithIdentity("remotelyAddedTrigger", "default") 
       .ForJob(job.Key) 
       .WithCronSchedule("/5 * * ? * *") 
       .Build(); 

     var TestTrigger =  TriggerBuilder.Create().ForJob(job).WithIdentity("remotelyAddedTrigger2", "default1") 
       .StartNow().Build(); 


DateTimeOffset pullReportsToQueuejobCalendar = DateBuilder.DateOf(9, 30, 17, 1, 6, 2005); 
string trgName = "pullReportsFromQueuejobTrigger" + DateTime.Now.Ticks.ToString(); 
      var pullReportsToQueuejobTrigger = new CalendarIntervalTriggerImpl 
      { 
       StartTimeUtc = pullReportsToQueuejobCalendar, 
       Name = trgName, 
       RepeatIntervalUnit = IntervalUnit.Second, 
       RepeatInterval = 40000 // every --- seconds 
      }; 
      /// while (true) 
      // { 


      // schedule the job 
      schedHandler.ScheduleJob(job, pullReportsToQueuejobTrigger); 

     } 
     catch (Exception ex) 
     { 
      string lines = "==================Exception Client===========================\n" + DateTime.Now.TimeOfDay.ToString() + "\n====================END=========================\n"; 
System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\ExceptionClient.txt", true); 
      file.WriteLine(lines); 
      file.Close(); 
     } 
     ///} 
    } 
1

這爲我做的伎倆:

IScheduler sched = sf.GetScheduler("scheduler name"); 
     if (sched == null) 
     { 
      sched = sf.GetScheduler(); 
     }