Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Azure WebJob服务总线触发器未能完成_Azure_Azure Webjobs_Azure Webjobssdk - Fatal编程技术网

Azure WebJob服务总线触发器未能完成

Azure WebJob服务总线触发器未能完成,azure,azure-webjobs,azure-webjobssdk,Azure,Azure Webjobs,Azure Webjobssdk,我有一个Azure WebJob设置为连续运行,它使用服务总线触发器读取队列和主题。在处理队列时,消息被发送到一个主题中,我有一个主题要管理缓存的更新 暂时,我通过简单地从函数返回来禁用缓存更新,以便将消息从主题中清除 public static void ProcessSearchUpdate([ServiceBusTrigger("events", "SearchClientUpdates", AccessRights.Listen)] BrokeredMessage message, Sy

我有一个Azure WebJob设置为连续运行,它使用服务总线触发器读取队列和主题。在处理队列时,消息被发送到一个主题中,我有一个主题要管理缓存的更新

暂时,我通过简单地从函数返回来禁用缓存更新,以便将消息从主题中清除

public static void ProcessSearchUpdate([ServiceBusTrigger("events", "SearchClientUpdates", AccessRights.Listen)] BrokeredMessage message, System.IO.TextWriter log)
    {
        return;
    }
大多数情况下,事情按计划进行,消息只是被读取和丢弃。但是,有时,我会遇到以下异常,我假设是webjobs sdk试图编写日志时出现的异常

正如您所看到的,我的方法没有做任何事情,因此不应该超时

当它失败时,它会阻止任何触发器的执行,这是非常恼人的。SDK中出现的任何故障都有一个5分钟的超时,它会阻止任何东西运行5分钟,再加上重启时间

Microsoft.WindowsAzure.Storage.StorageException: Microsoft.WindowsAzure.Storage.StorageException: The client could not finish the operation within specified timeout. ---> System.TimeoutException: The client could not finish the operation within specified timeout.
 --- End of inner exception stack trace ---
 at Microsoft.WindowsAzure.Storage.Core.Util.StorageAsyncResult`1.End() in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Util\StorageAsyncResult.cs:line 77
 at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.EndUploadFromStream(IAsyncResult asyncResult) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:line 774
 at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.EndUploadFromByteArray(IAsyncResult asyncResult) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:line 1162
 at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.EndUploadText(IAsyncResult asyncResult) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:line 1285
 at Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.<>c__DisplayClass4.<CreateCallbackVoid>b__3(IAsyncResult ar) in c:\Program Files (x86)\Jenkins\workspace\release_dotnet_master\Lib\ClassLibraryCommon\Core\Util\AsyncExtensions.cs:line 114
 --- End of stack trace from previous location where exception was thrown ---
 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at Microsoft.Azure.WebJobs.Host.Loggers.UpdateOutputLogCommand.<UpdateOutputBlob>d__10.MoveNext()
 --- End of stack trace from previous location where exception was thrown ---
 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at Microsoft.Azure.WebJobs.Host.Loggers.UpdateOutputLogCommand.<SaveAndCloseAsync>d__6.MoveNext()
 --- End of stack trace from previous location where exception was thrown ---
 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(Task task)
 at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.<ExecuteWithLoggingAsync>d__13.MoveNext()
 --- End of stack trace from previous location where exception was thrown ---
 at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
 at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
 at Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.<TryExecuteAsync>d__1.MoveNext()
 Request Information
 RequestID:
 RequestDate:
 StatusMessage:
Microsoft.WindowsAzure.Storage.StorageException:Microsoft.WindowsAzure.Storage.StorageException:客户端无法在指定的超时内完成操作。-->System.TimeoutException:客户端无法在指定的超时内完成操作。
---内部异常堆栈跟踪的结束---
在c:\Program Files(x86)\Jenkins\workspace\release\u dotnet\u master\Lib\ClassLibraryCommon\Core\Util\StorageAsyncResult.cs中的Microsoft.WindowsAzure.Storage.Core.Util.StorageAsyncResult`1.End():第77行
在c:\Program Files(x86)\Jenkins\workspace\release\u dotnet\u master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:第774行中的Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.EndUploadFromStream(IAsyncResult asyncResult)中
在c:\Program Files(x86)\Jenkins\workspace\release\u dotnet\u master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:第1162行的Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.EndUploadFromByteArray(IAsyncResult asyncResult)中
在c:\Program Files(x86)\Jenkins\workspace\release\u dotnet\u master\Lib\ClassLibraryCommon\Blob\CloudBlockBlob.cs:第1285行中的Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.EndUploadText(IAsyncResult asyncResult)中
在Microsoft.WindowsAzure.Storage.Core.Util.AsyncExtensions.c_uuu中,以c:\Program Files(x86)\Jenkins\workspace\release\u dotnet\u master\Lib\ClassLibraryCommon\Core\Util\AsyncExtensions.cs显示Class4.b_uuuu3(IAsyncResult ar):第114行
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在Microsoft.Azure.WebJobs.Host.Loggers.UpdateOutputLogCommand.d_u10.MoveNext()上
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在Microsoft.Azure.WebJobs.Host.Loggers.UpdateOutputLogCommand.d_u6.MoveNext()上
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd(任务任务)
在Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d_u13.MoveNext()上
---来自引发异常的上一个位置的堆栈结束跟踪---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)
在System.Runtime.CompilerServices.TaskWaiter.HandleNonSuccessAndDebuggerNotification(任务任务)中
在Microsoft.Azure.WebJobs.Host.Executors.FunctionExecutor.d_u1.MoveNext()上
请求信息
请求ID:
申请日期:
状态信息:

与WebJob日志系统相关的异常。Azure WebJob SDK将定期将日志刷新到blob存储。为了解决超时问题,我们可以增加WebJob SDK为此使用的CloudBlobClient的超时值。以下步骤供您参考

第一步。使用NuGet将Microsoft.Azure.WebJobs的版本更新为2.0.0

第二步。实现我们自己的StorageClientFactory,它可以重置blob客户端的超时值

public class MyStorageClientFactory : Microsoft.Azure.WebJobs.Host.StorageClientFactory
{
    public override CloudBlobClient CreateCloudBlobClient(StorageClientFactoryContext context)
    {
        CloudBlobClient client = context.Account.CreateCloudBlobClient();
        client.DefaultRequestOptions.ServerTimeout = TimeSpan.FromMinutes(60);
        return client;
    }
}
第三步。让JobHost使用自定义StorageClientFactory

JobHostConfiguration configuration = new JobHostConfiguration();
configuration.StorageClientFactory = new MyStorageClientFactory();

var host = new JobHost(configuration);

与WebJob日志系统相关的异常。Azure WebJob SDK将定期将日志刷新到blob存储。为了解决超时问题,我们可以增加WebJob SDK为此使用的CloudBlobClient的超时值。以下步骤供您参考

第一步。使用NuGet将Microsoft.Azure.WebJobs的版本更新为2.0.0

第二步。实现我们自己的StorageClientFactory,它可以重置blob客户端的超时值

public class MyStorageClientFactory : Microsoft.Azure.WebJobs.Host.StorageClientFactory
{
    public override CloudBlobClient CreateCloudBlobClient(StorageClientFactoryContext context)
    {
        CloudBlobClient client = context.Account.CreateCloudBlobClient();
        client.DefaultRequestOptions.ServerTimeout = TimeSpan.FromMinutes(60);
        return client;
    }
}
第三步。让JobHost使用自定义StorageClientFactory

JobHostConfiguration configuration = new JobHostConfiguration();
configuration.StorageClientFactory = new MyStorageClientFactory();

var host = new JobHost(configuration);

问题是它实际上没有做任何事情,为什么要花这么长时间?虽然它没有做任何事情,但Azure WebJob SDK会将一些信息(例如功能启动和功能完成)记录到Blob服务,Azure WebJob SDK会定期刷新日志。不过,我会看看延长超时是否有任何好处,还有两个问题。1.为什么几乎不使用任何数据刷新日志需要>5分钟。2.当它刷新日志时,所有触发器都停止触发。例如,我有5个基于触发器的函数。一旦这一个进入“刷新”状态,所有触发器都停止触发。因此,我在这5分钟内不处理任何消息(如果我延长它,则不处理更长的消息)。日志记录不应该导致此问题,应该可以选择安静地失败。所有触发器停止触发都是由WebJob结束引起的。WebJob将在几分钟后重新启动,并将触发触发器。您可以通过设置WEBJOBS\u restart\u TIME配置部分来缩短重启间隔。请检查WebJob 2.0.0的更新是否修复了此问题。p