EXECUTE_GRAPH

Шаг EXECUTE_GRAPH запускает граф с определенными настройками, ожидает завершения графа и предоставляет результаты и детали выполнения на выходные порты.

Порты EXECUTE_GRAPH:

Тип портаНомерОбязательныйОписаниеМетаданные
Input0нетВходные записи с настройками выполнения графа.Любые
Output0нетИнформация об успешном выполнении задания.
1нетИнформация о неудачном выполнении задания.

Атрибуты EXECUTE_GRAPH:

АтрибутОбязательныйОписаниеВозможные значения
jobURLдаПуть к исполняемому графу. В этом атрибуте можно указать только один граф. Значение может быть переопределено значением из входного потока, см. атрибут «inputMapping».

jobURL="${GRAPH_DIR}/fldr/fldr/work.grf"

orderOutputнетПараметр указывает, сохранится ли порядок дочерних графов на выходе потока данных из шага. При 'true' - выходные данные подаются в соответствии с порядком запуска дочерних графов. При 'false', результаты выполнения передаются на выходной порт по мере выполнения.

orderOutput="true" по умолчанию

concurrentRunsLimitнетКоличество исполняемых параллельно дочерних графов.

concurrentRunsLimit="1" по умолчанию

inputMappingнетМаппинг входных данных определяет, как данные из входящего потока переопределяют значение jobURL, значение передаваемых в вызываемый граф параметров и словарей.

порт $out[0] - для переопределения значения jobURL;
порт $out[1] - для передачи значений параметров во внутренний граф;
порт $out[2] - для передачи значений словаря во внутренний граф;


function transform() {
    $out[0].jobURL = "inner-graph.grf"; //переопределение значения атрибута jobURL (имя вызываемого графа)
    $out[1].data_out = "data-out.txt"; // передача значения параметра в вызываемый граф
    $out[1].currency = '30'; // передача значения параметра в вызываемый граф
    $out[2].dct = dictionary.d1; //передача значения словаря в вызываемый граф

    return ALL;
}
outputMappingнетМаппинг выходных данных сопоставляет результаты успешного выполнения графа с метаданными первого выходного порта.

порт $in[0] - для передачи записей из внутреннего графа.
порт $in[1] - для передачи информации о результате выполнения внутреннего графа (runId, originalJobURL, startTime, endTime, status).
порт $in[2] - для передачи записей из словаря внутреннего графа (dictionaryName).


function transform() {
    $out[0].boo = $in[0].boo;
    $out[0].runId = $in[1].runId.toString();
    $out[0].originalJobURL = $in[1].originalJobURL.toString();
    $out[0].startTime = $in[1].startTime.toString();
    $out[0].endTime = $in[1].endTime.toString();
    $out[0].status = $in[1].status.toString();
    $out[0].dct1 = $in[2].dct1;

    return ALL;
}
errorMappingнетМаппинг ошибок отображает результаты неудачных запусков графов на второй выходной порт.

function transform() {
        $out[1].status = $in[1].status.toString();

        return ALL;
}

Подробности хода выполнения

Компонент считывает входную запись, выполняет граф на основе значений входящих данных, ждет завершения графа и отправляет результаты на соответствующий порт. Результаты успешного запуска графа отправляются на первый выходной порт. Результаты неудачного запуска отправляются на второй выходной порт (порт ошибки).

Если запуск графа прошел успешно, компонент продолжает обработку следующих входных записей. В противном случае компонент прекращает выполнение других графов, и с этого момента все входящие записи игнорируются, а информация об игнорируемых записях отправляется на порт вывода ошибок.

Подключенные и отключенные порты

В случае, если входной порт не подключен, выполняется только один граф с настройками по умолчанию, указанными в атрибутах компонента.

В случае, если первый выходной порт не подключен, компонент не выводит результаты выполнения графа.

Если второй выходной порт (порт ошибки) не подключен, первый граф с ошибкой приведет к прерыванию родительского задания.

Конфигурация компонента

Для запуска графа с помощью шага EXECUTE_GRAPH необходимо указать местоположение исполняемого графа в атрибуте jobURL.

Большинство настроек выполнения можно указать в шаге с помощью атрибутов компонента, описанных ниже.

Настройки выполнения графа можно изменять для каждого запуска на основе данных из входящего потока в атрибуте inputMapping.

Типы выполнения графа

EXECUTE_GRAPH поддерживает синхронное (последовательное) и асинхронное (параллельное) выполнение графов.

Для управления синхронностью выполнения используйте следующие атрибуты шага:

  • concurrentRunsLimit - целое число, обозначающее сколько графов одновременно могут выполняться. По умолчанию значение равно 1 и дочерние графы выполняются параллельно, но если установить большее значение, то графы смогут выполняться асинхронно.
  • orderOutput - указывает порядок информации о дочерних графах, выдаваемой на выходной порт шага ExecuteGraph. По-умолчанию установлено значение true и выходные данные подаются в соответствии с порядком запуска дочерних графов. При false, результаты выполнения будут передаваться на выходной порт по мере выполнения дочерних графов.

Мапинг входных данных

Атрибут inputMapping позволяет переопределить настройки шага на основе данных из входящего потока.

Маппинг входных данных — это преобразование, которое выполняется для каждой входной записи. С помощью inputMapping можно переопределить атрибут jobURL и передать в исполняемый граф значения его атрибутов и записи словаря.

На первый выходной порт можно подать значение для переопределения атрибута jobURL, а на второй выходной порт - параметры для исполняемого графа.

Можно задавать не только явно определённые публичные параметры, но и определять новые параметры, они будут доступны внутри графа по аналогии с такими встроенными параметрами как runId.

Тип портаНомерОбязательныйОписаниеПример
Output0нетДля переопределения пути к исполняемому графу
$out[0].jobURL = "newJob.grf" 
1Для передачи параметров в исполняемый граф
$out[1].graphParameterName = "<some value>"
2Для передачи записей в словарь исполняемого графа
$out[2].dictionaryName = "<some value>"

Маппинг выходных данных

outputMapping — это преобразование, которое используется для заполнения потока, передаваемого в первый выходной порт шага EXECUTE_GRAPH. Этот маппинг используется для вывода данных при успешном выполнении графа.

Данные, предоставляемые на первый выходной порт EXECUTE_GRAPH с помощью outputMapping описаны в таблице ниже. Первый выходной порт задействуется только если статус графа $in[1].status = "SUCCEEDED", в противном случае будет вызван errortMapping и данные пойдут на второй выходной порт.

Тип портаНомерОбязательныйОписаниеПример
Output0нетДля входящего потока записей

$in[0] = $in[0] в inputMapping

1Уникальный идентификатор запуска графа

$in[1].runId

Путь к исполняемому графу

$in[1].originalJobURL

Время запуска графа

$in[1].startTime

Время завершения графа

$in[1].endTime

Окончательный статус выполнения графа, один из { SUCCEEDED, FAILED }

$in[1].status

2Для передачи записей из словаря исполняемого графа

$out[2].dictionaryName

Маппинг ошибок

errorMapping — это тоже трансформация. Она используется для вывода ошибок. Данные, которые можно отправить через errorMapping аналогичны описанным в таблице в outputMapping.

Маппинг ошибок используется в том случае, если внутренний граф завершился неудачно - со статусом $in[1].status = "FAILED" - тогда вместо первого заполняется второй выходной порт шага EXECUTE_GRAPH.

Если маппинг ошибок не определен, а во внутреннем графе произошла ошибка - родительский граф не сможет ее обработать и упадёт.

Пример передачи параметров через словарь

Для передачи данных из основного графа во внутренний через словарь, необходимо использовать второй выходной порт в inputMapping. Для передачи значений из словаря внутреннего графа в основной - второй входной порт в outputMapping.

Задание: Передать значение в словарь внутреннего графа, изменить его, получить изменённое значение и вывести его в лог.

Решение: Чтобы запустить из графа другой граф - используйте шаг EXECUTE_GRAPH. Чтобы передать значения в вызываемый граф - заполните атрибут inputMapping, присвоив начальное значение записи словаря вызываемого графа. Изменённое внутри вызываемого графа значение словаря можно получчить в основном графе через outputMapping шага EXECUTE_GRAPH.

В inputMapping шага execgrf через второй выходной порт присваиваем значение 11 записи словаря с именем foo, определённого во внутреннем графе. Значение словаря передаётся во внутренний граф. В outputMapping получаем через второй входной порт изменённое значение записи этого словаря.

    <Node id="execgrf" guiX="386" guiY="49" guiName="exec" type="EXECUTE_GRAPH" jobURL="dict_inner3.grf">
      <attr name="inputMapping"><![CDATA[ 
                function transform() {
                    $out[2].foo = 11;
                    return ALL;
                }
                ]]></attr>
      <attr name="outputMapping"><![CDATA[ 
                function transform() {
                    $out[0].foo = $in[2].foo;
                    return ALL;
                }
                ]]></attr>
    </Node>

Объявление словаря в теге <Global> во внутреннем графе:

<Dictionary>
    <Entry dictval.value="1" name="foo" input="true" output="true" type="integer" />
</Dictionary>

Переопределение значения записи словаря foo в датагенераторе внутреннего графа:

    <Node id="datagen1" guiX="98" guiY="57" guiName="datagen1" type="DATA_GENERATOR" recordsNumber="1">
      <attr name="generate"><![CDATA[
                function generate() {
                    $out[0].foo = dictionary.foo;
                    dictionary.foo = 43;
                    return ALL;
                }
                ]]></attr>
    </Node>