Azure WebJob:在同一容器中创建/覆盖Blob时停止触发

时间:2018-09-07 16:10:01

标签: azure-storage azure-storage-blobs azure-webjobs azure-webjobssdk

我有一个webjob可以调整大小并覆盖blob容器中的同一图像。如何防止Webjob在同一文件上再次触发?我正在使用imageresizer库btw

public class Functions
{
    public static void ProcessBlob(
        [BlobTrigger("media/{filename}")] Stream input,
        [Blob("media/{filename}", FileAccess.Write)] Stream output,
        string filename,
        ILogger logger)
    {
        logger.LogInformation("blob path: {0}", filename);
        var instructions = new Instructions
        {
            Width = 1920,
            Mode = FitMode.Max,
            Scale = ScaleMode.DownscaleOnly,
            JpegQuality = 80
        };
        ImageBuilder.Current.Build(new ImageJob(input, output, instructions));
    }
}

1 个答案:

答案 0 :(得分:1)

递归方法需要退出条件。

最简单的解决方案是将转换后的文件写入不同的容器,例如media-resized

public static void ProcessBlob(
    [BlobTrigger("media/{filename}")] Stream input,
    [Blob("media-resized/{filename}", FileAccess.Write)] Stream output,
    string filename,
    ILogger logger) { ... }

另一种选择是写入具有相同后缀(例如:{filename}.1920px.jpg)的相同容器但写入不同文件,并向函数添加条件以停止处理带有该后缀的文件。

如果您真的要原地升级,那么您也可以set custom "converted" marker in blob metadata进行转换,并让函数在转换前对其进行检查,以避免递归。

请注意,对于最后两个选项,您很可能需要绑定到CloudBlockBlob而不是Stream。有关选项,请参见documentation