Refactoring, dropped unuseful ServerChannel abstraction in favor on Netty's Channel
This commit is contained in:
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* Copyright (c) 2012-2015 The original author or authors
|
||||
* ------------------------------------------------------
|
||||
* All rights reserved. This program and the accompanying materials
|
||||
* are made available under the terms of the Eclipse Public License v1.0
|
||||
* and Apache License v2.0 which accompanies this distribution.
|
||||
*
|
||||
* The Eclipse Public License is available at
|
||||
* http://www.eclipse.org/legal/epl-v10.html
|
||||
*
|
||||
* The Apache License v2.0 is available at
|
||||
* http://www.opensource.org/licenses/apache2.0.php
|
||||
*
|
||||
* You may elect to redistribute this code under either of these licenses.
|
||||
*/
|
||||
package io.moquette.server;
|
||||
|
||||
import io.netty.util.AttributeKey;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author andrea
|
||||
*/
|
||||
public interface ServerChannel {
|
||||
|
||||
Object getAttribute(AttributeKey<Object> key);
|
||||
|
||||
void setAttribute(AttributeKey<Object> key, Object value);
|
||||
|
||||
void setIdleTime(int idleTime);
|
||||
|
||||
void close(boolean immediately);
|
||||
|
||||
void write(Object value);
|
||||
}
|
||||
@@ -20,13 +20,12 @@ import io.netty.channel.ChannelHandlerContext;
|
||||
import io.netty.handler.timeout.IdleStateHandler;
|
||||
import io.netty.util.Attribute;
|
||||
import io.netty.util.AttributeKey;
|
||||
import io.moquette.server.ServerChannel;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author andrea
|
||||
*/
|
||||
public class NettyChannel implements ServerChannel {
|
||||
public class NettyChannel {
|
||||
|
||||
private ChannelHandlerContext m_channel;
|
||||
|
||||
|
||||
@@ -52,28 +52,28 @@ public class NettyMQTTHandler extends ChannelInboundHandlerAdapter {
|
||||
m_processor.processConnect(ctx.channel(), (ConnectMessage) msg);
|
||||
break;
|
||||
case SUBSCRIBE:
|
||||
m_processor.processSubscribe(new NettyChannel(ctx), (SubscribeMessage) msg);
|
||||
m_processor.processSubscribe(ctx.channel(), (SubscribeMessage) msg);
|
||||
break;
|
||||
case UNSUBSCRIBE:
|
||||
m_processor.processUnsubscribe(new NettyChannel(ctx), (UnsubscribeMessage) msg);
|
||||
m_processor.processUnsubscribe(ctx.channel(), (UnsubscribeMessage) msg);
|
||||
break;
|
||||
case PUBLISH:
|
||||
m_processor.processPublish(new NettyChannel(ctx), (PublishMessage) msg);
|
||||
m_processor.processPublish(ctx.channel(), (PublishMessage) msg);
|
||||
break;
|
||||
case PUBREC:
|
||||
m_processor.processPubRec(new NettyChannel(ctx), (PubRecMessage) msg);
|
||||
m_processor.processPubRec(ctx.channel(), (PubRecMessage) msg);
|
||||
break;
|
||||
case PUBCOMP:
|
||||
m_processor.processPubComp(new NettyChannel(ctx), (PubCompMessage) msg);
|
||||
m_processor.processPubComp(ctx.channel(), (PubCompMessage) msg);
|
||||
break;
|
||||
case PUBREL:
|
||||
m_processor.processPubRel(new NettyChannel(ctx), (PubRelMessage) msg);
|
||||
m_processor.processPubRel(ctx.channel(), (PubRelMessage) msg);
|
||||
break;
|
||||
case DISCONNECT:
|
||||
m_processor.processDisconnect(new NettyChannel(ctx));
|
||||
m_processor.processDisconnect(ctx.channel());
|
||||
break;
|
||||
case PUBACK:
|
||||
m_processor.processPubAck(new NettyChannel(ctx), (PubAckMessage) msg);
|
||||
m_processor.processPubAck(ctx.channel(), (PubAckMessage) msg);
|
||||
break;
|
||||
case PINGREQ:
|
||||
PingRespMessage pingResp = new PingRespMessage();
|
||||
|
||||
@@ -27,13 +27,13 @@ import io.netty.util.AttributeKey;
|
||||
*/
|
||||
public class NettyUtils {
|
||||
|
||||
public static Object getAttribute(ChannelHandlerContext channel, AttributeKey<Object> key) {
|
||||
Attribute<Object> attr = channel.attr(key);
|
||||
public static Object getAttribute(ChannelHandlerContext ctx, AttributeKey<Object> key) {
|
||||
Attribute<Object> attr = ctx.channel().attr(key);
|
||||
return attr.get();
|
||||
}
|
||||
|
||||
public static void setAttribute(ChannelHandlerContext channel, AttributeKey<Object> key, Object value) {
|
||||
Attribute<Object> attr = channel.attr(key);
|
||||
public static void setAttribute(ChannelHandlerContext ctx, AttributeKey<Object> key, Object value) {
|
||||
Attribute<Object> attr = ctx.channel().attr(key);
|
||||
attr.set(value);
|
||||
}
|
||||
|
||||
|
||||
@@ -21,7 +21,6 @@ import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
|
||||
import io.moquette.server.ConnectionDescriptor;
|
||||
import io.moquette.server.ServerChannel;
|
||||
import io.moquette.server.netty.NettyChannel;
|
||||
import io.moquette.spi.ClientSession;
|
||||
import io.moquette.spi.IMatchingCondition;
|
||||
@@ -142,7 +141,7 @@ public class ProtocolProcessor {
|
||||
ConnAckMessage badProto = new ConnAckMessage();
|
||||
badProto.setReturnCode(ConnAckMessage.UNNACEPTABLE_PROTOCOL_VERSION);
|
||||
LOG.warn("processConnect sent bad proto ConnAck");
|
||||
session.write(badProto);
|
||||
session.writeAndFlush(badProto);
|
||||
session.close();
|
||||
return;
|
||||
}
|
||||
@@ -150,7 +149,7 @@ public class ProtocolProcessor {
|
||||
if (msg.getClientID() == null || msg.getClientID().length() == 0) {
|
||||
ConnAckMessage okResp = new ConnAckMessage();
|
||||
okResp.setReturnCode(ConnAckMessage.IDENTIFIER_REJECTED);
|
||||
session.write(okResp);
|
||||
session.writeAndFlush(okResp);
|
||||
m_interceptor.notifyClientConnected(msg);
|
||||
return;
|
||||
}
|
||||
@@ -166,6 +165,7 @@ public class ProtocolProcessor {
|
||||
}
|
||||
if (!m_authenticator.checkValid(msg.getUsername(), pwd)) {
|
||||
failedCredentials(session);
|
||||
session.close();
|
||||
return;
|
||||
}
|
||||
session.attr(NettyChannel.ATTR_KEY_USERNAME).set(msg.getUsername());
|
||||
@@ -217,7 +217,7 @@ public class ProtocolProcessor {
|
||||
if (!msg.isCleanSession() && isSessionAlreadyStored) {
|
||||
okResp.setSessionPresent(true);
|
||||
}
|
||||
session.write(okResp);
|
||||
session.writeAndFlush(okResp);
|
||||
m_interceptor.notifyClientConnected(msg);
|
||||
|
||||
if (!isSessionAlreadyStored) {
|
||||
@@ -247,7 +247,7 @@ public class ProtocolProcessor {
|
||||
private void failedCredentials(Channel session) {
|
||||
ConnAckMessage okResp = new ConnAckMessage();
|
||||
okResp.setReturnCode(ConnAckMessage.BAD_USERNAME_OR_PASSWORD);
|
||||
session.write(okResp);
|
||||
session.writeAndFlush(okResp);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -270,8 +270,8 @@ public class ProtocolProcessor {
|
||||
}
|
||||
}
|
||||
|
||||
public void processPubAck(ServerChannel session, PubAckMessage msg) {
|
||||
String clientID = (String) session.getAttribute(NettyChannel.ATTR_KEY_CLIENTID);
|
||||
public void processPubAck(Channel session, PubAckMessage msg) {
|
||||
String clientID = (String) session.attr(NettyChannel.ATTR_KEY_CLIENTID).get();
|
||||
int messageID = msg.getMessageID();
|
||||
//Remove the message from message store
|
||||
ClientSession targetSession = m_sessionsStore.sessionForClient(clientID);
|
||||
@@ -535,14 +535,14 @@ public class ProtocolProcessor {
|
||||
LOG.debug("topic {} doesn't have read credentials", topic);
|
||||
return;
|
||||
}
|
||||
session.write(pubMessage);
|
||||
session.writeAndFlush(pubMessage); //Or writeAdnFlush but flush is costly!!
|
||||
}
|
||||
|
||||
private void sendPubRec(String clientID, int messageID) {
|
||||
LOG.trace("PUB <--PUBREC-- SRV sendPubRec invoked for clientID {} with messageID {}", clientID, messageID);
|
||||
PubRecMessage pubRecMessage = new PubRecMessage();
|
||||
pubRecMessage.setMessageID(messageID);
|
||||
m_clientIDs.get(clientID).session.write(pubRecMessage);
|
||||
m_clientIDs.get(clientID).session.writeAndFlush(pubRecMessage);
|
||||
}
|
||||
|
||||
private void sendPubAck(String clientId, int messageID) {
|
||||
@@ -558,7 +558,7 @@ public class ProtocolProcessor {
|
||||
if (m_clientIDs.get(clientId) == null) {
|
||||
throw new RuntimeException(String.format("Can't find a ConnectionDescriptor for client %s in cache %s", clientId, m_clientIDs));
|
||||
}
|
||||
m_clientIDs.get(clientId).session.write(pubAckMessage);
|
||||
m_clientIDs.get(clientId).session.writeAndFlush(pubAckMessage);
|
||||
} catch(Throwable t) {
|
||||
LOG.error(null, t);
|
||||
}
|
||||
@@ -568,8 +568,8 @@ public class ProtocolProcessor {
|
||||
* Second phase of a publish QoS2 protocol, sent by publisher to the broker. Search the stored message and publish
|
||||
* to all interested subscribers.
|
||||
* */
|
||||
public void processPubRel(ServerChannel session, PubRelMessage msg) {
|
||||
String clientID = (String) session.getAttribute(NettyChannel.ATTR_KEY_CLIENTID);
|
||||
public void processPubRel(Channel session, PubRelMessage msg) {
|
||||
String clientID = (String) session.attr(NettyChannel.ATTR_KEY_CLIENTID).get();
|
||||
int messageID = msg.getMessageID();
|
||||
LOG.debug("PUB --PUBREL--> SRV processPubRel invoked for clientID {} ad messageID {}", clientID, messageID);
|
||||
ClientSession targetSession = m_sessionsStore.sessionForClient(clientID);
|
||||
@@ -594,11 +594,11 @@ public class ProtocolProcessor {
|
||||
PubCompMessage pubCompMessage = new PubCompMessage();
|
||||
pubCompMessage.setMessageID(messageID);
|
||||
|
||||
m_clientIDs.get(clientID).session.write(pubCompMessage);
|
||||
m_clientIDs.get(clientID).session.writeAndFlush(pubCompMessage);
|
||||
}
|
||||
|
||||
public void processPubRec(ServerChannel session, PubRecMessage msg) {
|
||||
String clientID = (String) session.getAttribute(NettyChannel.ATTR_KEY_CLIENTID);
|
||||
public void processPubRec(Channel session, PubRecMessage msg) {
|
||||
String clientID = (String) session.attr(NettyChannel.ATTR_KEY_CLIENTID).get();
|
||||
int messageID = msg.getMessageID();
|
||||
ClientSession targetSession = m_sessionsStore.sessionForClient(clientID);
|
||||
verifyToActivate(clientID, targetSession);
|
||||
@@ -611,11 +611,11 @@ public class ProtocolProcessor {
|
||||
pubRelMessage.setMessageID(messageID);
|
||||
pubRelMessage.setQos(AbstractMessage.QOSType.LEAST_ONE);
|
||||
|
||||
session.write(pubRelMessage);
|
||||
session.writeAndFlush(pubRelMessage);
|
||||
}
|
||||
|
||||
public void processPubComp(ServerChannel session, PubCompMessage msg) {
|
||||
String clientID = (String) session.getAttribute(NettyChannel.ATTR_KEY_CLIENTID);
|
||||
public void processPubComp(Channel session, PubCompMessage msg) {
|
||||
String clientID = (String) session.attr(NettyChannel.ATTR_KEY_CLIENTID).get();
|
||||
int messageID = msg.getMessageID();
|
||||
LOG.debug("\t\tSRV <--PUBCOMP-- SUB processPubComp invoked for clientID {} ad messageID {}", clientID, messageID);
|
||||
//once received the PUBCOMP then remove the message from the temp memory
|
||||
@@ -624,15 +624,15 @@ public class ProtocolProcessor {
|
||||
targetSession.secondPhaseAcknowledged(messageID);
|
||||
}
|
||||
|
||||
public void processDisconnect(ServerChannel session) throws InterruptedException {
|
||||
String clientID = (String) session.getAttribute(NettyChannel.ATTR_KEY_CLIENTID);
|
||||
boolean cleanSession = (Boolean) session.getAttribute(NettyChannel.ATTR_KEY_CLEANSESSION);
|
||||
public void processDisconnect(Channel session) throws InterruptedException {
|
||||
String clientID = (String) session.attr(NettyChannel.ATTR_KEY_CLIENTID).get();
|
||||
boolean cleanSession = (Boolean) session.attr(NettyChannel.ATTR_KEY_CLEANSESSION).get();
|
||||
LOG.info("DISCONNECT client <{}> with clean session {}", clientID, cleanSession);
|
||||
ClientSession clientSession = m_sessionsStore.sessionForClient(clientID);
|
||||
clientSession.disconnect();
|
||||
|
||||
m_clientIDs.remove(clientID);
|
||||
session.close(true);
|
||||
session.close();
|
||||
|
||||
//cleanup the will store
|
||||
m_willStore.remove(clientID);
|
||||
@@ -691,7 +691,7 @@ public class ProtocolProcessor {
|
||||
ackMessage.setMessageID(messageID);
|
||||
|
||||
LOG.info("replying with UnsubAck to MSG ID {}", messageID);
|
||||
session.write(ackMessage);
|
||||
session.writeAndFlush(ackMessage);
|
||||
}
|
||||
|
||||
public void processSubscribe(Channel session, SubscribeMessage msg) {
|
||||
@@ -721,7 +721,7 @@ public class ProtocolProcessor {
|
||||
if (LOG.isTraceEnabled()) {
|
||||
LOG.trace("subscription tree {}", subscriptions.dumpTree());
|
||||
}
|
||||
session.write(ackMessage);
|
||||
session.writeAndFlush(ackMessage);
|
||||
|
||||
//fire the publish
|
||||
for(Subscription subscription : newSubscriptions) {
|
||||
|
||||
Reference in New Issue
Block a user