我正在嘗試在Quartz.net中創建一個作業,該作業將監視所有其他作業的狀態並定期更新日誌文件。一旦該工作完成執行,它只會從工作中獲得數據,但我試圖獲得工作狀態的即時信息。在Quartz.net中從正在運行的作業中獲取數據
我寫了儘可能簡單的測試工作,測試的一半工作(這是令人沮喪的,因爲我不能說實際的代碼中有什麼不同)。這是測試代碼:
的工作
[PersistJobDataAfterExecution]
[DisallowConcurrentExecution]
class SimpleFeedbackJob : IInterruptableJob
{
private DateTime _lastRun;
public string LastRun { get { return _lastRun.ToString(); } }
private string _status;
public void Interrupt()
{
}
public void Execute(IJobExecutionContext context)
{
_status = "working";
_lastRun = DateTime.Now;
JobDataMap jobData = context.JobDetail.JobDataMap;
jobData["time"] = LastRun;
jobData["status"] = _status;
DateTime n = DateTime.Now.AddSeconds(5);
while (DateTime.Now < n) { }
//Thread.Sleep(5000);
_status = "idle";
jobData["status"] = _status;
}
}
public class LogUpdaterJob : IInterruptableJob
{
private IScheduler _scheduler = TaskManager.Scheduler; //This is the same scheduler that will call this task :/
private string _filepath = Configs.BasePath + @"Logs\log.txt";
public void Execute(IJobExecutionContext context)
{
Func<string, string> UpdatedLineData
= name =>
{
JobKey jobKey = _scheduler.GetJobKeys(GroupMatcher<JobKey>.GroupContains("test")).Where(k => k.Name == name).First();
IJobDetail job = _scheduler.GetJobDetail(jobKey);
ITrigger trigger = _scheduler.GetTriggersOfJob(jobKey).First();
string status = job.JobDataMap.Get("time") as string;
string time = job.JobDataMap.Get("status") as string;
return string.Format("{0,-25} {1,-25}", time, status);
};
List<string> lines = new List<string>();
lines.Add(UpdatedLineData("feedback_test"));
File.WriteAllLines(_filepath, lines);
}
public void Interrupt()
{
}
}
相關提取物TaskScheduler
private static IScheduler _scheduler = StdSchedulerFactory.GetDefaultScheduler();
public static IScheduler Scheduler { get { return _scheduler; } }
public void Run()
{
_scheduler.Start();
IJobDetail feedbackJob = JobBuilder.Create<SimpleFeedbackJob>()
.WithIdentity("feedback_test", "test")
.UsingJobData("time", "")
.UsingJobData("status", "")
.Build();
ITrigger feedbackTrigger = TriggerBuilder.Create()
.WithIdentity("feedback_test", "test")
.WithSimpleSchedule(x => x.WithIntervalInSeconds(10)
.RepeatForever())
.Build();
IJobDetail loggerJob = JobBuilder.Create<LogUpdaterJob>()
.WithIdentity("LogUpdater", "Admin")
.Build();
ITrigger loggerTrigger = TriggerBuilder.Create()
.WithIdentity("LogUpdater", "Admin")
.WithSimpleSchedule(x => x.WithIntervalInSeconds(1)
.RepeatForever())
.Build();
_scheduler.ScheduleJob(feedbackJob, feedbackTrigger);
_scheduler.ScheduleJob(loggerJob, loggerTrigger);
}
因此這並輸出一些數據log.txt
,它得到的最後一次運行時是正確的但它只顯示"idle"
的狀態,我認爲這應該是"working"
的一半時間。換言之,我希望在作業仍在運行時將作業數據寫入並訪問。
是否有可能通過這樣的作業Execute()
中途從作業中取回數據?
我是Quartz.NET的新手,因此無法直接回答,但是......也許您可以用不同的方式解決問題?既然看起來你希望你所有的工作都能引出相同的行爲(例如將狀態/進度報告給一個普通的日誌),那麼它是否可以使你的所有工作都從一個基類繼承?只是一個想法... [希望我可以回答的賞金;-)] – InteXX 2014-10-13 21:57:24
@InteXX這正是我在過渡期間所做的(即使我得到了,現在不太可能再改變它了在這個項目中,時間緊迫的時候,這是一個答案) - 但這意味着每次工作要寫時都會鎖定,而且我不相信我已經以100%線程安全的方式完成了這項工作。這也意味着我必須等待工作才能運行,然後才能從中獲得某些信息。但無論哪種方式,當然必須有辦法從Quartz.net的工作中獲取我的特定問題的數據... – Dan 2014-10-13 22:02:15
迄今爲止,我還沒有遇到過一個項目,它沒有按時間:)確定,祝你好運。如果我想到一些事情,我會讓你知道的。 – InteXX 2014-10-13 22:48:14