У меня есть разные классы как потомки базового класса (Рабочий). Каждый из этих классов имеет свое собственное кварцевое задание и триггер и обратный вызов .Обратный вызов класса из задания кварца
public class Worker1 : Worker, ICallback
{
IScheduler scheduler;
public Worker1(IScheduler scheduler)
: base("Worker1")
{
this.scheduler = scheduler;
IJobDetail job = JobBuilder.Create<MonitorJob>()
.WithIdentity(name + "Job")
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity(name + "Trigger")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(1)
.RepeatForever())
.Build();
scheduler.ScheduleJob(job, trigger);
}
public void Callback()
{
Console.WriteLine(name + " callback " + DateTime.Now.ToLongTimeString());
}
}
Теперь я хочу, чтобы на триггер job1 (from worker1) был обратный вызов employee1.callback. То же самое с job2 (from worker2) обратный вызов для worker2.callback.
С autofac Я могу ввести обратный вызов в свою работу, но я могу только ввести общий обратный вызов, а не как мне по одному для каждого класса.
public class MonitorJob : IJob
{
ICallback callback;
public MonitorJob(ICallback callback)
{
this.callback = callback;
}
public void Execute(IJobExecutionContext context)
{
callback.Callback();
}
}
мой основной класс создает autofac контейнер
container = ConfigureContainer(new ContainerBuilder()).Build();
using (container.BeginLifetimeScope())
{
workers.Add(container.Resolve<Worker1>());
workers.Add(container.Resolve<Worker2>());
}
var factory = container.Resolve<ISchedulerFactory>();
var scheduler = factory.GetScheduler();
scheduler.Start();
internal static ContainerBuilder ConfigureContainer(ContainerBuilder cb)
{
cb.RegisterModule(new QuartzAutofacFactoryModule());
cb.RegisterModule(new QuartzAutofacJobsModule(typeof(QuartzScheduler.MonitorJob).Assembly));
cb.RegisterType<Worker1>().AsSelf();
cb.RegisterType<Worker2>().AsSelf();
return cb;
}
Autofac создает работу, а также может вводить его с обратным вызовом, однако я хочу право обратного вызова из класса рабочего, который «владеет» работой ,
Как это возможно?
В противном случае мне нужно каким-то образом распространить один общий обратный вызов на соответствующий рабочий класс.
Спасибо заранее
Спасибо за ваш ответ, однако обязательный ICallback для IJob уже работал, как уже упоминалось в моем вопросе, но, конечно, только для одного экземпляра обратного вызова, где мне пришлось бы распространять событие на соответствующий рабочий экземпляр. Я не хочу связывать его непосредственно с рабочим1, поскольку он также должен запускать другие экземпляры рабочих, например. worker2.callback до рабочегоN. Поэтому я думаю, что подход Keyed тоже не подойдет. Я мог бы создать работу на одного работника, полученного из моего общего MonitorJob, который можно было бы решить, но я надеялся, что это будет возможно с помощью общего подхода. – vknapp
Я не уверен, что понял ваши потребности. Когда запускается «MonitorJob», который должен использоваться «ICallback»? Все они ? если это так, вы можете добавить зависимость от 'IEnumerable', если вы хотите указать конкретный, как вы указываете, какой 'ICallback' должен использовать' IJob'? –
У каждого работника есть свой собственный монитор, который должен назвать его собственным обратным вызовом. Мне удалось получить Worker1Job от Monitorjob, в котором, как вы сказали, есть рабочий класс с clallback. Недостаток - мне нужна работа для каждого рабочего класса. однако это работает. – vknapp