如果作业实例化失败,Quartz.NET不会抛出异常

时间:2017-03-07 11:56:55

标签: castle-windsor quartz.net

我正在通过城堡windsor使用Quartz.NET,一切正常,但其中一个工作使用了Identity依赖,如果我没有注册依赖,它不会抛出异常。

注册码

 static void RegisterTriggerListeners(IWindsorContainer container)
    {
        container.Register(DefaultInterfaces());
        container.Register(Connections());
        container.Register(
            Component.For<Quartz.IScheduler>().Instance(StdSchedulerFactory.GetDefaultScheduler()),
            Component.For<IJobFactory>().ImplementedBy<WindsorJobFactory>().DependsOn(Dependency.OnValue<IWindsorContainer>(container)).LifestyleTransient(),

            // See: http://blog.nikosbaxevanis.com/2012/07/16/using-the-web-api-dependency-resolver-with-castle-windsor-scoped-lifetime/
            // public void Install(IWindsorContainer container, IConfigurationStore store) section near the end of the page
            Classes.FromThisAssembly().BasedOn<IHttpController>().LifestyleScoped()
            //,
            //Component
            //  .For<IIdentity>()
            //  .UsingFactoryMethod(WindowsIdentity.GetCurrent)
            //  .LifestyleSingleton()
            );

        RegisterJobs(container);
    }

使用Identity

的工作
class ValidationStep : Step<ITransactionLineValidationStep, TransactionLine>, ITransactionLineValidationStep
    {
        private IImpersonatedWebClient ImpersonatedWebClient { get; }
        private ISettings Settings { get; }
        readonly IIdentity _identity;
        private string ValidationAddress { get; set; }
        private const string ValidationResultError = "Error";

        public ValidationStep(IImpersonatedWebClient impersonatedWebClient,
            ISettings settings,
            IIdentity identity)
        {
            ImpersonatedWebClient = impersonatedWebClient;
            Settings = settings;
            _identity = identity;
        }

如果我注释掉身份注册 - 调度程序运行正常,但停止使用作业运行而不抛出异常。 如果没有注册依赖,是否有任何方式我会收到通知或抛出异常?

1 个答案:

答案 0 :(得分:2)

它可能不是Castle问题,因为当组件解析期间缺少某些非可选(构造函数)依赖项时,Castle总是抛出异常。

你看到的是Quartz.NET设计的结果 - 如果在创建作业期间抛出异常(使用作业工厂方法NewJob),Quartz会抓住它并将其转换为SchedulerException(参见{{ 3}})后来被吞噬(见JobRunShell line 94)。同时,Quartz调用附加到它的调度程序<{p>}的任何SchedulerError的{​​{1}}方法

所有这一切的原因是为了保护Quartz调度程序线程免于破坏应用程序。 如果您只想在开发期间检查这一点,只需配置Quartz日志记录(使用Common.Logging框架 - 请参阅QuartzSchedulerThread line 420),您就会在日志中看到这样的错误。否则,您可以documentation - at the bottom ISchedulerListener来处理ISchedulerListener&#34;事件&#34;并做任何你想做的事......

注意:提供的源代码链接来自master分支,这是尚未发布的Quartz.NET 3.x版本,但2.x版本的工作原理相同......