如何以编程方式将Azure WebJob标记为失败?

有没有办法将WebJob(触发,不连续)标记为失败,而不抛出exception? 我需要检查某些条件是否正确,以将作业标记为成功。

根据Azure WebJob SDK ,来自TriggeredFunctionExecutor类的代码。

public async Task TryExecuteAsync(TriggeredFunctionData input, CancellationToken cancellationToken) { IFunctionInstance instance = _instanceFactory.Create((TTriggerValue)input.TriggerValue, input.ParentId); IDelayedException exception = await _executor.TryExecuteAsync(instance, cancellationToken); FunctionResult result = exception != null ? new FunctionResult(exception.Exception) : new FunctionResult(true); return result; } 

我们知道WebJobs状态取决于您的WebJob / Function是否在没有任何exception的情况下执行。 我们无法以编程方式设置正在运行的WebJob的最终状态。

我需要检查某些条件是否正确,以将作业标记为成功。

抛出exception是我找到的唯一方法。 或者,您可以将webjob执行结果存储在其他位置(例如,Azure表存储)。 我们可以通过ExecutionContext类获取当前的调用id。 在您的webjob中,您可以将当前的调用ID和您想要的状态保存到Azure表存储。 如果需要,可以根据调用ID从Azure表存储中查询状态。

 public static void ProcessQueueMessage([QueueTrigger("myqueue")] string message, ExecutionContext context, TextWriter log) { log.WriteLine(message); SaveStatusToTableStorage(context.InvocationId, "Fail/Success"); } 

要使用ExecutionContext作为参数,您需要使用NuGet安装Azure WebJobs SDK Extensions并在运行WebJob之前调用UserCore方法。

 var config = new JobHostConfiguration(); config.UseCore(); var host = new JobHost(config); host.RunAndBlock(); 

抛出非托管exception将导致执行失败。 但我注意到它也会导致你的消息管理不善:即你的消息会出列但不会移动到关于你的配置的毒性队列(但可能是由于我的SDK版本)。