如何获得执行工作的名字?

时间:2011-01-17 10:11:26

标签: quartz.net

在我的应用程序中,我有一个静态类(单例)需要使用在我的图层中使用的一些环境变量进行初始化,我称之为我的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来实现这一点,因为它们似乎对于每个正在运行的作业都不同。

3 个答案:

答案 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)请注意以下注释:

  • 此方法不支持群集。也就是说,它只返回当前在此Scheduler实例中执行的作业,而不是整个集群中的作业。
  • 请注意,返回的列表是“瞬时”快照,并且一旦返回,执行作业的真实列表可能会有所不同。另请阅读与JobExecutionContext相关的文档 - 特别是如果您正在使用远程处理。

答案 2 :(得分:1)

我不完全确定您在使用您的应用程序时所做的事情,但我会说在执行作业期间肯定可以使用当前正在执行的作业的名称。

在IJob Execute()方法中:

// implementation in IJob
public void Execute(JobExecutionContext context)
{
   // get name here
   string jobName = context.JobDetail.Name;

}

这就是你要找的东西吗?