2929
3030import javax .inject .Inject ;
3131import java .util .HashMap ;
32- import java .util .function .Consumer ;
3332
3433import static com .hivemq .client .internal .mqtt .message .subscribe .MqttStatefulSubscribe .DEFAULT_NO_SUBSCRIPTION_IDENTIFIER ;
3534
3635/**
37- * single threaded, in channel eventloop
38- *
3936 * @author Silvio Giebl
4037 */
4138@ ClientScope
@@ -44,7 +41,6 @@ public class MqttIncomingPublishFlowsWithId extends MqttIncomingPublishFlows {
4441
4542 private final @ NotNull HashMap <Integer , MqttSubscribedPublishFlow > flowsWithIdsMap = new HashMap <>();
4643 private final @ NotNull MqttSubscriptionFlows flowsWithIds ;
47- private final @ NotNull Consumer <MqttSubscribedPublishFlow > flowWithIdUnsubscribedCallback = this ::unsubscribed ;
4844
4945 @ Inject
5046 MqttIncomingPublishFlowsWithId (
@@ -61,8 +57,8 @@ public void subscribe(
6157 if (flow != null ) {
6258 final int subscriptionIdentifier = subscribe .getSubscriptionIdentifier ();
6359 if (subscriptionIdentifier != DEFAULT_NO_SUBSCRIPTION_IDENTIFIER ) {
64- flowsWithIdsMap .put (subscriptionIdentifier , flow );
6560 flow .setSubscriptionIdentifier (subscriptionIdentifier );
61+ flowsWithIdsMap .put (subscriptionIdentifier , flow );
6662 }
6763 }
6864 super .subscribe (subscribe , flow );
@@ -102,15 +98,12 @@ void remove(final @NotNull MqttTopicFilterImpl topicFilter, final @Nullable Mqtt
10298
10399 @ Override
104100 void unsubscribe (final @ NotNull MqttTopicFilterImpl topicFilter ) {
105- flowsWithIds .unsubscribe (topicFilter , flowWithIdUnsubscribedCallback );
101+ flowsWithIds .unsubscribe (topicFilter , this :: unsubscribed );
106102 super .unsubscribe (topicFilter );
107103 }
108104
109105 private void unsubscribed (final @ NotNull MqttSubscribedPublishFlow flow ) {
110- final int subscriptionIdentifier = flow .getSubscriptionIdentifier ();
111- if (subscriptionIdentifier != DEFAULT_NO_SUBSCRIPTION_IDENTIFIER ) {
112- flowsWithIdsMap .remove (subscriptionIdentifier );
113- }
106+ flowsWithIdsMap .remove (flow .getSubscriptionIdentifier ());
114107 }
115108
116109 @ Override
@@ -131,13 +124,14 @@ void findMatching(
131124 final ImmutableIntList subscriptionIdentifiers = publish .getSubscriptionIdentifiers ();
132125 if (!subscriptionIdentifiers .isEmpty ()) {
133126 for (int i = 0 ; i < subscriptionIdentifiers .size (); i ++) {
134- final int subscriptionIdentifier = subscriptionIdentifiers .get (i );
135- final MqttSubscribedPublishFlow flow = flowsWithIdsMap .get (subscriptionIdentifier );
127+ final MqttSubscribedPublishFlow flow = flowsWithIdsMap .get (subscriptionIdentifiers .get (i ));
136128 if (flow != null ) {
137129 matchingFlows .add (flow );
138130 }
139131 }
140- if (!matchingFlows .isEmpty ()) {
132+ if (matchingFlows .isEmpty ()) {
133+ flowsWithIds .findMatching (publish .stateless ().getTopic (), matchingFlows );
134+ } else {
141135 matchingFlows .subscriptionFound = true ;
142136 }
143137 }
0 commit comments