Начиная с noflo, запуская его из nodejs

Я получил простой пример noflo, работающий из noflo. Но мне никак не удается понять, как noflo должен работать с узлом и другим кодом.

Сначала у меня был этот файл fbp:

# In the graph we first need to define the nodes and the connections between them
Read(filesystem/ReadFile) OUT -> IN Display(core/Output)

# Start off the graph by sending a filename to the file reader
#'package.json' -> IN Read

Я пробовал: noflo.loadFile(filepath, nodedir, function(graph)

Это работает и выводит на консоль. Но если я пропущу последнюю строку в fbp, которая передает параметр package.json, я не найду способа запустить график.

Есть ли где-нибудь руководство о том, как использовать noflo из кода nodejs, а не из командной строки?


person Madd0g    schedule 10.06.2014    source источник


Ответы (1)


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

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

Последняя строка в вашем определении графа .fbp отправляет строку package.json компоненту ReadFile.

Вы также можете сделать это программно после загрузки файла в сеть NoFlo:

noflo.loadFile(filepath, process.cwd(), function (network) {
  // Now we have access to the NoFlo network instance

  // Add Initial Information Packet programatically
  network.graph.addInitial(someFileToRead, 'Read', 'in');

  // Tell NoFlo to send the new IIPs
  network.sendInitials();
});

Экспортированные порты и подграфы

Теперь есть и более элегантный способ сделать это, представив файл .fbp в виде графика в ComponentLoader NoFlo, а затем взаимодействуя с ним так же, как с любым другим компонентом.

Чтобы сделать интересующие вас порты доступными извне, их необходимо экспортировать. В данном случае как минимум порт ReadFile IN из графа. Это изменит определение вашей сети на:

# Export the filename port so it can be accessed from outside
INPORT=Read.IN:FILENAME

# The rest of the graph definition follows
Read(filesystem/ReadFile) OUT -> IN Display(core/Output)

(так случилось, что это именно тот пример, который я использовал для экспортируемых портов в определении языка .fbp< /а>)

Чтобы сделать ваш график доступным как компонент, вам нужно сохранить его внутри вашего проекта Node.js (условно это подкаталог graphs/) и зарегистрировать его в файле package.json:

{
  "noflo": {
    "graphs": {
      "MyGraph": "graphs/MyGraph.fbp"
    }
  }
}

Теперь вы можете обращаться с ним как с любым другим компонентом. Например:

var loader = new noflo.ComponentLoader(__dirname);
loader.load('MyGraph', function (instance) {
  // The instance is a running NoFlo subgraph with your graph definition

  // Create a socket and attach it to the exported port
  var filename = noflo.internalSocket.createSocket();
  instance.inPorts.filename.attach(filename);

  filename.send(someFileToRead);
  filename.disconnect();
});

Одна из причин, по которой этот метод является предпочтительным, заключается в том, что его можно использовать не только для отправки IIP, но и для подключения сокетов к экспортируемым выходным портам и прослушивания событий на них. Таким образом, вы можете легко использовать любые графики NoFlo в качестве асинхронных функций в своем приложении JavaScript.

person bergie    schedule 10.06.2014
comment
Спасибо, именно то объяснение, которое я искал. Второй способ кажется более приятным и более пригодным для повторного использования. Но если я использую графический интерфейс или какой-либо другой генератор FBP для создания потоков, могу ли я загружать/перезагружать их на лету? Это кажется довольно статичным, иметь их в файле и загружать их по имени (поэтому я склонялся к первому способу, он выглядел более гибким). - person Madd0g; 10.06.2014
comment
На самом деле я пытаюсь создать свой собственный упрощенный пользовательский интерфейс, похоже, что noflo-nodejs очень привязан к потоковому хабу, было бы достаточно легко использовать базовые инструменты (например, noflo-runtime-socket) для создания собственной среды выполнения? Есть ли (хотя бы немного) документация по использованию noflo таким (динамическим) способом? - person Madd0g; 11.06.2014
comment
Здесь нет ничего специфичного для Flowhub, любой клиент протокола FBP может взаимодействовать с любой средой выполнения протокола FBP. Flowhub просто является клиентом, которым пользуется большинство людей. - person bergie; 12.06.2014