Шаблон для обработки объектов протокола связи - PullRequest
0 голосов
/ 30 июня 2011

Я использую protobuf для реализации протокола связи между приложением Java и собственным приложением, написанным на C ++. Сообщения управляются событиями: когда событие происходит в приложении C ++, создается и отправляется сообщение protobuf. * ​​1003 *

message MyInterProcessMessage {

   int32 id = 1;

   message EventA { ... }
   message EventB { ... }
   ...
}

В Java я получаю на своем сокете объект класса: MyInterProcessMessageProto. Отсюда я могу очень легко получить свои данные, поскольку они инкапсулированы друг в друга: myMessage.getEventA().getName();

У меня две проблемы:

  1. Как делегировать обработку полученных сообщений?

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

  2. Я хотел бы найти шаблон, в котором я могу сохранить сообщения и не только применить их, но и отменить их, например, Шаблон команды используется для реализации этого.

Мой первый подход: создать разные классы-оболочки для каждого события с указанным методом apply() и undo() и таким образом делегировать задание.

Однако я не уверен, что это правильный путь или нет лучших решений.


Чтобы уточнить мою заявку:

Приложение Java моделирует работающую виртуальную машину Java и хранит информацию, например, «Потоки», «Мониторы», «Память» и т. Д.

Каждое событие меняет текущее состояние моделируемой JVM. Например, был запущен новый поток, другой поток перешел в состояние блокировки, память была освобождена и т. Д. В том же значении моделируются события: ThreadEvent, MemoryEvent и т. Д.

Это означает, что сообщения должны обрабатываться последовательно. Чтобы вернуться к предыдущим состояниям JVM, я хотел бы реализовать эту функцию отмены.

Для отмены я уже пробовал. clearAllStates, применять события до события # i.

К сожалению, с более чем 20 000 событий это абсолютно неэффективно.

1 Ответ

0 голосов
/ 30 июня 2011

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

Однако вот общее предложение: типичный подход - делегировать полученные сообщения классу очереди * , который обычно выполняется всобственный поток (чтобы получатель сообщения мог подготовиться к следующему входящему сообщению как можно скорее) и последовательно обрабатывает полученные сообщения.Вы могли бы использовать подобный стеку класс, чтобы отслеживать обработанные сообщения ради функции отменить .Вы также можете использовать определенные очереди и стеки для различных типов событий.

В основном это напоминает шаблон пула потоков .

...