gpt4 book ai didi

quartz.net - 如何在单独的 AppDomain 中运行 Quartz.NET 作业?

转载 作者:行者123 更新时间:2023-12-04 20:19:26 25 4
gpt4 key购买 nike

是否可以在单独的 AppDomain 中运行 Quartz.NET 作业?如果是这样,如何实现?

最佳答案

免责声明:我没有尝试过这个,这只是一个想法。甚至这些代码都没有被编译。

创建一个自定义作业工厂,为您的实际作业创建包装器。让这个包装器实现 Execute方法是创建一个新的应用程序域并在该应用程序域中运行原始作业。

更详细地:创建一个新类型的工作,比如 IsolatedJob : IJob .让这个作业将它应该封装的作业类型作为构造函数参数:

internal class IsolatedJob: IJob
{
private readonly Type _jobType;

public AutofacJob(Type jobType)
{
if (jobType == null) throw new ArgumentNullException("jobType");
_jobType = jobType;
}

public void Execute(IJobExecutionContext context)
{
// Create the job in the new app domain
System.AppDomain domain = System.AppDomain.CreateDomain("Isolation");
var job = (IJob)domain.CreateInstanceAndUnwrap("yourAssembly", _jobType.Name);
job.Execute(context);
}
}

您可能需要创建一个 IJobExecutionContext 的实现。继承自 MarshalByRefObject和代理调用原始 context目的。给定 IJobExecutionContext 的其他对象的数量提供访问,我很想用 NotImplementedException 实现许多成员。因为在作业执行期间不需要大多数。

接下来您需要自定义作业工厂。这一点更容易:

internal class IsolatedJobFactory : IJobFactory
{
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return NewJob(bundle.JobDetail.JobType);
}

private IJob NewJob(Type jobType)
{
return new IsolatedJob(jobType);
}
}

最后,您需要指示 Quartz 使用这个作业工厂,而不是开箱即用的。使用 IScheduler.JobFactory属性 setter 并提供 IsolatedJobFactory 的新实例.

关于quartz.net - 如何在单独的 AppDomain 中运行 Quartz.NET 作业?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8392596/

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