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 시키면 된다.
'Java & Spring' 카테고리의 다른 글
[트러블 슈팅] Jstack 을 통한 Thread Dump 및 분석 (0) | 2021.12.28 |
---|---|
JAVA 1.8 환경에서 MSSQL 접속 시 에러 해결 (0) | 2021.12.01 |
스프링 javax 에러 / 구형 스프링 프로젝트 javax 문제 / (0) | 2021.12.01 |
스프링 배치 Spring Batch [2] Hello Spring Batch 실행해보기 (0) | 2020.01.27 |
HTTP Range Requests 를 이용한 스프링 비디오 스트리밍 (1) | 2020.01.09 |
WRITTEN BY