2016-12-12 22:30:14 +01:00
|
|
|
package io.moquette.spi.impl;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import io.moquette.parser.proto.messages.AbstractMessage;
|
|
|
|
|
import io.moquette.parser.proto.messages.PublishMessage;
|
|
|
|
|
import io.moquette.spi.ClientSession;
|
|
|
|
|
import io.moquette.spi.IMessagesStore;
|
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
|
|
|
|
import java.nio.ByteBuffer;
|
2017-01-09 21:53:26 +01:00
|
|
|
import java.util.ArrayList;
|
2016-12-12 22:30:14 +01:00
|
|
|
import java.util.Collection;
|
|
|
|
|
import java.util.List;
|
2017-01-09 21:53:26 +01:00
|
|
|
import java.util.concurrent.BlockingQueue;
|
2016-12-12 22:30:14 +01:00
|
|
|
|
|
|
|
|
class InternalRepublisher {
|
|
|
|
|
|
|
|
|
|
private static final Logger LOG = LoggerFactory.getLogger(InternalRepublisher.class);
|
|
|
|
|
|
2016-12-13 23:40:00 +01:00
|
|
|
private final PersistentQueueMessageSender messageSender;
|
2016-12-12 22:30:14 +01:00
|
|
|
|
2016-12-13 23:40:00 +01:00
|
|
|
InternalRepublisher(PersistentQueueMessageSender messageSender) {
|
|
|
|
|
this.messageSender = messageSender;
|
2016-12-12 22:30:14 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void publishRetained(ClientSession targetSession, Collection<IMessagesStore.StoredMessage> messages) {
|
|
|
|
|
for (IMessagesStore.StoredMessage storedMsg : messages) {
|
|
|
|
|
//fire as retained the message
|
|
|
|
|
Integer packetID = storedMsg.getQos() == AbstractMessage.QOSType.MOST_ONE ? null : targetSession.nextPacketId();
|
|
|
|
|
if (packetID != null) {
|
|
|
|
|
LOG.trace("Adding to inflight <{}>", packetID);
|
|
|
|
|
targetSession.inFlightAckWaiting(storedMsg.getGuid(), packetID);
|
|
|
|
|
}
|
2016-12-13 23:28:19 +01:00
|
|
|
PublishMessage publishMsg = retainedPublish(storedMsg);
|
2016-12-13 23:18:43 +01:00
|
|
|
//set the PacketIdentifier only for QoS > 0
|
|
|
|
|
if (publishMsg.getQos() != AbstractMessage.QOSType.MOST_ONE) {
|
|
|
|
|
publishMsg.setMessageID(packetID);
|
|
|
|
|
}
|
2016-12-13 23:40:00 +01:00
|
|
|
this.messageSender.sendPublish(targetSession, publishMsg);
|
2016-12-12 22:30:14 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2017-01-09 21:53:26 +01:00
|
|
|
void publishStored(ClientSession clientSession, BlockingQueue<IMessagesStore.StoredMessage> publishedEvents) {
|
|
|
|
|
List<IMessagesStore.StoredMessage> storedPublishes = new ArrayList<>();
|
|
|
|
|
publishedEvents.drainTo(storedPublishes);
|
|
|
|
|
|
|
|
|
|
for (IMessagesStore.StoredMessage pubEvt : storedPublishes) {
|
2016-12-12 22:30:14 +01:00
|
|
|
//put in flight zone
|
|
|
|
|
LOG.trace("Adding to inflight <{}>", pubEvt.getMessageID());
|
|
|
|
|
clientSession.inFlightAckWaiting(pubEvt.getGuid(), pubEvt.getMessageID());
|
2016-12-13 23:28:19 +01:00
|
|
|
PublishMessage publishMsg = notRetainedPublish(pubEvt);
|
2016-12-13 23:18:43 +01:00
|
|
|
//set the PacketIdentifier only for QoS > 0
|
|
|
|
|
if (publishMsg.getQos() != AbstractMessage.QOSType.MOST_ONE) {
|
|
|
|
|
publishMsg.setMessageID(pubEvt.getMessageID());
|
|
|
|
|
}
|
2016-12-13 23:40:00 +01:00
|
|
|
this.messageSender.sendPublish(clientSession, publishMsg);
|
2016-12-12 22:30:14 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-13 23:28:19 +01:00
|
|
|
private PublishMessage notRetainedPublish(IMessagesStore.StoredMessage storedMessage) {
|
|
|
|
|
return createPublishForQos(storedMessage.getTopic(), storedMessage.getQos(), storedMessage.getMessage(), false);
|
2016-12-13 23:26:31 +01:00
|
|
|
}
|
|
|
|
|
|
2016-12-13 23:28:19 +01:00
|
|
|
private PublishMessage retainedPublish(IMessagesStore.StoredMessage storedMessage) {
|
|
|
|
|
return createPublishForQos(storedMessage.getTopic(), storedMessage.getQos(), storedMessage.getMessage(), true);
|
2016-12-13 23:26:31 +01:00
|
|
|
}
|
|
|
|
|
|
2017-01-09 21:53:26 +01:00
|
|
|
public static PublishMessage createPublishForQos(String topic, AbstractMessage.QOSType qos, ByteBuffer message, boolean retained) {
|
2016-12-12 22:30:14 +01:00
|
|
|
PublishMessage pubMessage = new PublishMessage();
|
|
|
|
|
pubMessage.setRetainFlag(retained);
|
|
|
|
|
pubMessage.setTopicName(topic);
|
|
|
|
|
pubMessage.setQos(qos);
|
|
|
|
|
pubMessage.setPayload(message);
|
2016-12-13 23:18:43 +01:00
|
|
|
return pubMessage;
|
2016-12-12 22:30:14 +01:00
|
|
|
}
|
|
|
|
|
}
|