2017-11-15 13 views
1

내 채널 파이프 라인에는 여러 개의 디코더가 포함되어 있으며 모두 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); 

논리 뒤에 다음과 같습니다 : 일반적으로

답변

0

, 당신은 다음과 같이해야합니다 당신은 헤더를 디코딩

  1. 을 당신은 당신이 따를 필요가 흘러 지금 무엇을 알고;
  2. 헤더에 따라 특정 처리기를 파이프 라인에 추가합니다.
  3. 디코딩 된 메시지를 '아웃'목록에 추가하면 "이 디코딩 된 메시지를 파이프 라인의 다음 처리기로 보냅니다. 즉, 현재 처리기가 파이프 라인의 마지막 부분 인 경우 2 단계에서 정의 된 처리기"가됩니다.
  4. 프로토콜이 동일한 머리글을 반복해서 보낼 경우 핸들러가 중복되지 않도록 파이프 라인에서 현재 처리기를 제거합니다. 그러나이 단계는 프로토콜에 따라 다르며 필요하지 않을 수 있습니다.

이것은 일반적인 접근 방법이지만 실제로는 프로토콜 흐름에 따라 달라집니다.