@Override public void add(Subscription newSubscription) { ctrie.addToTree(newSubscription); subscriptionsRepository.addNewSubscription(newSubscription); }
/** * Removes subscription from CTrie, adds TNode when the last client unsubscribes, then calls for cleanTomb in a * separate atomic CAS operation. * * @param topic the subscription's topic to remove. * @param clientID the Id of client owning the subscription. */ @Override public void removeSubscription(Topic topic, String clientID) { ctrie.removeFromTree(topic, clientID); this.subscriptionsRepository.removeSubscription(topic.toString(), clientID); }
@Override public void init(ISubscriptionsRepository subscriptionsRepository) { LOG.info("Initializing CTrie"); ctrie = new CTrie(); LOG.info("Initializing subscriptions store..."); this.subscriptionsRepository = subscriptionsRepository; // reload any subscriptions persisted if (LOG.isTraceEnabled()) { LOG.trace("Reloading all stored subscriptions. SubscriptionTree = {}", dumpTree()); } for (Subscription subscription : this.subscriptionsRepository.listAllSubscriptions()) { LOG.debug("Re-subscribing {}", subscription); ctrie.addToTree(subscription); } if (LOG.isTraceEnabled()) { LOG.trace("Stored subscriptions have been reloaded. SubscriptionTree = {}", dumpTree()); } }
@Test public void testOverlappingSubscriptions() { Subscription genericSub = new Subscription("Sensor1", asTopic("a/+"), MqttQoS.AT_MOST_ONCE); this.sessionsRepository.addNewSubscription(genericSub); sut.add(genericSub); Subscription specificSub = new Subscription("Sensor1", asTopic("a/b"), MqttQoS.AT_MOST_ONCE); this.sessionsRepository.addNewSubscription(specificSub); sut.add(specificSub); //Exercise final Set<Subscription> matchingForSpecific = sut.matchQosSharpening(asTopic("a/b")); // Verify assertThat(matchingForSpecific.size()).isEqualTo(1); }