/\*\*
* 网关状态
*
* @return 网关状态
*/
Boolean status();
}
#### 使用netty实现mqtt server
这里使用netty来实现mqtt server。
package com.soft863.gateway.mqtt;
import com.soft863.gateway.DeviceGateway;
import com.soft863.gateway.message.codec.DefaultTransport;
import com.soft863.gateway.message.codec.Transport;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import io.netty.util.ResourceLeakDetector;
import lombok.extern.slf4j.Slf4j;
/**
* @Author: 刘华林
* @Date: 21-3-9 下午20:07
* @Version 2.0
*/
@Slf4j
public class MqttServerGateway implements DeviceGateway {
/\*\* 网关ID(为后续多实例扩展) \*/
private String id;
/\*\* 服务端口 \*/
private Integer port;
/\*\* netty boos线程 \*/
private Integer bossGroupThreadCount;
/\*\* netty woreker线程数 推荐设置为核数\*2 \*/
private Integer workerGroupThreadCount;
/\*\* 网关状态 true 启动 false 关闭 \*/
private Boolean status;
/\*\*
* DISABLED(禁用): 不进行内存泄露的检测;
*
* SIMPLE(操作简单): 抽样检测,且只对部分方法调用进行记录,消耗较小,有泄漏时可能会延迟报告,默认级别;
*
* ADVANCED(高级): 抽样检测,记录对象最近几次的调用记录,有泄漏时可能会延迟报告;
*
* PARANOID(偏执): 每次创建一个对象时都进行泄露检测,且会记录对象最近的详细调用记录。是比较激进的内存泄露检测级别,消耗最大,建议只在测试时使用。
*/
private String leakDetectorLevel;
/**
* 最大消息长度
*/
private Integer maxPayloadSize;
private ChannelFuture channelFuture;
private EventLoopGroup bossGroup;
private EventLoopGroup workerGroup;
public MqttServerGateway(String id,
Integer port,
Integer bossGroupThreadCount,
Integer workerGroupThreadCount,
String leakDetectorLevel,
Integer maxPayloadSize) {
this.id = id;
this.port = port;
this.bossGroupThreadCount = bossGroupThreadCount;
this.workerGroupThreadCount = workerGroupThreadCount;
this.leakDetectorLevel = leakDetectorLevel;
this.maxPayloadSize = maxPayloadSize;
}
@Override
public String getId() {
return this.id;
}
@Override
public Integer getPort() {
return this.port;
}
@Override
public Transport getTransport() {
return DefaultTransport.MQTT;
}
@Override
public void startup() {
log.info("Setting resource leak detector level to {}", leakDetectorLevel);
ResourceLeakDetector.setLevel(ResourceLeakDetector.Level.valueOf(leakDetectorLevel.toUpperCase()));
log.info("Starting Server");
//创建boss线程组 用于服务端接受客户端的连接
bossGroup = new NioEventLoopGroup(bossGroupThreadCount);
// 创建 worker 线程组 用于进行 SocketChannel 的数据读写
workerGroup = new NioEventLoopGroup(workerGroupThreadCount);
// 创建 ServerBootstrap 对象
ServerBootstrap b = new ServerBootstrap();
//设置使用的EventLoopGroup
b.group(bossGroup, workerGroup)
//设置要被实例化的为 NioServerSocketChannel 类
.channel(NioServerSocketChannel.class)
// 设置 NioServerSo