4

有没有办法将 WebJob(已触发,不连续)标记为失败,而不会引发异常?我需要检查某些条件是否正确才能将作业标记为成功。

4

4 回答 4

3

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

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 是否在没有任何异常的情况下执行。我们无法以编程方式设置正在运行的 WebJob 的最终状态。

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

抛出异常是我发现的唯一方法。或者您可以将 webjob 执行结果存储在其他位置(例如,Azure 表存储)。我们可以通过ExecutionContext类获取当前的调用 id 。在您的网络作业中,您可以将当前调用 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();
于 2017-03-30T07:09:31.883 回答
1

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

于 2017-11-07T13:21:52.250 回答
0

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

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

于 2019-08-28T22:47:21.680 回答
0

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

System.Environment.ExitCode = 1;

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

于 2019-09-10T16:15:23.207 回答