Azure webjob - QueueTrigger 停止触发
Azure webjob - QueueTrigger stops triggering
我是 运行 具有推荐设置的 azure webjobs SDK 控制台应用程序(连续):
public static void ProcessQueueMessage([QueueTrigger("logqueue")] string logMessage, TextWriter logger)
我运行反对的天蓝色queue里面有~6000条消息,我运行本地web-job,作为控制台应用程序。
我遇到的问题是在处理 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 包然后 re-running install-package Microsoft.Axure.Webjobs 确保我使用了所有依赖项的正确版本。我现在使用的是 webjobs 版本 1.1.0,它引入了 Azure 存储的 4.3 版本。
按照 Matthew 的建议,我已经下载了 azure webjobs 的源代码以确定进程冻结的位置。一旦 freez-up 发生,我暂停执行并检查 运行 线程以寻找我认为是 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);
_innerTextWriter
是 System.IO.TextWriter.SyncTextWriter
的实例
这个 class 或它的使用方式是否可能存在一些死锁问题?
一些注意事项:
- 我在调试器中 运行,所以在这种情况下,我相信文本编写器正在内部转发到控制台
- 我通过
config.Queues.BatchSize = 1;
将批量大小设置为 1,不确定这是否重要
我目前正在另一台计算机上设置环境,以便我可以查看它是否可以在本机(surface book)以外的其他地方重现。
更新
问题是我不理解新的 windows 10 命令提示符是如何工作的。任何时候单击命令 window,它都会进入 "select" 模式, 完全暂停进程的执行。
你可以看出它处于这种状态,因为它会在 window 标题前加上单词 "Select":
您必须按回车键或再次单击才能再次运行。
所以,最后两条评论:
1) 命令 window!
的行为令人难以置信的混乱和 un-intuitive
2) 删除这个问题给自己和家人带来的耻辱,希望有管理员能怜悯一下
要摆脱这种奇怪的行为,您可以禁用快速编辑模式:
奇怪。当它处于这种卡住状态时,您是否可以尝试向队列中添加一条新的队列消息,看看是否会触发?您确定您的功能没有在内部挂起吗?您使用的是什么版本的 SDK?您也可以尝试升级到我们上周刚刚发布的 v1.1.0。如果队列中真的有一堆消息等待处理,我想不出有什么会导致这种情况。 SDK 中的队列侦听器应该顺畅运行,并行读取成批消息并将它们分派给您的函数。您是否更改了任何 JobHostConfiguration.Queues 配置旋钮?您没有强制更新 Azure SDK 的版本是否高于 WebJobs SDK 支持的版本?
如果您无法解决这个问题,另一种选择可能是克隆 SDK,在本地构建和调试它。 repo is here. The main queue processing loop is here.
我是 运行 具有推荐设置的 azure webjobs SDK 控制台应用程序(连续):
public static void ProcessQueueMessage([QueueTrigger("logqueue")] string logMessage, TextWriter logger)
我运行反对的天蓝色queue里面有~6000条消息,我运行本地web-job,作为控制台应用程序。
我遇到的问题是在处理 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 包然后 re-running install-package Microsoft.Axure.Webjobs 确保我使用了所有依赖项的正确版本。我现在使用的是 webjobs 版本 1.1.0,它引入了 Azure 存储的 4.3 版本。
按照 Matthew 的建议,我已经下载了 azure webjobs 的源代码以确定进程冻结的位置。一旦 freez-up 发生,我暂停执行并检查 运行 线程以寻找我认为是 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);
_innerTextWriter
是 System.IO.TextWriter.SyncTextWriter
这个 class 或它的使用方式是否可能存在一些死锁问题?
一些注意事项:
- 我在调试器中 运行,所以在这种情况下,我相信文本编写器正在内部转发到控制台
- 我通过
config.Queues.BatchSize = 1;
将批量大小设置为 1,不确定这是否重要
我目前正在另一台计算机上设置环境,以便我可以查看它是否可以在本机(surface book)以外的其他地方重现。
更新
问题是我不理解新的 windows 10 命令提示符是如何工作的。任何时候单击命令 window,它都会进入 "select" 模式, 完全暂停进程的执行。
你可以看出它处于这种状态,因为它会在 window 标题前加上单词 "Select":
您必须按回车键或再次单击才能再次运行。
所以,最后两条评论:
1) 命令 window!
的行为令人难以置信的混乱和 un-intuitive2) 删除这个问题给自己和家人带来的耻辱,希望有管理员能怜悯一下
要摆脱这种奇怪的行为,您可以禁用快速编辑模式:
奇怪。当它处于这种卡住状态时,您是否可以尝试向队列中添加一条新的队列消息,看看是否会触发?您确定您的功能没有在内部挂起吗?您使用的是什么版本的 SDK?您也可以尝试升级到我们上周刚刚发布的 v1.1.0。如果队列中真的有一堆消息等待处理,我想不出有什么会导致这种情况。 SDK 中的队列侦听器应该顺畅运行,并行读取成批消息并将它们分派给您的函数。您是否更改了任何 JobHostConfiguration.Queues 配置旋钮?您没有强制更新 Azure SDK 的版本是否高于 WebJobs SDK 支持的版本?
如果您无法解决这个问题,另一种选择可能是克隆 SDK,在本地构建和调试它。 repo is here. The main queue processing loop is here.