Removed old 'map based queues' to use persistent BlockingQueues from MapDB

This commit is contained in:
andsel
2017-01-09 21:53:26 +01:00
parent 3f0ab75efb
commit 081631242f
13 changed files with 64 additions and 136 deletions
@@ -9,8 +9,11 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Queue;
import java.util.concurrent.BlockingQueue;
class InternalRepublisher {
@@ -39,8 +42,11 @@ class InternalRepublisher {
}
}
void publishStored(ClientSession clientSession, List<IMessagesStore.StoredMessage> publishedEvents) {
for (IMessagesStore.StoredMessage pubEvt : publishedEvents) {
void publishStored(ClientSession clientSession, BlockingQueue<IMessagesStore.StoredMessage> publishedEvents) {
List<IMessagesStore.StoredMessage> storedPublishes = new ArrayList<>();
publishedEvents.drainTo(storedPublishes);
for (IMessagesStore.StoredMessage pubEvt : storedPublishes) {
//put in flight zone
LOG.trace("Adding to inflight <{}>", pubEvt.getMessageID());
clientSession.inFlightAckWaiting(pubEvt.getGuid(), pubEvt.getMessageID());
@@ -61,7 +67,7 @@ class InternalRepublisher {
return createPublishForQos(storedMessage.getTopic(), storedMessage.getQos(), storedMessage.getMessage(), true);
}
private PublishMessage createPublishForQos(String topic, AbstractMessage.QOSType qos, ByteBuffer message, boolean retained) {
public static PublishMessage createPublishForQos(String topic, AbstractMessage.QOSType qos, ByteBuffer message, boolean retained) {
PublishMessage pubMessage = new PublishMessage();
pubMessage.setRetainFlag(retained);
pubMessage.setTopicName(topic);
@@ -48,6 +48,7 @@ class MessagesPublisher {
final ByteBuffer origMessage = pubMsg.getMessage();
//if QoS 1 or 2 store the message
//TODO perhaps this block is not needed.
MessageGUID guid = null;
if (publishingQos != AbstractMessage.QOSType.MOST_ONE) {
guid = m_messagesStore.storePublishForFuture(pubMsg);
@@ -76,7 +77,7 @@ class MessagesPublisher {
} else {
if (!targetSession.isCleanSession()) {
//store the message in targetSession queue to deliver
targetSession.enqueueToDeliver(guid);
targetSession.enqueue(pubMsg);
}
}
}
@@ -10,6 +10,7 @@ import org.slf4j.LoggerFactory;
import java.util.concurrent.ConcurrentMap;
import static io.moquette.parser.proto.messages.AbstractMessage.QOSType.MOST_ONE;
import static io.moquette.spi.impl.ProtocolProcessor.asStoredMessage;
class PersistentQueueMessageSender {
@@ -48,7 +49,7 @@ class PersistentQueueMessageSender {
} else if (pubMessage.getQos() != MOST_ONE) {
//enqueue to the client session
LOG.debug("enqueue to client session");
clientsession.enqueue(pubMessage);
clientsession.enqueue(asStoredMessage(pubMessage));
}
}
}
@@ -17,9 +17,7 @@ package io.moquette.spi.impl;
import java.nio.ByteBuffer;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.*;
import io.moquette.interception.InterceptHandler;
import io.moquette.parser.proto.messages.*;
@@ -36,6 +34,8 @@ import io.moquette.spi.impl.subscriptions.Subscription;
import static io.moquette.parser.netty.Utils.VERSION_3_1;
import static io.moquette.parser.netty.Utils.VERSION_3_1_1;
import static io.moquette.spi.impl.InternalRepublisher.createPublishForQos;
import io.moquette.interception.messages.InterceptAcknowledgedMessage;
import io.moquette.parser.proto.messages.AbstractMessage.QOSType;
import io.netty.channel.Channel;
@@ -43,7 +43,6 @@ import io.netty.channel.ChannelPipeline;
import io.netty.handler.timeout.IdleStateHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sun.misc.MessageUtils;
/**
* Class responsible to handle the logic of MQTT protocol it's the director of
@@ -406,7 +405,7 @@ public class ProtocolProcessor {
* */
private void republishStoredInSession(ClientSession clientSession) {
LOG.trace("republishStoredInSession for client <{}>", clientSession);
List<IMessagesStore.StoredMessage> publishedEvents = clientSession.storedMessages();
BlockingQueue<StoredMessage> publishedEvents = clientSession.queue();
if (publishedEvents.isEmpty()) {
LOG.info("No stored messages for client <{}>", clientSession.clientID);
return;
@@ -414,9 +413,6 @@ public class ProtocolProcessor {
LOG.info("republishing stored messages to client <{}>", clientSession.clientID);
this.internalRepublisher.publishStored(clientSession, publishedEvents);
for (IMessagesStore.StoredMessage pubEvt : publishedEvents) {
clientSession.removeEnqueued(pubEvt.getGuid());
}
}
public void processPubAck(Channel channel, PubAckMessage msg) {
@@ -438,7 +434,7 @@ public class ProtocolProcessor {
m_interceptor.notifyMessageAcknowledged(new InterceptAcknowledgedMessage(inflightMsg, topic, username));
}
static IMessagesStore.StoredMessage asStoredMessage(PublishMessage msg) {
public static IMessagesStore.StoredMessage asStoredMessage(PublishMessage msg) {
IMessagesStore.StoredMessage stored = new IMessagesStore.StoredMessage(msg.getPayload().array(), msg.getQos(), msg.getTopicName());
stored.setRetained(msg.isRetainFlag());
stored.setMessageID(msg.getMessageID());
@@ -641,10 +637,7 @@ public class ProtocolProcessor {
if (descriptor.cleanSession) {
LOG.debug("Removing messages in session's queue for client <{}>", clientID);
Collection<MessageGUID> queue = this.m_sessionsStore.enqueued(clientID);
for (MessageGUID guid : queue) {
this.m_sessionsStore.removeEnqueued(clientID, guid);
}
this.m_sessionsStore.dropQueue(clientID);
LOG.debug("Removed messages in session for client's queue <{}>", clientID);
}
return true;
@@ -848,11 +841,14 @@ public class ProtocolProcessor {
ClientSession clientSession = m_sessionsStore.sessionForClient(clientID);
boolean emptyQueue = false;
while (channel.isWritable() && !emptyQueue) {
AbstractMessage msg = clientSession.dequeue();
StoredMessage msg = clientSession.queue().poll();
if (msg == null) {
emptyQueue = true;
} else {
channel.write(msg);
//recreate a publish from stored publish in queue
boolean retained = m_messagesStore.getMessageByGuid(msg.getGuid()) != null;
PublishMessage pubMsg = createPublishForQos(msg.getTopic(), msg.getQos(), msg.getMessage(), retained);
channel.write(pubMsg);
}
}
channel.flush();