1

Я создаю фоновый процесс на основе существующего кода «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(); 
    } 

} 

Я не включая работу, как это трассировку только данные на консоль для отладки.

Вы видите что-то не так?

ответ

1

Я нашел проблему!

Причина в том, что Ninject не смог найти реализацию некоторых необходимых интерфейсов. К сожалению, он был ничего не говорит, просто не работает ...

В случае это помогает кому-то, вот как я нашел это:

  1. В Visual Studio перейдите к Debug -> Исключения
  2. Проверить «Бросок» для исключений Runtime для обычного языка

Затем, когда вы отлаживаете, он покажет вам фактическое исключение с очень ясным сообщением о том, что он не может разрешить IFoo.

HTH

+0

Это означает, что кто-то (что-то в вашей заявке) проглотил исключение. Вероятно, вы должны что-то сделать, чтобы они были хорошо видны разработчику. Он * может * также быть в том, что Ninject.Extensions.Quartz или Ninject.Extensions.Azure проглатывают исключение. Если это так, то это должно измениться. – BatteryBackupUnit

+0

Я проверил код обоих расширений, и оба они не перехватывают исключения, не решая их. Ninject.Extensions.Azure немного подозрительно (хотя вонючий), хотя из-за того, что у него есть «поймать все» с помощью rethrow [здесь] (https://github.com/dtinteractive/Ninject.Extensions.Quartz/blob/81bebfaf3aebb2cdb10b8b9176b3045e81fd0d88/Source/ Ninject.Extensions.Quartz/NinjectJobFactory.cs # L57) – BatteryBackupUnit

+0

Действительно, не мог согласиться больше, но я понятия не имею, почему. Может быть, Ninject или Quartz проглатывают исключение, а не ясно. Фактически сама рабочая роль работала нормально, так как Trace.TraceInformation («Working») фактически показывалась каждую секунду ... –

 Смежные вопросы

  • Нет связанных вопросов^_^