diff --git a/net/src/main/java/com/zfoo/net/handler/GatewayRouteHandler.java b/net/src/main/java/com/zfoo/net/handler/GatewayRouteHandler.java index 76631c13..529d2dbb 100644 --- a/net/src/main/java/com/zfoo/net/handler/GatewayRouteHandler.java +++ b/net/src/main/java/com/zfoo/net/handler/GatewayRouteHandler.java @@ -81,10 +81,10 @@ public class GatewayRouteHandler extends ServerRouteHandler { throw new IllegalArgumentException(StringUtils.format(" session:{}发送了一个非法包[{}]", SessionUtils.sessionSimpleInfo(ctx), JsonUtils.object2String(packet))); } - var signalAttachment = (SignalAttachment) decodedPacketInfo.getAttachment(); // 把客户端信息包装为一个GatewayAttachment,因此通过这个网关附加包可以得到玩家的uid、sid之类的信息 - var gatewayAttachment = new GatewayAttachment(session, signalAttachment); + var gatewayAttachment = new GatewayAttachment(session); + gatewayAttachment.wrapAttachment(decodedPacketInfo.getAttachment()); // 网关优先使用IGatewayLoadBalancer作为一致性hash的计算参数,然后才会使用客户端的session做参数 // 例子:以聊天服务来说,玩家知道自己在哪个群组groupId中,那往这个群发送消息时,会在Packet中带上这个groupId做为一致性hash就可以了。 diff --git a/net/src/main/java/com/zfoo/net/router/Router.java b/net/src/main/java/com/zfoo/net/router/Router.java index 458b02a3..5f11b3c0 100644 --- a/net/src/main/java/com/zfoo/net/router/Router.java +++ b/net/src/main/java/com/zfoo/net/router/Router.java @@ -125,10 +125,10 @@ public class Router implements IRouter { gatewaySession.setUid(uid); EventBus.post(AuthUidToGatewayEvent.valueOf(gatewaySession.getSid(), uid)); - NetContext.getRouter().send(session, AuthUidToGatewayConfirm.valueOf(uid), new GatewayAttachment(gatewaySession, null)); + NetContext.getRouter().send(session, AuthUidToGatewayConfirm.valueOf(uid), new GatewayAttachment(gatewaySession)); return; } - send(gatewaySession, packet, signalAttachmentInGatewayAttachment); + send(gatewaySession, packet, gatewayAttachment.attachment()); } else { logger.error("gateway receives packet:[{}] and attachment:[{}] from server" + ", but serverSessionMap has no session[id:{}], perhaps client disconnected from gateway.", JsonUtils.object2String(packet), JsonUtils.object2String(attachment), gatewayAttachment.getSid()); } diff --git a/net/src/main/java/com/zfoo/net/router/attachment/GatewayAttachment.java b/net/src/main/java/com/zfoo/net/router/attachment/GatewayAttachment.java index 3e6e8ff3..3f28cb0d 100644 --- a/net/src/main/java/com/zfoo/net/router/attachment/GatewayAttachment.java +++ b/net/src/main/java/com/zfoo/net/router/attachment/GatewayAttachment.java @@ -13,7 +13,6 @@ package com.zfoo.net.router.attachment; import com.zfoo.net.session.Session; -import org.springframework.lang.Nullable; /** * @author godotg @@ -50,16 +49,16 @@ public class GatewayAttachment implements IAttachment { * CN:客户端发到网关的可能是一个带有同步或者异步的附加包,网关转发的时候需要把这个附加包给带上 */ private SignalAttachment signalAttachment; + private SignalOnlyAttachment signalOnlyAttachment; public GatewayAttachment() { } - public GatewayAttachment(Session session, @Nullable SignalAttachment signalAttachment) { + public GatewayAttachment(Session session) { this.client = true; this.sid = session.getSid(); this.uid = session.getUid(); - this.signalAttachment = signalAttachment; } public GatewayAttachment(long sid, long uid) { @@ -91,6 +90,31 @@ public class GatewayAttachment implements IAttachment { this.taskExecutorHashParam = argument.hashCode(); } + public void wrapAttachment(IAttachment attachment) { + if (attachment == null) { + return; + } + switch (attachment.packetType()) { + case SIGNAL_ONLY_PACKET: + signalOnlyAttachment = (SignalOnlyAttachment) attachment; + break; + case SIGNAL_PACKET: + signalAttachment = (SignalAttachment) attachment; + break; + default: + } + } + + public IAttachment attachment() { + if (signalAttachment != null) { + return signalAttachment; + } + if (signalOnlyAttachment != null) { + return signalOnlyAttachment; + } + return null; + } + public long getSid() { return sid; } @@ -139,4 +163,12 @@ public class GatewayAttachment implements IAttachment { public void setSignalAttachment(SignalAttachment signalAttachment) { this.signalAttachment = signalAttachment; } + + public SignalOnlyAttachment getSignalOnlyAttachment() { + return signalOnlyAttachment; + } + + public void setSignalOnlyAttachment(SignalOnlyAttachment signalOnlyAttachment) { + this.signalOnlyAttachment = signalOnlyAttachment; + } } diff --git a/net/src/test/resources/protocol.xml b/net/src/test/resources/protocol.xml index 3dd3fb83..deb3a62a 100644 --- a/net/src/test/resources/protocol.xml +++ b/net/src/test/resources/protocol.xml @@ -5,6 +5,7 @@ +