我正在使用Quartz.Net windows服务在具有Castle windsor依赖注入的MVC4应用程序上运行远程作业。我想安排在执行参考模型接口上访问模型函数的作业。Quartz.Net使用DI注册作业
这是我的工作类:
public class MyJob: IJob
{
private static readonly ILog logger = LogManager.GetLogger(typeof(MyJob));
private readonly IQuartzModel _quartzModel;
public MyJob(IQuartzModel quartzModel)
{
this._quartzModel = quartzModel;
}
public void Execute(IJobExecutionContext context)
{
quartzModel.DoModelFunction();
}
}
创建我自己的IJobFactory的情况是这样的:
public class WindsorJobFactory : IJobFactory
{
private readonly IWindsorContainer _container;
public WindsorJobFactory(IWindsorContainer container)
{
_container = container;
}
public IJob NewJob(TriggerFiredBundle bundle)
{
if (bundle == null)
{
throw new ArgumentNullException("bundle");
}
return (IJob)_container.Resolve(bundle.JobDetail.JobType);
}
}
我创建这些注册与城堡DI
IJobFactory jobFactory = new WindsorJobFactory(container);
container.Register(Component.For<IJobFactory>().Instance(jobFactory));
container.Register(Component.For<IQuartzModel>().ImplementedBy<QuartzModel>());
var jobTypes = GetJobTypes();
foreach (Type jobType in jobTypes)
{
container.Register(Component.For(jobType).ImplementedBy(jobType).LifeStyle.Transient);
}
}
private static IEnumerable<Type> GetJobTypes()
{
return AppDomain.CurrentDomain.GetAssemblies().ToList()
.SelectMany(s => s.GetTypes())
.Where(p => typeof(IJob).IsAssignableFrom(p) && !p.IsInterface);
}
而且我有注册的调度程序服务设置和QuartzTaskSchedulingService,我创建了IScheduler,ISchedulerF actory和StdSchedulerFactory实例并创建作业。
container.Register(Component.For<IQuartzSchedulingServiceSettings>()
.UsingFactoryMethod(QuartzSchedulingServiceConfiguration.GetConfiguration)
.LifeStyle.PerWebRequest);
container.Register(Component.For<IQuartzTaskSchedulingService>()
.ImplementedBy<QuartzTaskSchedulingService>()
.LifeStyle.PerWebRequest);
当我尝试在我的Quartz.Net窗口服务日志执行MyJob我得到以下错误:
System.ArgumentException: Cannot instantiate type which has no empty constructor
如果我执行MyJob没有传递接口在构造函数中,它成功地执行。
要运行这个工作,我从我的控制器初始化QuartzTaskSchedulingService并执行作业创建方法。 QuartzTaskSchedulingService内部我有ISchedulerFactory,IScheduler的初始化。在构造函数中,我使用IQuartzSchedulingServiceSettings提供的连接设置来获取调度程序的实例。
public QuartzTaskSchedulingService(IQuartzSchedulingServiceSettings settings)
{
this.settings = settings;
Address = string.Format("tcp://{0}:{1}/{2}", settings.ServerAddress, settings.ServerPort, settings.SchedulerBindName);
schedulerFactory = new StdSchedulerFactory(GetProperties(Address, settings.ServerInstanceName));
try
{
quartzScheduler = schedulerFactory.GetScheduler();
if (!quartzScheduler.IsStarted)
{
quartzScheduler.Start();
}
}
}
之后,它跳转到创造就业的方法
public void TestJobShot(Type t)
{
IJobDetail job = JobBuilder.Create(t)
.WithIdentity("MyJob", "Common")
.RequestRecovery()
.Build();
var trigger = (ICronTrigger)TriggerBuilder.Create()
.WithIdentity("MyJob", "Common")
.WithCronSchedule("0 0/1 * 1/1 * ? *")
.StartAt(DateTime.UtcNow)
.WithPriority(1)
.Build();
quartzScheduler.ScheduleJob(job, trigger);
}
它成功地创建从我AdoJobStore执行作业和日程表它。只要它执行我得到以下问题
我已经尝试了很多解决方案来得到这个工作,但他们都已经结束unsuccesfuly 我是否缺少某种类型的注册或我做错了什么?
谢谢!
可以请你展示如何执行这项工作? – Cybermaxs
Cybermaxs - Betclic,我编辑帖子回答你的问题。谢谢 – user3170957