注:ApplicationRunner 接口是在容器启动成功后的最后一步回调(类似开机自启动)。
UDPServer
1package com.vmware.vCenterEvent.netty; 2 3import io.netty.bootstrap.Bootstrap; 4import io.netty.channel.*; 5import io.netty.channel.nio.NioEventLoopGroup; 6import io.netty.channel.socket.nio.NioDatagramChannel; 7import lombok.extern.log4j.Log4j2; 8import org.springframework.boot.ApplicationArguments; 9import org.springframework.boot.ApplicationRunner; 10import org.springframework.stereotype.Component; 11 12@Log4j2 13@Component 14public class UdpServer implements ApplicationRunner { 15 16 private final Bootstrap bootstrap; 17 18 private final NioEventLoopGroup group; 19 20 private Channel channel; 21 22 private void Start() throws InterruptedException { 23 try { 24 channel = bootstrap.bind("0.0.0.0", 8888).sync().channel(); 25 System.out.println("UdpServer start success"); 26 channel.closeFuture().await(); 27 } finally { 28 group.shutdownGracefully(); 29 } 30 } 31 32 private static final class NettyUdpServerHolder { 33 static final NettyUdpServer INSTANCE = new NettyUdpServer(); 34 } 35 36 public static NettyUdpServer getInstance() { 37 return NettyUdpServerHolder.INSTANCE; 38 } 39 40 private NettyUdpServer() { 41 group = new NioEventLoopGroup(); 42 bootstrap = new Bootstrap(); 43 bootstrap.group(group) 44 .channel(NioDatagramChannel.class) 45 .option(ChannelOption.SO_BROADCAST, true) 46 .option(ChannelOption.SO_RCVBUF, 1024 * 1024 * 100) 47 .handler(new ChannelInitializer<Channel>() { 48 @Override 49 protected void initChannel(Channel channel) throws Exception { 50 ChannelPipeline pipeline = channel.pipeline(); 51 pipeline.addLast(new NettyUdpServerHandler()); 52 } 53 }); 54 } 55 56 @Override 57 public void run(ApplicationArguments args) throws Exception { 58 NettyUdpServer.getInstance().Start(); 59 } 60}
UDPServerHandler
1import com.vmware.vCenterEvent.domain.Syslog; 2import io.netty.channel.ChannelHandlerContext; 3import io.netty.channel.SimpleChannelInboundHandler; 4import io.netty.channel.socket.DatagramPacket; 5import io.netty.util.CharsetUtil; 6import lombok.extern.log4j.Log4j2; 7import org.springframework.beans.factory.annotation.Autowired; 8import org.springframework.beans.factory.annotation.Value; 9import org.springframework.jms.core.JmsMessagingTemplate; 10import org.springframework.stereotype.Component; 11 12import javax.annotation.PostConstruct; 13 14@Log4j2 15@Component 16public class NettyUdpServerHandler extends SimpleChannelInboundHandler<DatagramPacket> { 17 18 public static NettyUdpServerHandler nettyUdpServerHandler; 19 20 @Autowired 21 private JmsMessagingTemplate jmsMessagingTemplate; 22 23 public NettyUdpServerHandler(){ 24 } 25 26 @PostConstruct 27 public void init(){ 28 nettyUdpServerHandler = this; 29 nettyUdpServerHandler.jmsMessagingTemplate = this.jmsMessagingTemplate; 30 } 31 32 @Override 33 protected void channelRead0(ChannelHandlerContext ctx, DatagramPacket msg) { 34 // log.info("开始接收数据"); 35 String msgString = msg.content().toString(CharsetUtil.UTF_8); // 将接收到数据放入ActiveMQ队列中 36 nettyUdpServerHandler.jmsMessagingTemplate.convertAndSend("mq", msgString); 37 } 38 39}