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

How to programmatically mark an Azure WebJob as failed?

有没有办法在不抛出异常的情况下将 WebJob(触发的,非连续的)标记为失败?我需要检查某些条件是否成立才能将作业标记为成功。

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

public async Task<FunctionResult> 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 是否无异常执行。我们无法以编程方式设置 运行ning WebJob 的最终状态。

I need to check that certain conditions are true to mark the job as successful.

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

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 扩展,并在 运行 您的 WebJob 之前调用 UserCore 方法。

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

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

@Jean NETR-VALERE 较新版本的 WebJobs 包确实如您所说,如果抛出异常,作业将失败,并且将继续 运行 一遍又一遍,直到您最后清除你的队列。这绝对是可怕的行为,我不知道为什么他们改变了这一点。

是的,他们确实对其进行了更改以使其以这种方式工作,因为我正是出于这个原因使用了旧版本的 webjobs 包。大约 3 个月前,我升级到较新的版本,不久之后就无法理解为什么会发生上述行为。一旦我恢复到旧版本,它又开始正常工作,并且在失败 5 次后被移至毒队列,再也不会 运行。我的观点是,如果您想要正确的 (IMO) 行为,看看您是否可以返回使用 1.1.0 版,您会很高兴。希望对您有所帮助。

要将触发的 Web 作业标记为失败,您只需将进程退出代码设置为非零。

System.Environment.ExitCode = 1;

当您抛出未处理的异常时,它还会设置退出代码,这就是 Azure 确定失败的方式。