У меня есть программа на C ++, которая отправляет различные события, например, StatusEvent
и DetectionEvent
с различными определениями протокольных сообщений для службы сообщений (в настоящее время Active MQ, через APM activemq-cpp) , Я хочу написать прослушиватель сообщений, который получает эти сообщения, анализирует их и записывает их в cout для целей отладки. Слушатель связал status_event_pb.h
и detect_event_pb.h
.
Мой вопрос: Как я могу проанализировать полученное событие, не зная его типа? Я хочу сделать что-то вроде (в псевдокоде)
receive event
type = parseEventType(event);
if( type == events::StatusEventType) {
events::StatusEvent se = parseEvent(event);
// do stuff with se
}
else {
// handle the case when the event is a DetectionEvent
}
Я посмотрел на этот вопрос , но я не уверен, являются ли расширения подходящими для этого. Короткий фрагмент кода, указывающий путь, будет высоко ценится. Примеры на protobuf так редки!
Спасибо!
Кажется, расширения - это действительно путь, но у меня есть еще один момент, который нужно прояснить. Вот предварительное определение, которое у меня есть до сих пор:
// A general event, can be thought as base Event class for other event types.
message Event {
required int64 task_id = 1;
required string module_name = 2; // module that sent the event
extensions 100 to 199; // for different event types
}
// Extend the base Event with additional types of events.
extend Event {
optional StatusEvent statusEvent = 100;
optional DetectionEvent detectionEvent = 101;
}
// Contains one bounding box detected in a video frame,
// representing a region of interest.
message DetectionEvent {
optional int64 frame = 2;
optional int64 time = 4;
optional string label = 6;
}
// Indicate status change of current module to other modules in same service.
// In addition, parameter information that is to be used to other modules can
// be passed, e.g. the video frame dimensions.
message StatusEvent {
enum EventType {
MODULE_START = 1;
MODULE_END = 2;
MODULE_FATAL = 3;
}
required EventType type = 1;
required string module_name = 2; // module that sent the event
// Optional key-value pairs for data to be passed on.
message Data {
required string key = 1;
required string value = 2;
}
repeated Data data = 3;
}
Моя проблема сейчас состоит в том, чтобы (1) узнать, какое конкретное событие содержится в сообщении о событии, и (2) убедиться, что оно содержит только одно такое событие (согласно определению, он может содержать и StatusEvent
, и DetectionEvent
).