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 옵션을 주어서 문제를 해결 하였다.
잘 동작중~ 야호!
