private void publishRetainedMessagesForSubscriptions(String clientID, List<Subscription> newSubscriptions) { Session targetSession = this.sessionRegistry.retrieve(clientID); for (Subscription subscription : newSubscriptions) { final String topicFilter = subscription.getTopicFilter().toString(); final List<RetainedMessage> retainedMsgs = retainedRepository.retainedOnTopic(topicFilter); if (retainedMsgs.isEmpty()) { // not found continue; } for (RetainedMessage retainedMsg : retainedMsgs) { final MqttQoS retainedQos = retainedMsg.qosLevel(); MqttQoS qos = lowerQosToTheSubscriptionDesired(subscription, retainedQos); // final ByteBuf origPayload = retainedMsg.getPayload(); final ByteBuf payloadBuf = Unpooled.wrappedBuffer(retainedMsg.getPayload()); // ByteBuf payload = origPayload.retainedDuplicate(); targetSession.sendRetainedPublishOnSessionAtQos(subscription.getTopicFilter(), qos, payloadBuf); } } }
@Override public void retain(Topic topic, MqttPublishMessage msg) { final ByteBuf payload = msg.content(); byte[] rawPayload = new byte[payload.readableBytes()]; payload.getBytes(0, rawPayload); final RetainedMessage toStore = new RetainedMessage(msg.fixedHeader().qosLevel(), rawPayload); storage.put(topic, toStore); }
private void assertMessageIsRetained(String expectedTopicName, ByteBuf expectedPayload) { List<RetainedMessage> msgs = retainedRepository.retainedOnTopic(expectedTopicName); assertEquals(1, msgs.size()); RetainedMessage msg = msgs.get(0); assertEquals(ByteBufUtil.hexDump(expectedPayload), ByteBufUtil.hexDump(msg.getPayload())); } }
@Override public void retain(Topic topic, MqttPublishMessage msg) { final ByteBuf payload = msg.content(); byte[] rawPayload = new byte[payload.readableBytes()]; payload.getBytes(0, rawPayload); final RetainedMessage toStore = new RetainedMessage(msg.fixedHeader().qosLevel(), rawPayload); queueMap.put(topic, toStore); }