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

时间:2017-03-28 07:16:22

标签: c# azure webjob

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

4 个答案:

答案 0 :(得分: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。在您的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();

答案 1 :(得分:1)

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

答案 2 :(得分:0)

@Jean NETR-VALERE,您可以说更新的WebJobs软件包确实起作用,如果引发异常,则该作业将失败,并将一遍又一遍地运行,直到最终清除队列为止。这绝对是可怕的行为,我不知道他们为什么改变了这一点。

是的,他们确实更改了它以使其以这种方式工作,因为正是出于这个原因,我使用了较旧版本的webjobs软件包。大约3个月前,我升级到了较新的版本,不久之后我不明白为什么会发生上述行为。恢复到较旧的版本后,它再次可以正常工作,并且在失败5次后移至中毒队列,并且再也无法运行。我的观点是,如果您想要正确的(IMO)行为,请查看是否可以返回使用1.1.0版,您会感到满意。希望有帮助。

答案 3 :(得分:0)

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

System.Environment.ExitCode = 1;

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