Где вы делаете CallActivityAsync в методе оркестровки - PullRequest
0 голосов
/ 21 октября 2019

Я только начал использовать долговечные функции, и мне нужно несколько советов о том, как правильно сделать шаблон разветвления. У меня есть FTP-сервер, с которого я читаю все файлы. Я хочу запустить функцию Activity для каждого файла. Насколько я понимаю, функция оркестратора будет вызываться при каждом выполнении функции Activity. Я просто хочу прочитать файлы один раз. Чтобы не вызывать код, который читает файлы и запускает функции действий несколько раз, какой метод рекомендуется? Имеет ли она функцию активности, которая добавляет все функции активности, или использует свойство IsReplaying, или что-то другое?

[FunctionName("OrchestrationMoveFilesToBlob")]
public static async Task<List<string>> RunOrchestrator(
    [OrchestrationTrigger] DurableOrchestrationContext context)
{
    var outputs = new List<string>();

    if (!context.IsReplaying)
    {
        // Do you call your database here and make a call to CallActivityAsync for each row?
    }

    // doing it here is properly very wrong as it will be called multiple times
    var tasks = new Task<string>[7];
    for (int i = 0; i < 7; i++)
    {
        tasks[i] = context.CallActivityAsync<string>("E2_CopyFileToBlob","");            }

    await Task.WhenAll(tasks);

    return outputs;
}

При просмотре примера в ссылке ниже это фактически вызывает его непосредственно вфункция оркестратора? Разве это не плохо? Он продолжает добавлять те же действия снова и снова ....?

https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-cloud-backup

1 Ответ

0 голосов
/ 14 ноября 2019

Не уверен, что я понимаю, чего вы пытаетесь достичь, но ваш код пока выглядит неплохо. Оркестровка вызывается только один раз (и, возможно, несколько раз для воспроизведения, но это не ваша проблема). Из вашей оркестровки вы можете вызвать веером все ваши функции активности (собирая файл с ftp), каждая функция активности - один файл. await Task.WhenAll(tasks) - ваш поклонник. (Вы можете использовать List<Task> вместо массива и вызывать .Add(task), если хотите. Чтобы не редактировать ваш код, я скопировал его сюда и добавил несколько комментариев и вопросов (бесплатно редактировать здесь):

[FunctionName("OrchestrationMoveFilesToBlob")]
public static async Task<List<string>> RunOrchestrator(
    [OrchestrationTrigger] DurableOrchestrationContext context)
{
    var outputs = new List<string>();

    if (!context.IsReplaying)
    {
        // just needed for things that should not happen twice like logging....
    } 

    // if your work isn't a fixed list just call an activity 
    // which replies with the list of work here (e.g. list of filenames)

    var tasks = new Task<string>[7]; // can be a List<Task> too
    for (int i = 0; i < 7; i++)
    {
        tasks[i] = context.CallActivityAsync<string>("E2_CopyFileToBlob","");
    }

    await Task.WhenAll(tasks);

    return outputs; // currently an empty list. What do you want to give back?
}
...