Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
mica
mica-mqtt
提交
df190793
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,发现更多精彩内容 >>
提交
df190793
编写于
11月 21, 2021
作者:
如梦技术
🐛
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
✨
mica-mqtt-broker 调整默认的序列化方式。
上级
f666adbd
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
55 addition
and
13 deletion
+55
-13
mica-mqtt-broker/src/main/java/net/dreamlu/iot/mqtt/broker/cluster/RedisMqttMessageDispatcher.java
...u/iot/mqtt/broker/cluster/RedisMqttMessageDispatcher.java
+7
-2
mica-mqtt-broker/src/main/java/net/dreamlu/iot/mqtt/broker/cluster/RedisMqttMessageReceiver.java
...mlu/iot/mqtt/broker/cluster/RedisMqttMessageReceiver.java
+5
-1
mica-mqtt-broker/src/main/java/net/dreamlu/iot/mqtt/broker/cluster/RedisMqttMessageStore.java
...reamlu/iot/mqtt/broker/cluster/RedisMqttMessageStore.java
+29
-4
mica-mqtt-broker/src/main/java/net/dreamlu/iot/mqtt/broker/config/MqttBrokerConfiguration.java
...eamlu/iot/mqtt/broker/config/MqttBrokerConfiguration.java
+14
-5
mica-mqtt-broker/src/main/java/net/dreamlu/iot/mqtt/broker/serializer/package-info.java
.../net/dreamlu/iot/mqtt/broker/serializer/package-info.java
+0
-1
未找到文件。
mica-mqtt-broker/src/main/java/net/dreamlu/iot/mqtt/broker/cluster/RedisMqttMessageDispatcher.java
浏览文件 @
df190793
...
@@ -18,6 +18,7 @@ package net.dreamlu.iot.mqtt.broker.cluster;
...
@@ -18,6 +18,7 @@ package net.dreamlu.iot.mqtt.broker.cluster;
import
net.dreamlu.iot.mqtt.core.server.dispatcher.IMqttMessageDispatcher
;
import
net.dreamlu.iot.mqtt.core.server.dispatcher.IMqttMessageDispatcher
;
import
net.dreamlu.iot.mqtt.core.server.model.Message
;
import
net.dreamlu.iot.mqtt.core.server.model.Message
;
import
net.dreamlu.iot.mqtt.core.server.serializer.IMessageSerializer
;
import
net.dreamlu.mica.core.utils.JsonUtil
;
import
net.dreamlu.mica.core.utils.JsonUtil
;
import
net.dreamlu.mica.redis.cache.MicaRedisCache
;
import
net.dreamlu.mica.redis.cache.MicaRedisCache
;
import
org.springframework.data.redis.core.RedisCallback
;
import
org.springframework.data.redis.core.RedisCallback
;
...
@@ -33,17 +34,21 @@ import java.util.Objects;
...
@@ -33,17 +34,21 @@ import java.util.Objects;
*/
*/
public
class
RedisMqttMessageDispatcher
implements
IMqttMessageDispatcher
{
public
class
RedisMqttMessageDispatcher
implements
IMqttMessageDispatcher
{
private
final
RedisTemplate
<
String
,
Object
>
redisTemplate
;
private
final
RedisTemplate
<
String
,
Object
>
redisTemplate
;
private
final
IMessageSerializer
messageSerializer
;
private
final
byte
[]
channelBytes
;
private
final
byte
[]
channelBytes
;
public
RedisMqttMessageDispatcher
(
MicaRedisCache
redisCache
,
String
channel
)
{
public
RedisMqttMessageDispatcher
(
MicaRedisCache
redisCache
,
IMessageSerializer
messageSerializer
,
String
channel
)
{
this
.
redisTemplate
=
redisCache
.
getRedisTemplate
();
this
.
redisTemplate
=
redisCache
.
getRedisTemplate
();
this
.
messageSerializer
=
messageSerializer
;
this
.
channelBytes
=
RedisSerializer
.
string
().
serialize
(
Objects
.
requireNonNull
(
channel
,
"Redis pub/sub channel is null."
));
this
.
channelBytes
=
RedisSerializer
.
string
().
serialize
(
Objects
.
requireNonNull
(
channel
,
"Redis pub/sub channel is null."
));
}
}
@Override
@Override
public
boolean
send
(
Message
message
)
{
public
boolean
send
(
Message
message
)
{
// 手动序列化和反序列化,避免 redis 序列化不一致问题
// 手动序列化和反序列化,避免 redis 序列化不一致问题
final
byte
[]
messageBytes
=
JsonUtil
.
toJsonAsBytes
(
message
);
final
byte
[]
messageBytes
=
messageSerializer
.
serialize
(
message
);
redisTemplate
.
execute
((
RedisCallback
<
Long
>)
connection
->
connection
.
publish
(
channelBytes
,
messageBytes
));
redisTemplate
.
execute
((
RedisCallback
<
Long
>)
connection
->
connection
.
publish
(
channelBytes
,
messageBytes
));
return
true
;
return
true
;
}
}
...
...
mica-mqtt-broker/src/main/java/net/dreamlu/iot/mqtt/broker/cluster/RedisMqttMessageReceiver.java
浏览文件 @
df190793
...
@@ -20,6 +20,7 @@ import net.dreamlu.iot.mqtt.broker.service.IMqttMessageService;
...
@@ -20,6 +20,7 @@ import net.dreamlu.iot.mqtt.broker.service.IMqttMessageService;
import
net.dreamlu.iot.mqtt.codec.MqttMessageType
;
import
net.dreamlu.iot.mqtt.codec.MqttMessageType
;
import
net.dreamlu.iot.mqtt.core.server.MqttServer
;
import
net.dreamlu.iot.mqtt.core.server.MqttServer
;
import
net.dreamlu.iot.mqtt.core.server.model.Message
;
import
net.dreamlu.iot.mqtt.core.server.model.Message
;
import
net.dreamlu.iot.mqtt.core.server.serializer.IMessageSerializer
;
import
net.dreamlu.iot.mqtt.core.server.session.IMqttSessionManager
;
import
net.dreamlu.iot.mqtt.core.server.session.IMqttSessionManager
;
import
net.dreamlu.mica.core.utils.JsonUtil
;
import
net.dreamlu.mica.core.utils.JsonUtil
;
import
net.dreamlu.mica.redis.cache.MicaRedisCache
;
import
net.dreamlu.mica.redis.cache.MicaRedisCache
;
...
@@ -39,16 +40,19 @@ import java.util.Objects;
...
@@ -39,16 +40,19 @@ import java.util.Objects;
*/
*/
public
class
RedisMqttMessageReceiver
implements
MessageListener
,
InitializingBean
{
public
class
RedisMqttMessageReceiver
implements
MessageListener
,
InitializingBean
{
private
final
RedisTemplate
<
String
,
Object
>
redisTemplate
;
private
final
RedisTemplate
<
String
,
Object
>
redisTemplate
;
private
final
IMessageSerializer
messageSerializer
;
private
final
String
channel
;
private
final
String
channel
;
private
final
MqttServer
mqttServer
;
private
final
MqttServer
mqttServer
;
private
final
IMqttSessionManager
sessionManager
;
private
final
IMqttSessionManager
sessionManager
;
private
final
IMqttMessageService
messageService
;
private
final
IMqttMessageService
messageService
;
public
RedisMqttMessageReceiver
(
MicaRedisCache
redisCache
,
public
RedisMqttMessageReceiver
(
MicaRedisCache
redisCache
,
IMessageSerializer
messageSerializer
,
String
channel
,
String
channel
,
MqttServer
mqttServer
,
MqttServer
mqttServer
,
IMqttMessageService
messageService
)
{
IMqttMessageService
messageService
)
{
this
.
redisTemplate
=
redisCache
.
getRedisTemplate
();
this
.
redisTemplate
=
redisCache
.
getRedisTemplate
();
this
.
messageSerializer
=
messageSerializer
;
this
.
channel
=
Objects
.
requireNonNull
(
channel
,
"Redis pub/sub channel is null."
);
this
.
channel
=
Objects
.
requireNonNull
(
channel
,
"Redis pub/sub channel is null."
);
this
.
mqttServer
=
mqttServer
;
this
.
mqttServer
=
mqttServer
;
this
.
sessionManager
=
mqttServer
.
getServerCreator
().
getSessionManager
();
this
.
sessionManager
=
mqttServer
.
getServerCreator
().
getSessionManager
();
...
@@ -59,7 +63,7 @@ public class RedisMqttMessageReceiver implements MessageListener, InitializingBe
...
@@ -59,7 +63,7 @@ public class RedisMqttMessageReceiver implements MessageListener, InitializingBe
public
void
onMessage
(
org
.
springframework
.
data
.
redis
.
connection
.
Message
message
,
byte
[]
bytes
)
{
public
void
onMessage
(
org
.
springframework
.
data
.
redis
.
connection
.
Message
message
,
byte
[]
bytes
)
{
byte
[]
messageBody
=
message
.
getBody
();
byte
[]
messageBody
=
message
.
getBody
();
// 手动序列化和反序列化,避免 redis 序列化不一致问题
// 手动序列化和反序列化,避免 redis 序列化不一致问题
Message
mqttMessage
=
JsonUtil
.
readValue
(
messageBody
,
Message
.
class
);
Message
mqttMessage
=
messageSerializer
.
deserialize
(
messageBody
);
if
(
mqttMessage
==
null
)
{
if
(
mqttMessage
==
null
)
{
return
;
return
;
}
}
...
...
mica-mqtt-broker/src/main/java/net/dreamlu/iot/mqtt/broker/cluster/RedisMqttMessageStore.java
浏览文件 @
df190793
...
@@ -20,9 +20,13 @@ import lombok.RequiredArgsConstructor;
...
@@ -20,9 +20,13 @@ import lombok.RequiredArgsConstructor;
import
net.dreamlu.iot.mqtt.broker.enums.RedisKeys
;
import
net.dreamlu.iot.mqtt.broker.enums.RedisKeys
;
import
net.dreamlu.iot.mqtt.broker.util.RedisUtil
;
import
net.dreamlu.iot.mqtt.broker.util.RedisUtil
;
import
net.dreamlu.iot.mqtt.core.server.model.Message
;
import
net.dreamlu.iot.mqtt.core.server.model.Message
;
import
net.dreamlu.iot.mqtt.core.server.serializer.IMessageSerializer
;
import
net.dreamlu.iot.mqtt.core.server.store.IMqttMessageStore
;
import
net.dreamlu.iot.mqtt.core.server.store.IMqttMessageStore
;
import
net.dreamlu.iot.mqtt.core.util.MqttTopicUtil
;
import
net.dreamlu.iot.mqtt.core.util.MqttTopicUtil
;
import
net.dreamlu.mica.redis.cache.MicaRedisCache
;
import
net.dreamlu.mica.redis.cache.MicaRedisCache
;
import
org.springframework.data.redis.core.RedisCallback
;
import
org.springframework.data.redis.core.RedisTemplate
;
import
org.springframework.data.redis.serializer.RedisSerializer
;
import
java.util.ArrayList
;
import
java.util.ArrayList
;
import
java.util.List
;
import
java.util.List
;
...
@@ -36,10 +40,12 @@ import java.util.regex.Pattern;
...
@@ -36,10 +40,12 @@ import java.util.regex.Pattern;
@RequiredArgsConstructor
@RequiredArgsConstructor
public
class
RedisMqttMessageStore
implements
IMqttMessageStore
{
public
class
RedisMqttMessageStore
implements
IMqttMessageStore
{
private
final
MicaRedisCache
redisCache
;
private
final
MicaRedisCache
redisCache
;
private
final
IMessageSerializer
messageSerializer
;
@Override
@Override
public
boolean
addWillMessage
(
String
clientId
,
Message
message
)
{
public
boolean
addWillMessage
(
String
clientId
,
Message
message
)
{
redisCache
.
set
(
RedisKeys
.
MESSAGE_STORE_WILL
.
getKey
(
clientId
),
message
);
byte
[]
value
=
messageSerializer
.
serialize
(
message
);
redis
((
redis
)
->
redis
.
set
(
keySerialize
(
RedisKeys
.
MESSAGE_STORE_WILL
,
clientId
),
value
));
return
true
;
return
true
;
}
}
...
@@ -51,12 +57,14 @@ public class RedisMqttMessageStore implements IMqttMessageStore {
...
@@ -51,12 +57,14 @@ public class RedisMqttMessageStore implements IMqttMessageStore {
@Override
@Override
public
Message
getWillMessage
(
String
clientId
)
{
public
Message
getWillMessage
(
String
clientId
)
{
return
redisCache
.
get
(
RedisKeys
.
MESSAGE_STORE_WILL
.
getKey
(
clientId
));
byte
[]
value
=
redis
((
redis
)
->
redis
.
get
(
keySerialize
(
RedisKeys
.
MESSAGE_STORE_WILL
,
clientId
)));
return
messageSerializer
.
deserialize
(
value
);
}
}
@Override
@Override
public
boolean
addRetainMessage
(
String
topic
,
Message
message
)
{
public
boolean
addRetainMessage
(
String
topic
,
Message
message
)
{
redisCache
.
set
(
RedisKeys
.
MESSAGE_STORE_RETAIN
.
getKey
(
topic
),
message
);
byte
[]
value
=
messageSerializer
.
serialize
(
message
);
redis
((
redis
)
->
redis
.
set
(
keySerialize
(
RedisKeys
.
MESSAGE_STORE_RETAIN
,
topic
),
value
));
return
true
;
return
true
;
}
}
...
@@ -77,10 +85,27 @@ public class RedisMqttMessageStore implements IMqttMessageStore {
...
@@ -77,10 +85,27 @@ public class RedisMqttMessageStore implements IMqttMessageStore {
redisCache
.
scan
(
redisKeyPattern
,
(
key
)
->
{
redisCache
.
scan
(
redisKeyPattern
,
(
key
)
->
{
String
keySuffix
=
key
.
substring
(
keyPrefixLength
);
String
keySuffix
=
key
.
substring
(
keyPrefixLength
);
if
(
topicPattern
.
matcher
(
keySuffix
).
matches
())
{
if
(
topicPattern
.
matcher
(
keySuffix
).
matches
())
{
retainMessageList
.
add
(
redisCache
.
get
(
key
));
byte
[]
value
=
redis
((
redis
)
->
redis
.
get
(
keySerialize
(
key
)));
Message
message
=
messageSerializer
.
deserialize
(
value
);
if
(
message
!=
null
)
{
retainMessageList
.
add
(
message
);
}
}
}
});
});
return
retainMessageList
;
return
retainMessageList
;
}
}
private
byte
[]
keySerialize
(
String
redisKey
)
{
return
RedisSerializer
.
string
().
serialize
(
redisKey
);
}
private
byte
[]
keySerialize
(
RedisKeys
suffix
,
String
clientId
)
{
return
RedisSerializer
.
string
().
serialize
(
suffix
.
getKey
(
clientId
));
}
private
<
T
>
T
redis
(
RedisCallback
<
T
>
callback
)
{
RedisTemplate
<
String
,
Object
>
redisTemplate
=
redisCache
.
getRedisTemplate
();
return
redisTemplate
.
execute
(
callback
);
}
}
}
mica-mqtt-broker/src/main/java/net/dreamlu/iot/mqtt/broker/config/MqttBrokerConfiguration.java
浏览文件 @
df190793
...
@@ -26,6 +26,8 @@ import net.dreamlu.iot.mqtt.core.server.MqttServer;
...
@@ -26,6 +26,8 @@ import net.dreamlu.iot.mqtt.core.server.MqttServer;
import
net.dreamlu.iot.mqtt.core.server.broker.MqttBrokerMessageListener
;
import
net.dreamlu.iot.mqtt.core.server.broker.MqttBrokerMessageListener
;
import
net.dreamlu.iot.mqtt.core.server.dispatcher.IMqttMessageDispatcher
;
import
net.dreamlu.iot.mqtt.core.server.dispatcher.IMqttMessageDispatcher
;
import
net.dreamlu.iot.mqtt.core.server.event.IMqttConnectStatusListener
;
import
net.dreamlu.iot.mqtt.core.server.event.IMqttConnectStatusListener
;
import
net.dreamlu.iot.mqtt.core.server.serializer.DefaultMessageSerializer
;
import
net.dreamlu.iot.mqtt.core.server.serializer.IMessageSerializer
;
import
net.dreamlu.iot.mqtt.core.server.store.IMqttMessageStore
;
import
net.dreamlu.iot.mqtt.core.server.store.IMqttMessageStore
;
import
net.dreamlu.mica.redis.cache.MicaRedisCache
;
import
net.dreamlu.mica.redis.cache.MicaRedisCache
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.context.ApplicationContext
;
...
@@ -40,6 +42,11 @@ import org.springframework.context.annotation.Configuration;
...
@@ -40,6 +42,11 @@ import org.springframework.context.annotation.Configuration;
@Configuration
(
proxyBeanMethods
=
false
)
@Configuration
(
proxyBeanMethods
=
false
)
public
class
MqttBrokerConfiguration
{
public
class
MqttBrokerConfiguration
{
@Bean
public
IMessageSerializer
messageSerializer
()
{
return
DefaultMessageSerializer
.
INSTANCE
;
}
@Bean
@Bean
public
IMqttConnectStatusListener
mqttBrokerConnectListener
(
ApplicationContext
context
,
public
IMqttConnectStatusListener
mqttBrokerConnectListener
(
ApplicationContext
context
,
MicaRedisCache
redisCache
)
{
MicaRedisCache
redisCache
)
{
...
@@ -47,20 +54,22 @@ public class MqttBrokerConfiguration {
...
@@ -47,20 +54,22 @@ public class MqttBrokerConfiguration {
}
}
@Bean
@Bean
public
IMqttMessageStore
mqttMessageStore
(
MicaRedisCache
redisCache
)
{
public
IMqttMessageStore
mqttMessageStore
(
MicaRedisCache
redisCache
,
IMessageSerializer
messageSerializer
)
{
return
new
RedisMqttMessageStore
(
redisCache
);
return
new
RedisMqttMessageStore
(
redisCache
,
messageSerializer
);
}
}
@Bean
@Bean
public
RedisMqttMessageReceiver
mqttMessageReceiver
(
MicaRedisCache
redisCache
,
public
RedisMqttMessageReceiver
mqttMessageReceiver
(
MicaRedisCache
redisCache
,
IMessageSerializer
messageSerializer
,
MqttServer
mqttServer
,
MqttServer
mqttServer
,
IMqttMessageService
mqttMessageService
)
{
IMqttMessageService
mqttMessageService
)
{
return
new
RedisMqttMessageReceiver
(
redisCache
,
RedisKeys
.
REDIS_CHANNEL
.
getKey
(),
mqttServer
,
mqttMessageService
);
return
new
RedisMqttMessageReceiver
(
redisCache
,
messageSerializer
,
RedisKeys
.
REDIS_CHANNEL
.
getKey
(),
mqttServer
,
mqttMessageService
);
}
}
@Bean
@Bean
public
IMqttMessageDispatcher
mqttMessageDispatcher
(
MicaRedisCache
redisCache
)
{
public
IMqttMessageDispatcher
mqttMessageDispatcher
(
MicaRedisCache
redisCache
,
return
new
RedisMqttMessageDispatcher
(
redisCache
,
RedisKeys
.
REDIS_CHANNEL
.
getKey
());
IMessageSerializer
messageSerializer
)
{
return
new
RedisMqttMessageDispatcher
(
redisCache
,
messageSerializer
,
RedisKeys
.
REDIS_CHANNEL
.
getKey
());
}
}
@Bean
@Bean
...
...
mica-mqtt-broker/src/main/java/net/dreamlu/iot/mqtt/broker/serializer/package-info.java
已删除
100644 → 0
浏览文件 @
f666adbd
package
net.dreamlu.iot.mqtt.broker.serializer
;
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录