내 채널 파이프 라인에는 여러 개의 디코더가 포함되어 있으며 모두 TextWebSocketFrame 메시지에서 작동합니다. 이제 내 문제는 일부 메시지 내용에 올바른 디코더 기반을 선택해야한다는 것입니다.netty 디코더 내부의 메시지를 파이프 라인의 다음 처리기/디코더로 보내는 방법은 무엇입니까?
본질적으로 메시지의 특정 필드를 구문 분석 한 다음 메시지 처리를 계속할지 아니면 다음 인코더/처리기로 메시지를 전달할지 결정해야합니다.
대부분의 경우 단일 디코더를 사용하여 모든 메시지를 디코딩하는 것이 좋지만 일부 문제는 일부 디코더가 동적으로 추가되고 모든 로직을 단일 디코더에 넣는 것이 엉망입니다.
는 현재 코드는 다음과 같습니다
@Override
protected void decode(ChannelHandlerContext ctx, TextWebSocketFrame msg, List<Object> out) throws Exception {
String messageAsJson = msg.text();
JsonObject jsonObject = JSON_PARSER.fromJson(messageAsJson, JsonObject.class);
JsonObject messageHeader = jsonObject.getAsJsonObject(MESSAGE_HEADER_FIELD);
String serviceAsString = messageHeader.get(MESSAGE_SERVICE_FIELD).getAsString();
String inboundTypeAsString = messageHeader.get(MESSAGE_TYPE_FIELD).getAsString();
Service service = JSON_PARSER.fromJson(serviceAsString, Service.class);
InboundType inboundType = JSON_PARSER.fromJson(inboundTypeAsString, InboundType.class);
if (service == Service.STREAMING) {
out.add(decodeQuotesMessage(inboundType, messageAsJson));
} else {
}
}
그래서 기본적으로 나는 파이프 라인의 다음 핸들러로 메시지를 전달하는 다른 지점에서 약간의 논리를 필요 했어.
이 방법은 가장 효율적인 방법은 아니지만이 논리와 빠른 경로를 포함하여 서비스의 아키텍처가 다른 스레드 풀에서 실행되는 느린 경로를 가지고 있다는 것을 알고 있습니다. 따라서 나는이 장소에서 느린 코드를 받아 들일 수있다.
if (service == Service.STREAMING) {
ctx.pipeline().addLast(new StreamingHandler());
} else {
ctx.pipeline().addLast(new OtherHandler());
}
out.add(decodeQuotesMessage(inboundType, messageAsJson));
ctx.pipeline().remove(this);
논리 뒤에 다음과 같습니다 : 일반적으로