Передача сообщений из mbox'а в mchain

15 views
Skip to first unread message

Dmitriy Vorobyov

unread,
May 25, 2019, 1:04:12 PM5/25/19
to SObjectizer
Здравствуйте. Я только начал знакомиться с библиотекой. Использую версию 5.5.24.3. И у меня возник вопрос.
Допустим есть несколько агентов, которые общаются посредством mbox'а. И есть mchain, в который надо пересылать большую часть этих сообщений (для GUI). Как это правильно сделать? Надо ли делать агента с обработчиками, которые будут перенаправлять сообщения (а их может быть много) в mchain или есть способ проще?

Yauheni Akhotnikau

unread,
May 25, 2019, 1:23:00 PM5/25/19
to SObjectizer
Допустим есть несколько агентов, которые общаются посредством mbox'а. И есть mchain, в который надо пересылать большую часть этих сообщений (для GUI). Как это правильно сделать? Надо ли делать агента с обработчиками, которые будут перенаправлять сообщения (а их может быть много) в mchain или есть способ проще?

Если я правильно понимаю, то у вас ситуация следующая:

* есть multi-producer/multi-consumer mbox, в который кто-то публикует сообщения;
* есть несколько агентов, которые заинтересованы в том, чтобы получать некоторые из этих сообщений;
* но часть сообщений не нуждается в обработке агентами, а должна отправляться напрямую в некоторый mchain.

Если это так (ключевой момент в том, что агентам нужна только часть сообщений), то "простой" способ -- это сделать агента, который будет получать сообщения, которые должны идти в mchain и который будет пересылать сообщения в mchain. В этом случае не придется погружаться в потроха SObjectizer-а. Но в этом случае агент должен знать все типы сообщений, которые должны уходить в mbox. Соответственно, когда появляется новый тип, то нужно будет модифицировать данного агента.

Более сложный способ -- это реализация собственного проксирующего mbox-а. Его идея следующая:

* есть нормальный MPMC mbox, который будет использоваться для доставки сообщений подписчикам. Этот mbox будет использоваться в качестве "подложки" для проксирующего mbox-а;
* есть нормальный mchain, который будет использоваться для отсылки сообщений в GUI;
* проксирующий mbox получает в свое распоряжение нормальный MPMC-mbox и нормальный mchain. Агенты, которым нужно общаться друг с другом, будут видеть только проксирующий mbox;
* проксирующий mbox делегирует все вызовы, связанные с подпиской и фильтрами доставки mbox-у подложке;
* проксирующий mbox все методы для доставки сообщений переопределяет так, чтобы каждое новое сообщение отдавалось и mbox-у подложке, и mchain-у.

Т.о., сообщения будут пробрасываться mchain сразу, без промежуточного агента. Если нужна фильтрация (т.е. не все сообщения должны идти в mchain), то этот проксирующий mbox должен будет такую фильтрацию делать сам.

Этот способ плох тем, что нужно будет погрузиться в детали работы mbox-а. Либо взять за основу специально сделанный для подобных задач proxy-mbox из so5extra (вот его описание для SO-5.5/so5extra-1.2, а вот описание для SO-5.6/so5extra-1.3). Плохо здесь то, что интерфейс mbox-а поменялся при переходе от SO-5.5 к SO-5.6. В SO-5.5 в mbox-е было четыре виртуальных метода для доставки сообщения, тогда как в SO-5.6 их осталось всего два.

Но, возможно, что вашу задачу я понял не совсем правильно.

Dmitriy Vorobyov

unread,
May 25, 2019, 2:14:13 PM5/25/19
to SObjectizer

Спасибо за такой скорый и подробный ответ.


В моем случае часть сообщений должна передаваться и GUI и агентам. Похоже проксирующий mbox – то, что мне нужно.

Reply all
Reply to author
Forward
0 new messages