С долгожданным выпуском Ignition 8 на горизонте и тем, что выглядит как расширенная шина сообщений в модуле Перспектива, как проверено Corso Systems, я хочу подробно остановиться на моих недавних итерациях обмена сообщениями на платформе Ignition. В предыдущей статье описывается, как мы можем использовать обработчики сообщений клиента и шлюза для передачи произвольной полезной нагрузки по платформе. Ограничение этого подхода заключается в том, что нам нужно заранее знать цель нашего сообщения.

Прежде чем мы двинемся дальше, стоит объяснить путь сообщения в области клиента.

Когда сообщение получено в области клиента, оно распространяется вниз по иерархии компонентов, начиная со всех открытых окон. Проверяются пользовательские методы каждого компонента, и если имя функции соответствует типу полученного сообщения, то эта функция вызывается. Тип сообщения «ЛЮБОЙ» является универсальным для любого типа сообщения. Пользовательский метод OnMessage_ANY не вызывается, если существует пользовательский метод, соответствующий типу сообщения, как в приведенном выше примере (нижний правый компонент).

Модель публикации-подписки

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

Этого можно добиться с помощью простого проекта с областью действия шлюза, который запускается с помощью Ignition Gateway. В проекте есть несколько обработчиков сообщений шлюза и поддерживается список подписчиков. Клиенты взаимодействуют с шиной сообщений через глобальный общий сценарий.

Код shared.simplemessaging.client2 можно найти здесь, а проект SimpleMessaging можно скачать здесь.

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

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

Шлюз. Подключение шлюза немного отличается. Нет компонентов для каскадирования сообщения вниз. Вместо этого вы захотите делегировать обработку сообщений экземпляру объекта, работающего в области шлюза вашего проекта.

Отправка сообщений вокруг

Подписка. Чтобы получать сообщения, вам необходимо подписаться на типы сообщений где-то в вашем коде.

shared.simplemessaging.client2.Subscribe(messageTypes, projectScopeOnly)
example: shared.simplemessaging.client2.Subscribe(['PROCESS_READY','PROCESS_RUNNING'], False)
messageTypes (string,[string]) - message type or list of message types to subscribe to
projectScopeOnly (boolean) - subscribe to messages published from same project or subscribe to messages published from any project

Отказ от подписки. В любой момент вашего кода вы можете отказаться от подписки на ранее подписанные типы сообщений.

shared.simplemessaging.client2.Unsubscribe(messageTypes)
example: shared.simplemessaging.client2.Unsubscribe(['PROCESS_READY','PROCESS_RUNNING'])
messageTypes (string,[string]) - message type or list of message types to unsubscribe from

Публикация. Отправьте сообщение на платформе.

shared.simplemessaging.client2.Publish(messageTypes, message, retain, excludeSelf)
example:
shared.simplemessaging.client2.Publish(['PROCESS_READY'], { 'Hello' : 'World!', False, True)
messageTypes (string,[string]) - message type or list of message types to publish
message (any) - the message you want to send
retain (boolean) - whether this message should be retained for new clients coming online
excludeSelf - whether this message should be republished back to sender or dropped

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

{
  'source': 
  {
    'project': u'source project name', 
    'timeStamp': 1546977072372L, 
    'scope': 1
  }, 
  'type': 'PROCESS_READY', 
  'message': { 'Hello': 'World!' }, 
  'perf': 
  {
    'publishedAt': 1546977072372L, 
    'processedAt': 1546977072382L,
    'receivedAt':  1546977072390L
  }
}

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