반응형

0. 이슈사항

네티를 사용하다보니 반드시 구조를 이해하고 사용해야한다는 교훈을 얻고 있다.


이슈사항은 Shared 된 ChannelInboundHandler는 static 상태이기 때문에

ByteBuf 나 byte[]의 기본 Read 사이즈인 1024 byte를 초과시 channelRead 에서 받은 msg를 전역으로 쌓아서 channelReadComplete 로 처리하는게 불가능하다는 점이다.


1. 해결방안 모색


 1) Shared를 제거한다면?

 그렇다면, Shared를 제거하고, 받는 족족 new ChannelInboundHandler()를 하자니

리소스의 부담이 크다. 또한 Shared를 제거시에는 @Autowired 사용이 불가능하다.


 물론 @Autowired 된 Service 와 Component 를 직접 싱글튼 패턴으로 전환하는 

것도 가능하나 그러자니 Maven와 Spring을 쓰려고 개고생한게 아깝다.

 그러니 패스


 2) 다중 ChannelInboundHandler를 이용

 지금까지는 편의상 단일 Handler를 사용하고, 그것만이 전부인거 마냥 핸들러를

하나만 사용을 했었다. 그리고 Channel과 Pipeline을 제대로 이해하지 못한 점도

있다. 


 다음 개념을 집고 넘어가자.


 Channel은 Pipeline을 흐르면서 로직이 Handling 되는데, 이때 크게 Inbound 핸들러

와 Outbound 핸들러가 있다. 이는 다중으로 생성가능하고 각각을 순서대로 처리할

수도 있으며, 첫번째 핸들러에서 분기에 따라 바로 마지막 핸들러로 흐를 수도, Out

bound 할 수도 있다.



 그렇다면 먼저 ChannelInitialization을 할 때 한 채널을 통해 들어오는 모든 Message를 Gathering해서 Shared 핸들러로 Passing해주면 될 것 같다.



2. 결과

 결과는 잘 된다. pipeline에 Gathering Handler를 처음 등록하고 ReadComplete되는 

순간 fireChannelRead 하여 Shared Handler에 전달하고 받은 결과를 처리하고, 자신은

Close 시키면 된다.




반응형

WRITTEN BY
데르벨준

,