Я создаю фоновый процесс на основе существующего кода «Core» (что означает проект .Core), который я должен использовать.Azure Worker Role + Ninject + Quartz
Основной код основан на Ninject. Поэтому я использую Ninject.Extensions.Azure.
Также ядро, которое я строю, является своего рода фоновой обработкой, которая связана с планированием и для которой мне нужен кварц. Поэтому я установил Ninject.Extensions.Quartz
Теперь моя проблема в том, что Quartz никогда не создаст экземпляр моей работы (независимо от конструктора без параметров).
Глядя на созданный Планировщик, он не выглядит так, как будто он возвращает один из расширений Quart, но я не могу понять, почему.
Вот моя роль точки входа:
public class WorkerRole : NinjectRoleEntryPoint
{
private readonly CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
private readonly ManualResetEvent runCompleteEvent = new ManualResetEvent(false);
private IScheduler scheduler;
private IKernel kernel;
public override void Run()
{
Trace.TraceInformation("Company.Services.Report is running");
try
{
RunAsync(cancellationTokenSource.Token).Wait();
}
finally
{
runCompleteEvent.Set();
}
}
protected override bool OnRoleStarted()
{
// Set the maximum number of concurrent connections
ServicePointManager.DefaultConnectionLimit = 12;
bool result = base.OnRoleStarted();
Trace.TraceInformation("Company.Services.Report has been started");
ConfigureScheduller();
return result;
}
protected override void OnRoleStopped()
{
Trace.TraceInformation("Company.Services.Report is stopping");
cancellationTokenSource.Cancel();
runCompleteEvent.WaitOne();
base.OnRoleStopped();
Trace.TraceInformation("Company.Services.Report has stopped");
}
protected override IKernel CreateKernel()
{
kernel = new StandardKernel();
kernel.Load(new CoreModule());
return kernel;
}
private static async Task RunAsync(CancellationToken cancellationToken)
{
while (!cancellationToken.IsCancellationRequested)
{
Trace.TraceInformation("Working");
await Task.Delay(1000, cancellationToken);
}
}
private void ConfigureScheduller()
{
scheduler = kernel.Get<IScheduler>();
// define the job and tie it to our WorkerJob class
IJobDetail job = JobBuilder.Create<ReportProcessorJob>().Build();
// Trigger the job to run now, and then repeat every 12 hours
ITrigger trigger = TriggerBuilder.Create()
.StartNow() //.WithCronSchedule("0 0 12 * * ?") //TODO: set good schedule start
.WithSimpleSchedule(x => x
.WithIntervalInSeconds(10)
.RepeatForever())
.Build();
// Tell quartz to schedule the job using our trigger
scheduler.ScheduleJob(job, trigger);
scheduler.Start();
}
}
Я не включая работу, как это трассировку только данные на консоль для отладки.
Вы видите что-то не так?
Это означает, что кто-то (что-то в вашей заявке) проглотил исключение. Вероятно, вы должны что-то сделать, чтобы они были хорошо видны разработчику. Он * может * также быть в том, что Ninject.Extensions.Quartz или Ninject.Extensions.Azure проглатывают исключение. Если это так, то это должно измениться. – BatteryBackupUnit
Я проверил код обоих расширений, и оба они не перехватывают исключения, не решая их. Ninject.Extensions.Azure немного подозрительно (хотя вонючий), хотя из-за того, что у него есть «поймать все» с помощью rethrow [здесь] (https://github.com/dtinteractive/Ninject.Extensions.Quartz/blob/81bebfaf3aebb2cdb10b8b9176b3045e81fd0d88/Source/ Ninject.Extensions.Quartz/NinjectJobFactory.cs # L57) – BatteryBackupUnit
Действительно, не мог согласиться больше, но я понятия не имею, почему. Может быть, Ninject или Quartz проглатывают исключение, а не ясно. Фактически сама рабочая роль работала нормально, так как Trace.TraceInformation («Working») фактически показывалась каждую секунду ... –