Fixed issue #12, missed remove of already published retained messages

This commit is contained in:
andrea
2015-01-27 00:15:14 +01:00
parent 5fe9554965
commit 72c8445693
5 changed files with 114 additions and 6 deletions
@@ -94,7 +94,7 @@ public class MemoryStorageService implements IMessagesStore, ISessionsStore {
@Override
public List<PublishEvent> retrievePersistedPublishes(String clientID) {
return m_persistentMessageStore.get(clientID);
return new ArrayList<>(m_persistentMessageStore.get(clientID));
}
@Override
@@ -248,6 +248,7 @@ class ProtocolProcessor implements EventHandler<ValueEvent> {
for (PublishEvent pubEvt : publishedEvents) {
sendPublish(pubEvt.getClientID(), pubEvt.getTopic(), pubEvt.getQos(),
pubEvt.getMessage(), false, pubEvt.getMessageID());
m_messagesStore.cleanPersistedPublishMessage(clientID, pubEvt.getMessageID());
}
}
@@ -237,6 +237,7 @@ public class MapDBPersistentStore implements IMessagesStore, ISessionsStore {
}
public void removeQoS2Message(String publishKey) {
LOG.debug("Removing stored Q0S2 message <{}>", publishKey);
m_qos2Store.remove(publishKey);
}
@@ -16,17 +16,14 @@
package org.eclipse.moquette.spi.impl;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import org.eclipse.moquette.spi.IMatchingCondition;
import org.eclipse.moquette.spi.IMessagesStore;
import org.eclipse.moquette.spi.ISessionsStore;
import org.eclipse.moquette.spi.impl.events.LostConnectionEvent;
import org.eclipse.moquette.spi.impl.events.PublishEvent;
import org.eclipse.moquette.spi.impl.subscriptions.Subscription;
import org.eclipse.moquette.spi.impl.subscriptions.SubscriptionsStore;
import static org.eclipse.moquette.parser.netty.Utils.VERSION_3_1_1;
@@ -489,6 +486,26 @@ public class ProtocolProcessorTest {
PublishMessage pubMessage = (PublishMessage) m_receivedMessage;
assertEquals(FAKE_TOPIC, pubMessage.getTopicName());
}
@Test
public void testRepublishAndConsumePersistedMessages_onReconnect() {
SubscriptionsStore subs = mock(SubscriptionsStore.class);
List<Subscription> emptySubs = Collections.emptyList();
when(subs.matches(anyString())).thenReturn(emptySubs);
PublishEvent retainedMessage = new PublishEvent("/topic", QOSType.EXACTLY_ONCE,
ByteBuffer.wrap("Hello".getBytes()), true, FAKE_PUBLISHER_ID, 120);
m_storageService.storePublishForFuture(retainedMessage);
m_processor.init(subs, m_storageService, m_sessionStore, null);
ConnectMessage connectMessage = new ConnectMessage();
connectMessage.setClientID(FAKE_PUBLISHER_ID);
connectMessage.setProcotolVersion((byte)3);
connectMessage.setCleanSession(false);
m_processor.processConnect(m_session, connectMessage);
//Verify no messages are still stored
assertTrue(m_storageService.retrievePersistedPublishes(FAKE_PUBLISHER_ID).isEmpty());
}
@Test
public void publishNoPublishToInactiveSubscriptions() {