본문으로 바로가기
728x90
반응형
SMALL

Spring Integration Udp 통신중 버퍼 크기로 인한 트러블 슈팅

실제 udp 통신으로 6000 크기의 바이트 데이터들을 받고 있음

 

그러나 문제 터짐

나는 6654 크기의 바이트 패킷을 받았지만 디버깅 결과 2048 이라는 잘린 패킷을 받음

    @ServiceActivator(inputChannel = "udpInputChannel")
    public void receiveUdpMessage(Message message) {
        log.info("udpInputChannel {}",Thread.currentThread().getName());
        byte[] bytes = (byte[]) message.getPayload();
        ...

패킷이 잘렸기 때문에 정상적인 데이터로 인식하지 못하여 비즈니스 로직에서 Exception을 발생

 

그러면 왜 정상적인 크기로 패킷을 못받을까?

 

나는 기본적으로 Spring Integration의 AbstractInternetProtocolReceivingChannelAdapter 를 사용해서 udp 통신중

이며 받은 데이터는 내부 udpInputChannel 채널로 전송하고 있음

    @Bean
    public AbstractInternetProtocolReceivingChannelAdapter UdpDynamicBean(){
        log.info("UDP Protocol: {}", protocol);
        UnicastReceivingChannelAdapter uni = new UnicastReceivingChannelAdapter(port);
        //uni.setOutputChannel(udpOutputChannel());
        uni.setOutputChannelName("udpInputChannel");
        uni.setTaskExecutor(executor());


        if (protocol.equalsIgnoreCase("multicast")){
            MulticastReceivingChannelAdapter multi = new MulticastReceivingChannelAdapter(multicastIp,port);
            //네트워크 인터페이스 ip

            multi.setLocalAddress(networkInterfaceIp);
            multi.setOutputChannelName("udpInputChannel");
            multi.setTaskExecutor(executor());
            return multi;
        }
        return uni;
    }

 

AbstractInternetProtocolReceivingChannelAdapter 의 내부 구현을 보게되면 UDP 데이터를 수신 받을때 버퍼 크기의 기본 값이 2048 로 잡혀 있는것을 확인할 수 있음! (잡았다 요놈!)

일반적으로 자바로 UDP 소켓을 구현하는 경우, UDP의 버퍼는 운영체제의 정책에 따라서 결정되지만

 

Spring Integration의 경우는 추상화되었기 때문에 버퍼 크기를 설정해주어야한다.

 

결국 1MB로 늘려줬고 잘된다.

 

    @Bean
    public AbstractInternetProtocolReceivingChannelAdapter UdpDynamicBean(){
        log.info("UDP Protocol: {}", protocol);
        UnicastReceivingChannelAdapter uni = new UnicastReceivingChannelAdapter(port);
        //uni.setOutputChannel(udpOutputChannel());
        uni.setOutputChannelName("udpInputChannel");
        uni.setTaskExecutor(executor());
        //버퍼 크기 설정
        uni.setReceiveBufferSize(1024*1024);

 

728x90
반응형
LIST