SpringBoot 集成Netty实现UDP Server
注:ApplicationRunner 接口是在容器启动成功后的最后一步回调(类似开机自启动)。
UDPServer
package com.vmware.vCenterEvent.netty; import io.netty.bootstrap.Bootstrap; import io.netty.channel.*; import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioDatagramChannel; import lombok.extern.log4j.Log4j2; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; @Log4j2 @Component public class UdpServer implements ApplicationRunner { private final Bootstrap bootstrap; private final NioEventLoopGroup group; private Channel channel; private void Start() throws InterruptedException { try { channel = bootstrap.bind("0.0.0.0", 8888).sync().channel(); System.out.println("UdpServer start success"); channel.closeFuture().await(); } finally { group.shutdownGracefully(); } } private static final class NettyUdpServerHolder { static final NettyUdpServer INSTANCE = new NettyUdpServer(); } public static NettyUdpServer getInstance() { return NettyUdpServerHolder.INSTANCE; } private NettyUdpServer() { group = new NioEventLoopGroup(); bootstrap = new Bootstrap(); bootstrap.group(group) .channel(NioDatagramChannel.class) .option(ChannelOption.SO_BROADCAST, true) .option(ChannelOption.SO_RCVBUF, 1024 * 1024 * 100) .handler(new ChannelInitializer<Channel>() { @Override protected void initChannel(Channel channel) throws Exception { ChannelPipeline pipeline = channel.pipeline(); pipeline.addLast(new NettyUdpServerHandler()); } }); } @Override public void run(ApplicationArguments args) throws Exception { NettyUdpServer.getInstance().Start(); } }
UDPServerHandler
import com.vmware.vCenterEvent.domain.Syslog; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.socket.DatagramPacket; import io.netty.util.CharsetUtil; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @Log4j2 @Component public class NettyUdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket> { public static NettyUdpServerHandler nettyUdpServerHandler; @Autowired private JmsMessagingTemplate jmsMessagingTemplate; public NettyUdpServerHandler(){ } @PostConstruct public void init(){ nettyUdpServerHandler = this; nettyUdpServerHandler.jmsMessagingTemplate = this.jmsMessagingTemplate; } @Override protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) { // log.info("开始接收数据"); String msgString = msg.content().toString(CharsetUtil.UTF_8);
// 将接收到数据放入ActiveMQ队列中 nettyUdpServerHandler.jmsMessagingTemplate.convertAndSend("mq", msgString); } }