Skip to content

Commit 6d16b4e

Browse files
authored
Merge pull request #38 from JavaSaBr/feature-broker-23
Feature broker 23: Shared subscriptions
2 parents b2e5f2d + 4b0db33 commit 6d16b4e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+856
-302
lines changed

build.gradle

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ allprojects {
2020
apply plugin: "groovy"
2121
apply plugin: "org.springframework.boot"
2222

23-
sourceCompatibility = JavaVersion.VERSION_13
24-
targetCompatibility = JavaVersion.VERSION_13
23+
sourceCompatibility = JavaVersion.VERSION_14
24+
targetCompatibility = JavaVersion.VERSION_14
2525

2626
repositories {
2727
jcenter()
@@ -38,8 +38,8 @@ allprojects {
3838
springVersion = '5.1.6.RELEASE'
3939
junitJupiterVersion = "5.5.2"
4040
testcontainersVersion = "1.12.1"
41-
groovyVersion = "2.5.8"
42-
spockVersion = "1.2-groovy-2.5"
41+
groovyVersion = "3.0.4"
42+
spockVersion = "2.0-M3-groovy-3.0"
4343
projectReactorVersion = "3.3.0.RELEASE"
4444
byteBuddyVersion = "1.10.2"
4545
objenesisVersion = "3.1"
@@ -118,7 +118,7 @@ task buildSingleArtifactWithoutTests(type: GradleBuild) {
118118
}
119119

120120
wrapper {
121-
gradleVersion = '6.0'
121+
gradleVersion = '6.6-milestone-1'
122122
distributionType = Wrapper.DistributionType.ALL
123123
}
124124

gradle/wrapper/gradle-wrapper.jar

501 Bytes
Binary file not shown.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
distributionBase=GRADLE_USER_HOME
22
distributionPath=wrapper/dists
3-
distributionUrl=https\://services.gradle.org/distributions/gradle-6.0-all.zip
3+
distributionUrl=https\://services.gradle.org/distributions/gradle-6.6-milestone-1-all.zip
44
zipStoreBase=GRADLE_USER_HOME
55
zipStorePath=wrapper/dists

gradlew

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ esac
8282

8383
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
8484

85+
8586
# Determine the Java command to use to start the JVM.
8687
if [ -n "$JAVA_HOME" ] ; then
8788
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
@@ -129,6 +130,7 @@ fi
129130
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
130131
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
131132
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
133+
132134
JAVACMD=`cygpath --unix "$JAVACMD"`
133135

134136
# We build the pattern for arguments to be converted via cygpath

gradlew.bat

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ if "%DIRNAME%" == "" set DIRNAME=.
2929
set APP_BASE_NAME=%~n0
3030
set APP_HOME=%DIRNAME%
3131

32+
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
33+
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34+
3235
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
3336
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
3437

@@ -81,6 +84,7 @@ set CMD_LINE_ARGS=%*
8184

8285
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
8386

87+
8488
@rem Execute Gradle
8589
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
8690

src/main/java/com/ss/mqtt/broker/config/MqttNetworkConfig.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
package com.ss.mqtt.broker.config;
22

33
import com.ss.mqtt.broker.handler.client.MqttClientReleaseHandler;
4-
import com.ss.mqtt.broker.handler.packet.in.*;
4+
import com.ss.mqtt.broker.handler.packet.in.PacketInHandler;
55
import com.ss.mqtt.broker.model.MqttPropertyConstants;
66
import com.ss.mqtt.broker.model.QoS;
77
import com.ss.mqtt.broker.network.MqttConnection;
88
import com.ss.mqtt.broker.network.client.ExternalMqttClient;
99
import com.ss.mqtt.broker.network.client.InternalMqttClient;
10-
import com.ss.mqtt.broker.network.client.MqttClient;
1110
import com.ss.mqtt.broker.network.client.MqttClient.UnsafeMqttClient;
1211
import com.ss.rlib.network.BufferAllocator;
1312
import com.ss.rlib.network.Network;

src/main/java/com/ss/mqtt/broker/handler/packet/in/AbstractPacketHandler.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,10 @@ public abstract class AbstractPacketHandler<C extends UnsafeMqttClient, R extend
99

1010
@Override
1111
public void handle(@NotNull UnsafeMqttClient client, @NotNull MqttReadablePacket packet) {
12+
//noinspection unchecked
1213
handleImpl((C) client, (R) packet);
1314
}
1415

1516
protected abstract void handleImpl(@NotNull C client, @NotNull R packet);
1617
}
18+

src/main/java/com/ss/mqtt/broker/handler/packet/in/DisconnetInPacketHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,6 @@ protected void handleImpl(@NotNull UnsafeMqttClient client, @NotNull DisconnectI
2020
log.error("Disconnect client {} by error reason {}", client, reasonCode);
2121
}
2222

23-
client.release().subscribe();
23+
client.getConnection().close();
2424
}
2525
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,37 @@
11
package com.ss.mqtt.broker.handler.packet.in;
22

3+
import static com.ss.mqtt.broker.model.reason.code.SubscribeAckReasonCode.SHARED_SUBSCRIPTIONS_NOT_SUPPORTED;
4+
import static com.ss.mqtt.broker.model.reason.code.SubscribeAckReasonCode.WILDCARD_SUBSCRIPTIONS_NOT_SUPPORTED;
5+
import static java.lang.Byte.toUnsignedInt;
6+
import com.ss.mqtt.broker.model.reason.code.DisconnectReasonCode;
7+
import com.ss.mqtt.broker.model.reason.code.SubscribeAckReasonCode;
38
import com.ss.mqtt.broker.network.client.MqttClient.UnsafeMqttClient;
49
import com.ss.mqtt.broker.network.packet.in.SubscribeInPacket;
510
import com.ss.mqtt.broker.service.SubscriptionService;
611
import lombok.RequiredArgsConstructor;
712
import org.jetbrains.annotations.NotNull;
813

14+
import java.util.Set;
15+
916
@RequiredArgsConstructor
1017
public class SubscribeInPacketHandler extends AbstractPacketHandler<UnsafeMqttClient, SubscribeInPacket> {
1118

19+
private final static Set<SubscribeAckReasonCode> INVALID_ACK_CODE = Set.of(
20+
SHARED_SUBSCRIPTIONS_NOT_SUPPORTED,
21+
WILDCARD_SUBSCRIPTIONS_NOT_SUPPORTED
22+
);
23+
1224
private final @NotNull SubscriptionService subscriptionService;
1325

1426
@Override
1527
protected void handleImpl(@NotNull UnsafeMqttClient client, @NotNull SubscribeInPacket packet) {
1628
var ackReasonCodes = subscriptionService.subscribe(client, packet.getTopicFilters());
1729
client.send(client.getPacketOutFactory().newSubscribeAck(packet.getPacketId(), ackReasonCodes));
30+
var reason = ackReasonCodes.findAny(INVALID_ACK_CODE::contains);
31+
if (reason != null) {
32+
var disconnectReasonCode = DisconnectReasonCode.of(toUnsignedInt(reason.getValue()));
33+
var disconnect = client.getPacketOutFactory().newDisconnect(client, disconnectReasonCode);
34+
client.sendWithFeedback(disconnect).thenAccept(result -> client.getConnection().close());
35+
}
1836
}
1937
}

src/main/java/com/ss/mqtt/broker/handler/publish/in/AbstractPublishInHandler.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import com.ss.mqtt.broker.handler.publish.out.PublishOutHandler;
44
import com.ss.mqtt.broker.model.ActionResult;
55
import com.ss.mqtt.broker.model.QoS;
6-
import com.ss.mqtt.broker.model.Subscriber;
6+
import com.ss.mqtt.broker.model.SingleSubscriber;
77
import com.ss.mqtt.broker.network.client.MqttClient;
88
import com.ss.mqtt.broker.network.packet.in.PublishInPacket;
99
import com.ss.mqtt.broker.service.SubscriptionService;
@@ -25,7 +25,7 @@ public void handle(@NotNull MqttClient client, @NotNull PublishInPacket packet)
2525
}
2626

2727
private @NotNull ActionResult sendToSubscriber(
28-
@NotNull Subscriber subscriber,
28+
@NotNull SingleSubscriber subscriber,
2929
@NotNull PublishInPacket packet
3030
) {
3131
return publishOutHandler(subscriber.getQos()).handle(packet, subscriber);

0 commit comments

Comments
 (0)