C# 如何以编程方式将Azure WebJob标记为失败?
有没有一种方法可以在不引发异常的情况下将WebJob(已触发,而非连续)标记为失败?我需要检查某些条件是否正确,以将作业标记为成功。根据TriggeredFunctionExecutor类中的代码C# 如何以编程方式将Azure WebJob标记为失败?,c#,azure,webjob,C#,Azure,Webjob,有没有一种方法可以在不引发异常的情况下将WebJob(已触发,而非连续)标记为失败?我需要检查某些条件是否正确,以将作业标记为成功。根据TriggeredFunctionExecutor类中的代码 public async Task<FunctionResult> TryExecuteAsync(TriggeredFunctionData input, CancellationToken cancellationToken) { IFunctionInstance inst
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;
}
要使用ExecutionContext作为参数,您需要在运行WebJob之前使用NuGet安装Azure WebJobs SDK扩展并调用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确定失败的方式。感谢您指出SDK,这将非常有用。我将使用一个异常,它看起来更简单,但如果将来需要,我会记住另一个选项。
System.Environment.ExitCode = 1;