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

Spring Integration을 이용하여 UDP 서버를 열어두려고 했던 도중 문제가 발생하였다.

ionShutdownHook  메시지를 내뿜으며 계속 UDP 서버가 다운되는 것이였다.

https://stackoverflow.com/questions/52661889/spring-boot-syslog-udp-receiver-shuts-down

 

Spring boot Syslog UDP receiver shuts down

I am writing a UDP syslog message receiver in Spring Boot 1.5.6.RELEASE and it shuts down if I don't add spring-boot-starter-web dependency. The thing is I don't need web dependency because the

stackoverflow.com

해당 글에 따르면 Spring integration 의 UDP는 기본적으로 데몬 스레드로 동작하기 때문에

스프링 Application이 실행되고 나서 종료될때 데몬 스레드도 종료되기 때문에

로그에서도 main ->ionShutdownHook  으로 동작하는것을 확인할 수 있다.

때문에 독립적으로 실행가능한  task executor 로 실행해야 된다.

 

전체코드

import lombok.extern.log4j.Log4j2;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.TaskExecutor;
import org.springframework.integration.annotation.ServiceActivator;
import org.springframework.integration.annotation.Transformer;
import org.springframework.integration.channel.DirectChannel;
import org.springframework.integration.channel.RendezvousChannel;
import org.springframework.integration.ip.udp.UnicastReceivingChannelAdapter;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.MessageHandler;
import org.springframework.messaging.MessagingException;
import org.springframework.messaging.handler.annotation.Headers;
import org.springframework.messaging.handler.annotation.Payload;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.io.IOException;
import java.util.Map;

@Slf4j
@Configuration
public class InboundFlow {

    @Bean
    public MessageChannel udpInputChannel(){
        return new DirectChannel();
    }
    @Bean
    public MessageChannel udpOutputChannel() {
        return new DirectChannel();
    }

    // UDP adapter uses a daemon thread by default
    @Bean
    public UnicastReceivingChannelAdapter udpIn() {
        UnicastReceivingChannelAdapter adapter = new UnicastReceivingChannelAdapter(11111);
        adapter.setOutputChannelName("udpInputChannel");
        adapter.setTaskExecutor(executor());
        return adapter;
    }


    @Bean
    public TaskExecutor executor() {
        ThreadPoolTaskExecutor exec = new ThreadPoolTaskExecutor();
        exec.setCorePoolSize(5);
        return exec;
    }
    @Transformer(inputChannel = "udpInputChannel", outputChannel = "udpOutputChannel")
    public String transformer(@Payload byte[] payload, @Headers Map<String, Object> headers) {
        String message = new String(payload);
        return message;
    }

    @Bean
    @ServiceActivator(inputChannel = "udpOutputChannel")
    public MessageHandler udpMsgHandler() {
        return new MessageHandler() {
            @Override
            public void handleMessage(Message<?> message) throws MessagingException {
                log.info("inbound {}  "+ new String(message.getPayload().toString()));
            }
        };
    }

}

 

    @Bean
    public UnicastReceivingChannelAdapter udpIn() {
        UnicastReceivingChannelAdapter adapter = new UnicastReceivingChannelAdapter(11111);
        adapter.setOutputChannelName("udpInputChannel");
        adapter.setTaskExecutor(executor());
        return adapter;
    }

        adapter.setTaskExecutor(executor());

독립적으로 실행가능한 TaskExcutor 옵션을 주어서 문제를 해결 하였다.

 

잘 동작중~ 야호!

728x90
반응형
LIST