Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
mica
mica-mqtt
提交
2e722326
mica-mqtt
项目概览
mica
/
mica-mqtt
通知
71
Star
1
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
mica-mqtt
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
2e722326
编写于
7月 27, 2021
作者:
如梦技术
🐛
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
✨
mqtt 服务端代码优化。
上级
b6ece9e3
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
56 addition
and
17 deletion
+56
-17
mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/MqttServer.java
...ain/java/net/dreamlu/iot/mqtt/core/server/MqttServer.java
+10
-2
mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/MqttServerAioListener.java
...t/dreamlu/iot/mqtt/core/server/MqttServerAioListener.java
+35
-11
mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/MqttServerCreator.java
...a/net/dreamlu/iot/mqtt/core/server/MqttServerCreator.java
+1
-1
mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/support/DefaultMqttServerProcessor.java
.../mqtt/core/server/support/DefaultMqttServerProcessor.java
+9
-3
mica-mqtt-example/src/main/java/net/dreamlu/iot/mqtt/benchmark/MqttBenchmark.java
...in/java/net/dreamlu/iot/mqtt/benchmark/MqttBenchmark.java
+1
-0
未找到文件。
mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/MqttServer.java
浏览文件 @
2e722326
...
...
@@ -234,8 +234,16 @@ public final class MqttServer {
public
boolean
stop
()
{
boolean
result
=
this
.
tioServer
.
stop
();
logger
.
info
(
"MqttServer stop result:{}"
,
result
);
sessionManager
.
clean
();
subscribeManager
.
clean
();
try
{
sessionManager
.
clean
();
}
catch
(
Throwable
e
)
{
logger
.
error
(
"Mqtt server stop session clean error."
,
e
);
}
try
{
subscribeManager
.
clean
();
}
catch
(
Throwable
e
)
{
logger
.
error
(
"Mqtt server stop subscribe clean error."
,
e
);
}
this
.
executor
.
shutdown
();
return
result
;
}
...
...
mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/MqttServerAioListener.java
浏览文件 @
2e722326
...
...
@@ -37,15 +37,18 @@ public class MqttServerAioListener extends DefaultAioListener {
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
MqttServerAioListener
.
class
);
private
final
IMqttMessageStore
messageStore
;
private
final
IMqttSessionManager
sessionManager
;
private
final
IMqttServerSubscribeManager
subscribeManager
;
private
final
IMqttMessageDispatcher
messageDispatcher
;
private
final
IMqttConnectStatusListener
clientStatusListener
;
public
MqttServerAioListener
(
IMqttMessageStore
messageStore
,
IMqttSessionManager
sessionManager
,
IMqttServerSubscribeManager
subscribeManager
,
IMqttMessageDispatcher
messageDispatcher
,
IMqttConnectStatusListener
clientStatusListener
)
{
this
.
messageStore
=
messageStore
;
this
.
sessionManager
=
sessionManager
;
this
.
subscribeManager
=
subscribeManager
;
this
.
messageDispatcher
=
messageDispatcher
;
this
.
clientStatusListener
=
clientStatusListener
;
}
...
...
@@ -68,10 +71,9 @@ public class MqttServerAioListener extends DefaultAioListener {
// 1. 对于异常断开连接,处理遗嘱消息
sendWillMessage
(
context
,
clientId
);
// 2. 释放资源
sessionManager
.
remove
(
clientId
);
Tio
.
unbindBsId
(
context
);
cleanUp
(
context
,
clientId
);
// 3. 下线事件
clientStatusListener
.
offline
(
clientId
);
notify
(
clientId
);
}
private
void
sendWillMessage
(
ChannelContext
context
,
String
clientId
)
{
...
...
@@ -80,18 +82,40 @@ public class MqttServerAioListener extends DefaultAioListener {
if
(
normalDisconnectMark
!=
null
)
{
return
;
}
// 2. 获取遗嘱消息
Message
willMessage
=
messageStore
.
getWillMessage
(
clientId
);
if
(
willMessage
==
null
)
{
return
;
}
// 3. 遗嘱消息发送
// 2. 发送遗嘱消息
try
{
Message
willMessage
=
messageStore
.
getWillMessage
(
clientId
);
if
(
willMessage
==
null
)
{
return
;
}
boolean
result
=
messageDispatcher
.
send
(
willMessage
);
logger
.
info
(
"Mqtt server send willMessage result:{}."
,
result
);
logger
.
info
(
"Mqtt server clientId:{} send willMessage result:{}."
,
clientId
,
result
);
// 4. 清理遗嘱消息
messageStore
.
clearWillMessage
(
clientId
);
}
catch
(
Throwable
throwable
)
{
logger
.
error
(
"Mqtt server clientId:{} send willMessage error."
,
clientId
,
throwable
);
}
}
private
void
cleanUp
(
ChannelContext
context
,
String
clientId
)
{
try
{
sessionManager
.
remove
(
clientId
);
}
catch
(
Throwable
throwable
)
{
logger
.
error
(
"Mqtt server
send willMessage error."
,
throwable
);
logger
.
error
(
"Mqtt server
clientId:{} session clean error."
,
clientId
,
throwable
);
}
try
{
subscribeManager
.
remove
(
clientId
);
}
catch
(
Throwable
throwable
)
{
logger
.
error
(
"Mqtt server clientId:{} subscribe clean error."
,
clientId
,
throwable
);
}
Tio
.
unbindBsId
(
context
);
}
private
void
notify
(
String
clientId
)
{
try
{
clientStatusListener
.
offline
(
clientId
);
}
catch
(
Throwable
throwable
)
{
logger
.
error
(
"Mqtt server clientId:{} offline notify error."
,
clientId
,
throwable
);
}
}
}
mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/MqttServerCreator.java
浏览文件 @
2e722326
...
...
@@ -287,7 +287,7 @@ public class MqttServerCreator {
ServerAioHandler
handler
=
new
MqttServerAioHandler
(
this
.
bufferAllocator
,
serverProcessor
);
// 2. t-io 监听
ServerAioListener
listener
=
new
MqttServerAioListener
(
this
.
messageStore
,
this
.
sessionManager
,
this
.
messageDispatcher
,
this
.
connectStatusListener
);
this
.
messageStore
,
this
.
sessionManager
,
this
.
subscribeManager
,
this
.
messageDispatcher
,
this
.
connectStatusListener
);
// 2. t-io 配置
ServerTioConfig
tioConfig
=
new
ServerTioConfig
(
this
.
name
,
handler
,
listener
);
// 4. 设置 t-io 心跳 timeout
...
...
mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/server/support/DefaultMqttServerProcessor.java
浏览文件 @
2e722326
...
...
@@ -39,6 +39,7 @@ import java.nio.ByteBuffer;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.concurrent.ScheduledThreadPoolExecutor
;
import
java.util.concurrent.TimeUnit
;
/**
* mqtt broker 处理器
...
...
@@ -93,9 +94,14 @@ public class DefaultMqttServerProcessor implements MqttServerProcessor {
// 3. 绑定 clientId
Tio
.
bindBsId
(
context
,
clientId
);
MqttConnectVariableHeader
variableHeader
=
mqttMessage
.
variableHeader
();
// 4. 心跳超时时间,当然这个值如果小于全局配置(默认:120s),定时检查的时间间隔还是以全局为准,只是在判断时用此值
int
keepAliveSeconds
=
variableHeader
.
keepAliveTimeSeconds
();
if
(
keepAliveSeconds
>
0
)
{
context
.
setHeartbeatTimeout
(
TimeUnit
.
SECONDS
.
toMillis
(
keepAliveSeconds
));
}
// TODO session 处理,先默认全部连接关闭时清除
// boolean cleanSession = variableHeader.isCleanSession();
//
4
. 存储遗嘱消息
//
5
. 存储遗嘱消息
boolean
willFlag
=
variableHeader
.
isWillFlag
();
if
(
willFlag
)
{
Message
willMessage
=
new
Message
();
...
...
@@ -105,9 +111,9 @@ public class DefaultMqttServerProcessor implements MqttServerProcessor {
willMessage
.
setRetain
(
variableHeader
.
isWillRetain
());
messageStore
.
addWillMessage
(
clientId
,
willMessage
);
}
//
5
. 返回 ack
//
6
. 返回 ack
connAckByReturnCode
(
clientId
,
context
,
MqttConnectReturnCode
.
CONNECTION_ACCEPTED
);
//
6
. 在线状态
//
7
. 在线状态
clientStatusListener
.
online
(
clientId
);
}
...
...
mica-mqtt-example/src/main/java/net/dreamlu/iot/mqtt/benchmark/MqttBenchmark.java
浏览文件 @
2e722326
...
...
@@ -38,6 +38,7 @@ public class MqttBenchmark {
MqttClient
client
=
MqttClient
.
create
()
.
username
(
"admin"
)
.
password
(
"123456"
)
.
readBufferSize
(
512
)
.
connect
();
// 3. 订阅服务端消息
client
.
subQos0
(
"/#"
,
(
topic
,
payload
)
->
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录