Работа с контекстом

Что такое контекст?#

Контекст в Ботодроме - это способ хранения информации, которая может совместно использоваться разными узлами без использования сообщений, проходящих через поток.

Области видимости контекста#

«Область видимости» контекстного значения определяет, где оно будет доступно. Существует три уровня контекста:

  • Узловой - виден только узлу, который установил значение
  • Потоковый (flow) - виден всем узлам в одном потоке (в той же вкладке рабочей области)
  • Глобальный (global) - виден всем узлам во всех потоках (во всех владках рабочей области)

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

Если значение должно быть доступно только одному узлу, например узлу Function, тогда достаточно узлового контекста.

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

Или в качестве настройки параметра, который используется во многих потоках. Допустим, вы делаете потоки, которые будут использоваться другими пользователями. И в этих потоках у вас многократно используется один и тот же идентификатор пользователя ВКонтакте, кому будут отправляться оповещения, и для кого будут доступны специальные команды администратора. Используя вместо определенного идентификатора - значение, хранимое в контексте, вы сделаете его легко изменяемым.

Примечание

Узлы внутри подпотока могут получить доступ к контексту родительского потока добавлением $parent. перед названием свойства контекста. Например:

var color = flow.get("$parent.color");

Хранилища контекста#

Контекстные данные в Ботодроме могут храниться в одном из двух типов хранилищ:

  • Тип "file" (используется по умолчанию) - значения хранятся в файловой системе и автоматически восстанавливаются при перезапуске сервера
  • Тип "memory" - значения хранятся в оперативной памяти и не сохраняются при перезапусках сервера
Примечание

Хранилище типа "file" кэширует значения в памяти и записывает их в файловую систему каждые 30 секунд.

Использование контекста в потоке#

Самый простой способ установить значение в контексте - использовать узел Change. Например, следующее правило узла Change сохранит значение msg.payload в потоковом (flow) контексте под ключом myData.

Сохранение значения в контексте

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

У полей для ввода свойства контекста справа есть кнопка с выпадающим меню. Оно позволяет вам выбрать тип хранилища, в котором нужно хранить/читать значение.

Выбор типа хранилища контекста

Использование контекста в узле Function#

О том как использовать контекст в узле Function, читайте в руководстве «написание функций».

Удаление контекста из файлового хранилища#

Контекст может быть удален узлом Change с выбранной опцией "удалить".

Удаление значения из контекста