最近接了个智能手表项目,正好学习实践下netty
对于netty的I/O模型,设计尽量不在在EventLoopGroup线程中处理耗时业务逻辑,这里我引入了MQ(rabbitMQ),netty服务端在接收到客户端指令以后,不作逻辑处理
只提取出客户端channel标记信息,就转发指令到MQ,通过业务线程池专门处理业务。当需要向客户端主动推送消息时候,监听MQ队列,解析指令,主动推送消息到需要推送的客户端。
初步设计流程图大体如下:
首先netty服务端实例代码:
/**
* Created by peng.wang on 2017/3/31.
*/
public class NettyServer {
/**
* the core handler
*/
private MessageHandler messageHandler;
public void bind(int port){
/**
* used to accept client connection
*/
EventLoopGroup bossGroup = new NioEventLoopGroup();
/**
* used to handle all the events and IO for socketChannel
*/
EventLoopGroup workerGroup = new NioEventLoopGroup(4);
try{
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup,workerGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG,1024)
// set keepalive
.childOption(ChannelOption.SO_KEEPALIVE,true)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
//ch.pipeline().addLast(new IdleStateHandler(0,0,300));