在我的应用程序中,我有一个静态类(单例)需要使用在我的图层中使用的一些环境变量进行初始化,我称之为我的applicationContext。这反过来又有客户和用户的背景。
当每个作业运行时,它会根据情况修改这些客户和用户上下文。 我遇到的问题是,当两个作业同时发生时,它们可能会覆盖彼此的上下文,因此我需要为每个正在运行的作业保留多个用户和客户上下文,我需要能够通过某种方式能够看到正确的上下文目前的工作是什么。
是否有可能以某种方式获取有关当前正在执行的quartz.net作业的信息?
我正在设想这样的东西,其中“currentQuartzJob.Name”组成并且是我缺少的部分:
public class MyContextImpl : IApplicationContext {
private Dictionary<string,subContexts> allCustomerContexts;
public string CurrentContext
{
get { return allCustomerContexts[currentQuartzJob.Name] };
}
}
编辑:
我认为不可能做我想做的事,那就是能够在一个不了解Quartz.Net的类中获得执行作业的名称。
我真正需要的是为每项工作保留不同背景的方法。我设法通过查看执行线程的ID来实现这一点,因为它们似乎对于每个正在运行的作业都不同。
答案 0 :(得分:13)
试试这个:
public void Execute(IJobExecutionContext context)
{
var yourJobName = context.JobDetail.Key.Name;
}
答案 1 :(得分:2)
鉴于上述声明:“我遇到的问题是,当两个作业同时触发时,它们可能会覆盖彼此的上下文”,您可能希望通过确保作业不会同时触发来降低应用程序的复杂性。这可以通过实现IStatefulJob接口而不是通常的IJob接口来实现:http://quartznet.sourceforge.net/tutorial/lesson_3.html
或者,如果这不是一个选项,您可以通过Ischeduler.GetCurrentlyExecutingJobs()方法查询当前正在执行的作业的Scheduler对象。此方法返回这些作业的IList,但在使用该方法时(从版本1.0.3 API)请注意以下注释:
答案 2 :(得分:1)
我不完全确定您在使用您的应用程序时所做的事情,但我会说在执行作业期间肯定可以使用当前正在执行的作业的名称。
在IJob Execute()方法中:
// implementation in IJob
public void Execute(JobExecutionContext context)
{
// get name here
string jobName = context.JobDetail.Name;
}
这就是你要找的东西吗?