Azure工作者角色+;Ninject+;石英

Azure工作者角色+;Ninject+;石英,azure,ninject,quartz-scheduler,azure-worker-roles,ninject-extensions,Azure,Ninject,Quartz Scheduler,Azure Worker Roles,Ninject Extensions,我正在基于现有的“核心”代码(意味着有一个.Core项目)构建一个后台流程,我需要使用它 核心代码基于Ninject。所以我就用这个 另外,我正在构建的核心是某种与调度有关的后台处理,为此我需要石英。因此我安装了 现在我的问题是Quartz永远不会创建我的作业的实例(不管是无参数构造函数) 查看创建的调度程序,它看起来不像是从Quart扩展返回的调度程序,但我不知道为什么 以下是我的角色入口点: 公共类WorkerRole:NinjectRoleEntryPoint { 私有只读Cancella

我正在基于现有的“核心”代码(意味着有一个.Core项目)构建一个后台流程,我需要使用它

核心代码基于Ninject。所以我就用这个

另外,我正在构建的核心是某种与调度有关的后台处理,为此我需要石英。因此我安装了

现在我的问题是Quartz永远不会创建我的作业的实例(不管是无参数构造函数)

查看创建的调度程序,它看起来不像是从Quart扩展返回的调度程序,但我不知道为什么

以下是我的角色入口点:

公共类WorkerRole:NinjectRoleEntryPoint
{
私有只读CancellationTokenSource CancellationTokenSource=新的CancellationTokenSource();
私有只读ManualResetEvent runCompleteEvent=新的ManualResetEvent(假);
专用IScheduler调度器;
私有IKernel内核;
公共覆盖无效运行()
{
Trace.TraceInformation(“Company.Services.Report正在运行”);
尝试
{
RunAsync(cancellationTokenSource.Token).Wait();
}
最后
{
runCompleteEvent.Set();
}
}
受保护的覆盖布尔OnRoleStarted()
{
//设置最大并发连接数
ServicePointManager.DefaultConnectionLimit=12;
bool result=base.onrolestart();
Trace.TraceInformation(“Company.Services.Report已启动”);
配置调度程序();
返回结果;
}
受保护的覆盖无效OnRoleStopped()
{
Trace.TraceInformation(“Company.Services.Report正在停止”);
cancellationTokenSource.Cancel();
runCompleteEvent.WaitOne();
base.OnRoleStopped();
Trace.TraceInformation(“Company.Services.Report已停止”);
}
受保护的覆盖IKernel CreateKernel()
{
内核=新的标准内核();
Load(新的CoreModule());
返回内核;
}
专用静态异步任务RunAsync(CancellationToken CancellationToken)
{
而(!cancellationToken.IsCancellationRequested)
{
跟踪。跟踪信息(“工作”);
等待任务。延迟(1000,取消令牌);
}
}
私有void配置Scheduller()
{
调度器=kernel.Get();
//定义作业并将其绑定到WorkerJob类
IJobDetail job=JobBuilder.Create().Build();
//立即触发作业运行,然后每12小时重复一次
ITrigger trigger=TriggerBuilder.Create()
.StartNow()//.WithCronSchedule(“0 0 12**?”)//TODO:设置良好的计划开始
.使用SimpleSchedule(x=>x
.间隔秒(10)
.RepeatForever())
.Build();
//告诉quartz使用触发器安排作业
ScheduleJob(作业,触发器);
scheduler.Start();
}
}
我不包括这个作业,因为它只是出于调试目的将信息跟踪到控制台

你看到里面有什么问题吗?

我发现了问题

出现此问题的原因是Ninject无法找到某些所需接口的实现。可悲的是,它什么也没说,只是不起作用

如果它对某人有帮助,下面是我如何发现它的:

  • 在Visual Studio中,转到调试->异常
  • 检查公共语言运行时异常的“抛出”
  • 然后,当您调试时,它将向您显示实际的异常,并显示一条非常清楚的消息,说明它无法解析IFoo


    HTH

    这意味着有人(应用程序中的某些内容)吞并了异常。您可能应该采取一些措施,使它们对开发人员清晰可见。也可能是Ninject.Extensions.Quartz或Ninject.Extensions.Azure正在吞并异常。如果是这样的话,我们应该改变这一点。我已经检查了两个扩展的代码,它们都不会捕获异常,除非重新引用它们。虽然Ninject.Extensions.Azure有点可疑(有点臭),因为它有一个“包罗万象”和一个改头换面,但我不知道为什么。可能是Ninject或Quartz吞下了异常,而不是清晰地破坏。实际上,工作者角色本身作为跟踪工作正常。事实上,跟踪信息(“工作”)每秒钟都会显示一次……我从未经历过ninject吞咽异常,我只是检查了ninject.Extensions.Quartz和ninject.Extensions.Azure,确认它们没有这样做。所以它要么是你的代码中的一个吞咽
    捕获
    ,要么就是你刚刚处理了
    未观察到的taskeexception
    /
    AppDomain.unhandledeexception
    或者类似的事情。从.net 4.5开始,未观察到的任务异常不会导致应用程序终止,因此完全有可能您只会看到副作用,而不会看到异常。我实际上查看了Azure one的代码,我不确定是否会保留它。看看它能做什么,我想我自己也能做到。