将多个Blob输入传递给QueueTrigger Azure函数的最佳方法

时间:2017-03-24 04:26:35

标签: c# azure azure-functions azure-webjobssdk

问题

触发后,生成3个XML文件,一旦完成,将其ftp到站点。

当前方法

我有一个HTTP Trigger Azure功能,在运行时将构造3个XML文件并将这些文件保存到Azure存储Blob容器中。由于多输出,并且需要控制输出路径/文件名,我使用了 imperative binding approach并在我的函数中使用IBinder outputBinder。这一切都很好。 blob存储中的输出路径示例为export/2017-03-22/file-2017-03-22T12.03.02.54.xml。该文件位于包含日期的文件夹中,每个文件名都有时间戳以确保唯一性。

当生成所有3个文件时,我想触发另一个将这些文件sFTP到网站的功能。现在我最初认为我应该使用blob触发器,但我无法想象如何触发其文件名和路径是动态的输入。我不能在blob trigger documentation中找到这样的例子。

然后我想我可以将HTTP触发器输出到声明性绑定,并将XML文件输出到我的blob触发器可能正在查看的blob存储器中的outgoing容器中。这也有效,因为我的功能是消费计划,最多可以有10-minute day in processing new blobs

因此,记录的备选方案是使用队列触发器。我可以输出到我的队列并让队列触发器正常,但是我如何将3个XML流传递给我的QueueTrigger函数?

我认为作为后退,我可以发布一个可以包含构建的XML的Azure存储路径的对象,然后使用Storage SDK获取流并使用它发布到FTP,但它会更多有效地将那些存储Blob流作为输入传递给我的QueueTrigger?

1 个答案:

答案 0 :(得分:7)

我认为你使用Queue Trigger的方法是有道理的。我会构建一个这样的消息

public class QueueItem
{
    public string FirstBlobPath { get; set; }
    public string SecondBlobPath { get; set; }
    public string ThirdBlobPath { get; set; }
}

然后在队列处理函数中使用声明性绑定,类似于

{
  "bindings": [
    {
      "type": "queueTrigger",
      "name": "item",
      "direction": "in",
      "queueName": "myqueue",
      "connection":"...",    
    },
    {
      "type": "blob",
      "name": "file1",
      "path": "mycontainer/{FirstBlobPath}",
      "connection": "...",
      "direction": "in"
    },
    {
      "type": "blob",
      "name": "file2",
      "path": "mycontainer/{SecondBlobPath}",
      "connection": "...",
      "direction": "in"
    },
    {
      "type": "blob",
      "name": "file3",
      "path": "mycontainer/{ThirdBlobPath}",
      "connection": "...",
      "direction": "in"
    }
  ],
  "disabled": false
}

和功能

public static void Run(QueueItem item, Stream file1, Stream file2, Stream file3)
{
}