Tôi đang chỉ định giao thức trong protocol buffers. Tầng vận chuyển đang khai thác hỗ trợ Bộ đệm Giao thức Netty - ý nghĩa là số ProtobufDecoder của Netty chấp nhận một và chỉ một loại, là MessageLite.Cách tốt nhất để chỉ định Protobuf để sử dụng với Netty (tốt nhất là sử dụng hỗ trợ protobuf được tích hợp sẵn)
Bây giờ, tôi muốn gửi nhiều loại thông báo khác nhau xuống kênh này, mỗi loại phụ có thông tin có cấu trúc được liên kết với nó. Bộ đệm giao thức không có cơ chế thừa kế, vì vậy tôi đang sử dụng một loại thành phần. Tôi không chắc liệu tôi có đi đúng hướng không.
Cách tiếp cận của tôi là phân loại các sự kiện khác nhau của tôi bằng enum và đóng gói sự khác biệt của chúng bằng cách sử dụng các thành viên tùy chọn. Xem số .proto
bên dưới của tôi, tôi đã đơn giản hóa nó vì mục đích rõ ràng.
Vấn đề của tôi ở đây là mã nhận cần phải tạo liên kết giữa EventType.ERROR và ErrorEventDetail. Điều này chỉ cảm thấy một chút vụng về.
Giản Events.proto
:
package events;
option java_package = "com.example";
option java_outer_classname = "EventProtocol";
message Event {
enum EventType {
START = 0;
DELEGATE = 1;
ERROR = 2;
STOP = 3;
}
required events.Event.EventType event_type = 1 [default = START];
required int32 id = 2;
required int64 when = 3;
optional StartEventDetail start_event_detail = 4;
optional DelegateEventDetail delegate_event_detail = 5;
optional ErrorEventDetail error_event_detail = 6;
optional StopEventDetail stop_event_detail = 7;
}
message StartEventDetail {
required string object_name = 1;
}
message DelegateEventDetail {
required int32 object_id = 2;
required string task = 3;
}
message ErrorEventDetail {
required string text = 1;
required int32 error_code = 2;
optional Event cause = 3;
}
message StopEventDetail {
required int32 object_id = 2;
}
là tối ưu này? Tôi có nên sử dụng tốt hơn việc mở rộng bằng cách nào đó hoặc có thể sử dụng một số cách khác là enum
?
Hoặc thậm chí, tôi có nên tạo toàn bộ OneToOneDecoder mới có thể xác định loại thư theo một loại tiêu đề nào đó không? Tôi có thể làm được điều này, nhưng tôi không muốn ...
Cảm ơn
cảm ơn rất nhiều, tôi đã bỏ lỡ tài liệu về Loại liên kết. Thật tốt khi biết tôi đang đi đúng hướng. Chúc mừng – laher
Tôi đã thực sự thay đổi định nghĩa của mình ngay bây giờ, bằng cách đọc lên các loại Liên minh. Loại 'Liên minh' của tôi không còn chứa bất kỳ thứ gì ngoài trường Loại cộng với 'loại phụ' tùy chọn. Các trường phổ biến ('id' và 'when' trong ví dụ của tôi) hiện được lưu giữ trong một thông báo 'EventCommon', được tạo thành mỗi 'subtype'. Vì vậy, bây giờ mỗi 'subtype' chứa tất cả các dữ liệu cần thiết. Điều này dường như làm việc tốt hơn. – laher