7

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

4

3 回答 3

16

尝试这个:

public void Execute(IJobExecutionContext context)
{
    var yourJobName = context.JobDetail.Key.Name;
}
于 2013-05-02T15:22:02.150 回答
2

鉴于您上面的陈述:“我遇到的问题是,当两个作业同时触发时,它们可能会覆盖彼此的上下文”,您可能希望通过确保作业不会同时触发来降低应用程序的复杂性。这可以通过实现 IStatefulJob 接口而不是通常的 IJob 接口来实现:http: //quartznet.sourceforge.net/tutorial/lesson_3.html

或者,如果这不是一个选项,您可以通过 Ischeduler.GetCurrentlyExecutingJobs() 方法查询调度程序对象以获取当前正在执行的作业。此方法返回这些作业的 IList,但在使用该方法时请注意以下备注(来自版本 1.0.3 API):

  • 此方法不支持集群。也就是说,它只会返回当前在此调度程序实例中执行的作业,而不是跨整个集群。
  • 请注意,返回的列表是“即时”快照,一旦返回,执行作业的真实列表可能会有所不同。另请阅读与 JobExecutionContext 相关的文档——尤其是在您使用远程处理的情况下。
于 2011-02-20T20:55:53.393 回答
1

我不完全确定你在用你的应用程序做什么,但我会说当前正在执行的作业的名称在作业执行期间肯定是可用的。

在 IJob Execute() 方法内部:

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

}

那是你要找的吗?

于 2011-02-11T18:12:25.943 回答