2011-11-15 3 views
1

Netty 및 Protobuf를 사용하여 메시지 배포자를 구현하고 싶습니다. 배포자는 기본 protobuf 메시지에 대해 알고 있고 확장을 가지고 있으며 확장을 위해 등록하는 다른 클래스로 전달하는 서버입니다.Netty에서 protobuf 확장을 사용하여 일반 배포자 구현

Protobuf는 확장명을 별도의 파일로 선언 할 수 있으므로 배포자는 확장명의 형식을 알 필요가 없습니다. 그러나 이것은 Netty 배관과 함께 모든 확장 기능을 알고있는 ExtensionRegistry로 ProtobufDecoder를 만들 필요가 있습니다. 그렇지 않으면 here으로 설명한 문제가 발생합니다.

여기에 뭔가가 누락 되었습니까? 아니면 내 자신의 디코더를 쓰지 않고 할 수없는 것입니까? Java에 예제가 있으면 매우 도움이 될 것입니다.

답변

1

the API documentation에 설명 된대로 ProtobufDecoder을 구성 할 때 ExtensionRegistry을 지정할 수 있습니다.

+0

고마워요, Trustin - 이미 알고 있었지만 제가 혼란 스러웠던 점은 배포자가 모든 확장 기능에 대해 알 필요가 없기 때문에 ProtobufDecoder에 제공 한 ExtensionRegistry가 거의 비어 있음을 알았 기 때문입니다. 생각 해보니 * 괜찮습니다. 메시지를 재결합하여 처리기에 전달할 수 있습니다. 처리기는 관련 확장 기능을 알고있는 ExtensionRegistry를 사용하여 자체 디코딩을 수행합니다. 옳은? –

+0

불행히도 protobuf 확장자로 작업 할 기회가 없었기 때문에 올바른지 확실하지 않습니다. 내 생각 엔 그래도 작동해야합니다. 다시 돌아와서 작동하는지 알려주십시오. – trustin

0

내 두 가지 센트는 요소 목록이나 크기가 큰 메시지 일 가능성이있는 경우 확장을 사용하지 않는다는 것입니다. protobuf 메시지와 함께 길이 프레이밍 디코더/인코더 중 하나를 사용하여 크기가 정확하게 구분되어야합니다. 메시지가 64kw/2 바이트 크기의 머리글에 맞도록하려면 메시지에서 ByteArray를 계속 호출하여 프레임 내에 맞는지 확인하는 것이 비효율적입니다.

마스터 메시지에서 확장자 대신 enum을 사용하는 대신 확장자에 포함되어있는 protobuf 직렬화 된 메시지 인 바이트 배열을 사용하십시오. 이렇게하면 메시지를 빌드 할 때 메시지에 후치 데이터를 보관할 수 있습니다. 크기 제한을 초과하여 실행하면 Netty가 프레임에 비해 너무 큰 예외를 던지기보다는 정상적으로 반으로 분할 할 수 있습니다.