Azure webjob - QueueTrigger停止触发

时间:2015-11-23 04:13:22

标签: azure azure-webjobs azure-webjobssdk

我正在使用推荐的设置运行azure webjobs SDK控制台应用程序(连续):

public static void ProcessQueueMessage([QueueTrigger("logqueue")] string logMessage, TextWriter logger)

我正在运行的azure队列中有大约6000条消息,我在本地运行web作业,作为控制台应用程序。

我遇到的问题是在处理0到30条消息之后处理会随机停止。控制台保持打开状态,但不再显示控制台消息。

例如,它可能只处理2条消息:

Executing: 'Functions.ProcessQueueMessage' - Reason: 'New queue message detected on 'QueueName'.'
Executed: 'Functions.ProcessQueueMessage' (Succeeded)
Executing: 'Functions.ProcessQueueMessage' - Reason: 'New queue message detected on 'QueueName'.'
Executed: 'Functions.ProcessQueueMessage' (Succeeded)

然后,没什么。我的互联网连接似乎没有任何问题,我无法将问题追溯到任何特定的消息。

有没有其他人遇到过这个SDK的问题?

更新

我确保通过删除nuget软件包然后重新运行install-package Microsoft.Axure.Webjobs来使用所有依赖项的正确版本。我现在正在使用webjobs版本1.1.0,该版本已经提供了4.3版的azure存储。

根据Matthew的建议,我已经删除了azure webjobs的源代码,以确定进程冻结的位置。一旦冻结发生,我暂停执行并检查正在运行的线程我认为是Microsoft.Azure.WebJobs.Host.CompositeTraceWriter

中的罪魁祸首
    protected virtual void InvokeTextWriter(TraceEvent traceEvent)
    {
        if (_innerTextWriter != null)
        {
            string message = traceEvent.Message;
            if (!string.IsNullOrEmpty(message) &&
                 message.EndsWith("\r\n", StringComparison.OrdinalIgnoreCase))
            {
                // remove any terminating return+line feed, since we're
                // calling WriteLine below
                message = message.Substring(0, message.Length - 2);
            }

            _innerTextWriter.WriteLine(message);
            if (traceEvent.Exception != null)
            {
                _innerTextWriter.WriteLine(traceEvent.Exception.ToDetails());
            }
        }
    }

它冻结的线是第66行:_innerTextWriter.WriteLine(message);

_innerTextWriterSystem.IO.TextWriter.SyncTextWriter

的一个实例

这个类或它的使用方式是否有可能存在死锁问题?

一些注意事项:

  • 我在调试器中运行,所以在这种情况下我相信文本编写器会在内部转发到控制台
  • 我通过config.Queues.BatchSize = 1;将我的批量大小设置为1,不确定这是否重要

我目前正致力于在另一台计算机上设置环境,以便我可以看到它是否可以在本机(表面书)以外的其他地方重现。

更新

问题是我不了解新的Windows 10命令提示符是如何工作的。无论何时单击命令窗口,它都会进入"选择" 完全暂停执行该过程的模式。

基本上:https://superuser.com/questions/419717/windows-command-prompt-freezing-randomly?newreg=ece53f5584254346be68f85d1fd2f18d

你可以告诉它处于这种状态,因为它会在窗口标题前加上单词"选择":

frozen command window

您必须再次按Enter键或再次单击才能再次进入。

所以,最后两条评论:

1)命令窗口令人难以置信的混乱和不直观的行为!

2)我希望有些管理员可以通过删除这个问题来羞辱我给自己和家人带来的耻辱。

要摆脱这种奇怪的行为,您可以禁用QuickEdit模式:

disable QuickEdit Mode

1 个答案:

答案 0 :(得分:1)

奇怪。当它处于卡住状态时,您是否可以尝试向队列添加新队列消息并查看是否触发?你确定你的功能不在内部吗?您使用的是哪个版本的SDK?您也可以尝试升级到我们刚刚发布的v1.1.0。如果队列中确实有一堆消息等待处理,我就无法想到会导致这种情况发生的任何事情。 SDK中的队列侦听器应该突然显示,并行读取批量消息并将它们分派给您的函数。你有没有改变任何JobHostConfiguration.Queues配置旋钮?您还没有强制更新Azure SDK的版本,让您获得比WebJobs SDK更高的支持吗?

如果您无法解决这个问题,另一个选择可能是克隆SDK,构建它并在本地调试它。 repo is hereis here。主队列处理循环enter image description here