Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
mica
mica-mqtt
提交
69abe7aa
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 搜索 >>
提交
69abe7aa
编写于
1月 19, 2022
作者:
浅梦2013
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
✨
mica-mqtt-client 支持共享订阅
上级
608a7f79
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
105 addition
and
6 deletion
+105
-6
mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/client/MqttClientSubscription.java
.../dreamlu/iot/mqtt/core/client/MqttClientSubscription.java
+4
-6
mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/common/TopicFilterType.java
...ava/net/dreamlu/iot/mqtt/core/common/TopicFilterType.java
+101
-0
未找到文件。
mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/client/MqttClientSubscription.java
浏览文件 @
69abe7aa
...
...
@@ -18,11 +18,10 @@ package net.dreamlu.iot.mqtt.core.client;
import
net.dreamlu.iot.mqtt.codec.MqttQoS
;
import
net.dreamlu.iot.mqtt.codec.MqttTopicSubscription
;
import
net.dreamlu.iot.mqtt.core.
util.TopicUtil
;
import
net.dreamlu.iot.mqtt.core.
common.TopicFilterType
;
import
java.io.Serializable
;
import
java.util.Objects
;
import
java.util.regex.Pattern
;
/**
* 发送订阅,未 ack 前的数据承载
...
...
@@ -32,7 +31,7 @@ import java.util.regex.Pattern;
public
final
class
MqttClientSubscription
implements
Serializable
{
private
final
String
topicFilter
;
private
final
MqttQoS
mqttQoS
;
private
final
Pattern
topicRegex
;
private
final
TopicFilterType
type
;
private
final
IMqttClientMessageListener
listener
;
public
MqttClientSubscription
(
MqttQoS
mqttQoS
,
...
...
@@ -40,7 +39,7 @@ public final class MqttClientSubscription implements Serializable {
IMqttClientMessageListener
listener
)
{
this
.
mqttQoS
=
Objects
.
requireNonNull
(
mqttQoS
,
"MQTT subscribe mqttQoS is null."
);
this
.
topicFilter
=
Objects
.
requireNonNull
(
topicFilter
,
"MQTT subscribe topicFilter is null."
);
this
.
t
opicRegex
=
TopicUtil
.
getTopicPattern
(
topicFilter
);
this
.
t
ype
=
TopicFilterType
.
getType
(
topicFilter
);
this
.
listener
=
Objects
.
requireNonNull
(
listener
,
"MQTT subscribe listener is null."
);
}
...
...
@@ -57,7 +56,7 @@ public final class MqttClientSubscription implements Serializable {
}
public
boolean
matches
(
String
topic
)
{
return
this
.
t
opicRegex
.
matcher
(
topic
).
matches
(
);
return
this
.
t
ype
.
match
(
this
.
topicFilter
,
topic
);
}
public
MqttTopicSubscription
toTopicSubscription
()
{
...
...
@@ -88,7 +87,6 @@ public final class MqttClientSubscription implements Serializable {
return
"MqttClientSubscription{"
+
"topicFilter='"
+
topicFilter
+
'\''
+
", mqttQoS="
+
mqttQoS
+
", topicRegex="
+
topicRegex
+
'}'
;
}
...
...
mica-mqtt-core/src/main/java/net/dreamlu/iot/mqtt/core/common/TopicFilterType.java
0 → 100644
浏览文件 @
69abe7aa
/*
* Copyright (c) 2019-2029, Dreamlu 卢春梦 (596392912@qq.com & dreamlu.net).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
net.dreamlu.iot.mqtt.core.common
;
import
net.dreamlu.iot.mqtt.core.util.TopicUtil
;
/**
* TopicFilter 类型
*
* @author L.cm
*/
public
enum
TopicFilterType
{
/**
* 默认 TopicFilter
*/
NONE
{
@Override
public
boolean
match
(
String
topicFilter
,
String
topicName
)
{
return
TopicUtil
.
match
(
topicFilter
,
topicName
);
}
},
/**
* $queue/ 为前缀的共享订阅是不带群组的共享订阅
*/
QUEUE
{
@Override
public
boolean
match
(
String
topicFilter
,
String
topicName
)
{
int
prefixLen
=
TopicFilterType
.
SHARE_QUEUE_PREFIX
.
length
();
if
(
topicName
.
startsWith
(
"/"
))
{
prefixLen
=
prefixLen
-
1
;
}
return
TopicUtil
.
match
(
topicFilter
.
substring
(
prefixLen
),
topicName
);
}
},
/**
* $share/<group-name>/ 为前缀的共享订阅是带群组的共享订阅
*/
SHARE
{
@Override
public
boolean
match
(
String
topicFilter
,
String
topicName
)
{
String
shareTopicFilter
=
topicFilter
.
substring
(
TopicFilterType
.
SHARE_GROUP_PREFIX
.
length
());
String
[]
group
=
shareTopicFilter
.
split
(
"/"
);
String
groupName
=
group
[
0
];
String
shareTopicPrefix
=
TopicFilterType
.
SHARE_GROUP_PREFIX
+
groupName
+
'/'
;
int
prefixLen
=
shareTopicPrefix
.
length
();
if
(
topicName
.
startsWith
(
"/"
))
{
prefixLen
=
prefixLen
-
1
;
}
return
TopicUtil
.
match
(
topicFilter
.
substring
(
prefixLen
),
topicName
);
}
};
/**
* 共享订阅的 topic
*/
public
static
final
String
SHARE_QUEUE_PREFIX
=
"$queue/"
;
public
static
final
String
SHARE_GROUP_PREFIX
=
"$share/"
;
/**
* 判断 topicFilter 和 topicName 匹配情况
*
* @param topicFilter topicFilter
* @param topicName topicName
* @return 是否匹配
*/
public
abstract
boolean
match
(
String
topicFilter
,
String
topicName
);
/**
* 获取 topicFilter 类型
*
* @param topicFilter topicFilter
* @return TopicFilterType
*/
public
static
TopicFilterType
getType
(
String
topicFilter
)
{
if
(
topicFilter
.
startsWith
(
TopicFilterType
.
SHARE_QUEUE_PREFIX
))
{
return
TopicFilterType
.
QUEUE
;
}
else
if
(
topicFilter
.
startsWith
(
TopicFilterType
.
SHARE_GROUP_PREFIX
))
{
return
TopicFilterType
.
SHARE
;
}
else
{
return
TopicFilterType
.
NONE
;
}
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录