1

我们有以下情况。

我们决定在我们的一个 Web 应用程序中使用 webjob 每 30 秒执行一些工作。

为此,我们使用从 Main 函数调用的以下代码:

        static void Run(bool locally)
    {
        JobHostConfiguration config = new JobHostConfiguration();
        if (locally)
        {
            config.Tracing.ConsoleLevel = TraceLevel.Verbose;
            config.UseDevelopmentSettings();
        }config.UseTimers();
        JobHost host = new JobHost(config);
        host.RunAndBlock();
    }

我们在 webjob 中只有由计时器触发的方法:

      public static async Task TimerJob([TimerTrigger("00:00:30")] TimerInfo timer)
    {....

     IEnumerable<IInvitationProcessor> processors = _container.Resolve<IEnumerable<IInvitationProcessor>>();

     ....

   }

where _container - autofac 容器

我们注意到 2 个奇怪的不同事物(看起来它们是相互关联的):

1) 如果我们使用门户停止 webjob,则 webjob 显示为已停止,但实际上它仍在工作 - 我们在门户上的 Log 中看到日志,并且还登录到我们的 webjob 代码写入的 AppInsights。重新启动 WebApp 没有帮助。唯一的

阻止它的方法是删除 webjob(实际上它一直在工作),然后重新启动 WebApp。只有在那之后,网络作业才停止(实际上它消失了)。

PS:我们的 webjob 使用 TimerTrigger,而 TimerTrigger 又使用分布式锁来保证只会调用一个 wbjob 实例(每 30 秒)。因此,本地启动的实例只有在执行了上述操作(删除和重启)后才能获取锁。- 只是“删除\停止”网络作业继续运行的另一个证据。

2)一段时间后(也许在重新部署之后)我们的网络作业开始引发以下异常

在 Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate 处理的 System.IO.FileNotFoundException

在尝试解决依赖项时(看起来很奇怪,因为大多数情况下所有依赖项都已成功解决 - 在部署在 azure Web App 或本地时)

谢谢

4

0 回答 0