package com.ggnykj.smartems.cloud.server.udpserver.server;
import com.ggnykj.smartems.cloud.server.udpserver.handler.ChineseProverbServerHandler;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioDatagramChannel;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.util.concurrent.*;
/**
* @author xk
* @date 2019/7/24 15:18
* udp数据接收处理服务,用于将udp数据发送到handler处理,解析表号,并且存储到rabbitmq
*/
@Service
@Component
public class UdpEventServer implements ApplicationRunner {
private Logger log = LoggerFactory.getLogger(UdpEventServer.class);
@Value("${udpServer.ports}")
private int port = 9701;
@Override
public void run(ApplicationArguments args) {
ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat("wbAdjust-%d").build();
ExecutorService singleThreadPool = new ThreadPoolExecutor(1, 1, 0, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<>(1024), factory, new ThreadPoolExecutor.AbortPolicy());
singleThreadPool.execute(this::doWork);
}
/**
* @return void
* @Author xk
* @Param []
* @Description : 数据接收线程 方法实现udp上传数据的接收,并将实现数据处理handler
* @Date 2019/8/2 17:00
**/
private void doWork() {
try {
EventLoopGroup group = new NioEventLoopGroup();
Bootstrap b = new Bootstrap();
//由于我们用的是UDP协议,所以要用NioDatagramChannel来创建
b.group(group)
.channel(NioDatagramChannel.class)
.option(ChannelOption.SO_BROADCAST, true)//支持广播
.handler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) throws Exception {
ChannelPipeline pipeline = ch.pipeline();
pipeline.addLast(new ChineseProverbServerHandler());
}
});
b.bind(port).sync().channel().closeFuture().await();
} catch (InterruptedException e) {
e.printStackTrace();
log.error("执行udp接收服务出错" + e.getMessage());
}
}
}