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.server.ConnectionDescriptor;
|
|
|
|
|
import io.moquette.spi.ClientSession;
|
|
|
|
|
import io.moquette.spi.IMessagesStore;
|
|
|
|
|
import io.netty.channel.Channel;
|
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
|
|
|
|
|
|
import java.nio.ByteBuffer;
|
|
|
|
|
import java.util.Collection;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.concurrent.ConcurrentMap;
|
|
|
|
|
|
2016-12-13 22:54:59 +01:00
|
|
|
import static io.moquette.parser.proto.messages.AbstractMessage.QOSType.MOST_ONE;
|
|
|
|
|
|
2016-12-12 22:30:14 +01:00
|
|
|
class InternalRepublisher {
|
|
|
|
|
|
|
|
|
|
private static final Logger LOG = LoggerFactory.getLogger(InternalRepublisher.class);
|
|
|
|
|
|
|
|
|
|
private final ConcurrentMap<String, ConnectionDescriptor> connectionDescriptors;
|
2016-12-13 23:18:43 +01:00
|
|
|
private final PersistentQueueMessageSender persistentSender;
|
2016-12-12 22:30:14 +01:00
|
|
|
|
|
|
|
|
InternalRepublisher(ConcurrentMap<String, ConnectionDescriptor> connectionDescriptors) {
|
|
|
|
|
this.connectionDescriptors = connectionDescriptors;
|
2016-12-13 23:18:43 +01:00
|
|
|
this.persistentSender = new PersistentQueueMessageSender(connectionDescriptors);
|
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:18:43 +01:00
|
|
|
PublishMessage publishMsg = createPublishForQos(storedMsg.getTopic(), storedMsg.getQos(), storedMsg.getPayload(), true);
|
|
|
|
|
//set the PacketIdentifier only for QoS > 0
|
|
|
|
|
if (publishMsg.getQos() != AbstractMessage.QOSType.MOST_ONE) {
|
|
|
|
|
publishMsg.setMessageID(packetID);
|
|
|
|
|
}
|
|
|
|
|
this.persistentSender.sendPublish(targetSession, publishMsg);
|
2016-12-12 22:30:14 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void publishStored(ClientSession clientSession, List<IMessagesStore.StoredMessage> publishedEvents) {
|
|
|
|
|
for (IMessagesStore.StoredMessage pubEvt : publishedEvents) {
|
|
|
|
|
//put in flight zone
|
|
|
|
|
LOG.trace("Adding to inflight <{}>", pubEvt.getMessageID());
|
|
|
|
|
clientSession.inFlightAckWaiting(pubEvt.getGuid(), pubEvt.getMessageID());
|
2016-12-13 23:18:43 +01:00
|
|
|
PublishMessage publishMsg = createPublishForQos(pubEvt.getTopic(), pubEvt.getQos(), pubEvt.getMessage(), false);
|
|
|
|
|
//set the PacketIdentifier only for QoS > 0
|
|
|
|
|
if (publishMsg.getQos() != AbstractMessage.QOSType.MOST_ONE) {
|
|
|
|
|
publishMsg.setMessageID(pubEvt.getMessageID());
|
|
|
|
|
}
|
|
|
|
|
this.persistentSender.sendPublish(clientSession, publishMsg);
|
2016-12-12 22:30:14 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2016-12-13 23:18:43 +01:00
|
|
|
private 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
|
|
|
}
|
|
|
|
|
}
|