gpt4 book ai didi

c# - 从 Quartz.net 中正在运行的作业中获取数据

转载 作者:太空狗 更新时间:2023-10-29 22:30:57 26 4
gpt4 key购买 nike

我正在尝试在 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" 状态一半时间应该是“工作”。换句话说,我希望在作业仍在运行时写入和访问作业数据。

是否可以像这样在作业 Execute() 中途从作业中取回数据?

最佳答案

在作业完成之前,作业数据更改似乎不可用。因此,改为使用专用数据结构来监视作业状态。在以下示例中,我使用一个简单的公共(public)静态属性 StatusInfo 公开了状态信息,该属性可随时用于日志记录作业。

还有一个小改动:我用 AppendAllLines 替换了 WriteAllLines

class StatusInfo
{
public DateTime LastRun;
public string Status;
}

[PersistJobDataAfterExecution]
[DisallowConcurrentExecution]
class SimpleFeedbackJob : IInterruptableJob
{
public static StatusInfo StatusInfo;

static SimpleFeedbackJob()
{
SetStatus("idle");
}

public void Interrupt()
{
}

public void Execute(IJobExecutionContext context)
{
SetStatus("working");

Thread.Sleep(5000);

SetStatus("idle");
}

private static void SetStatus(string status)
{
StatusInfo = new StatusInfo
{
LastRun = DateTime.Now,
Status = status
};
}
}

class LogUpdaterJob : IInterruptableJob
{
private string _filepath = @"D:\Temp\Logs\log.txt";

public void Execute(IJobExecutionContext context)
{
List<string> lines = new List<string>();
var statusInfo = SimpleFeedbackJob.StatusInfo;
lines.Add(String.Format("{0,-25} {1,-25}",
statusInfo.LastRun,
statusInfo.Status));
File.AppendAllLines(_filepath, lines);
}

public void Interrupt()
{
}
}

关于c# - 从 Quartz.net 中正在运行的作业中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26298596/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com