From f763246231ad30928835d221e0d60f2fc2f07619 Mon Sep 17 00:00:00 2001 From: godotg Date: Fri, 14 Apr 2023 23:08:18 +0800 Subject: [PATCH] ref[attachment]: refactor attachment of net --- .../net/router/attachment/AttachmentType.java | 10 +-- .../router/attachment/GatewayAttachment.java | 7 +- .../net/router/attachment/HttpAttachment.java | 7 +- .../net/router/attachment/IAttachment.java | 6 -- .../router/attachment/NoAnswerAttachment.java | 7 +- .../router/attachment/SignalAttachment.java | 5 +- .../attachment/SignalOnlyAttachment.java | 72 +++++++++++++++++++ .../net/router/attachment/UdpAttachment.java | 7 +- .../main/java/com/zfoo/net/task/TaskBus.java | 45 +++++++++--- 9 files changed, 130 insertions(+), 36 deletions(-) create mode 100644 net/src/main/java/com/zfoo/net/router/attachment/SignalOnlyAttachment.java diff --git a/net/src/main/java/com/zfoo/net/router/attachment/AttachmentType.java b/net/src/main/java/com/zfoo/net/router/attachment/AttachmentType.java index a5cacd24..8deb3c5c 100644 --- a/net/src/main/java/com/zfoo/net/router/attachment/AttachmentType.java +++ b/net/src/main/java/com/zfoo/net/router/attachment/AttachmentType.java @@ -26,26 +26,28 @@ public enum AttachmentType { */ SIGNAL_PACKET((byte) 0, SignalAttachment.class), + SIGNAL_ONLY_PACKET((byte) 1, SignalOnlyAttachment.class), + /** * gateway attachment */ - GATEWAY_PACKET((byte) 1, GatewayAttachment.class), + GATEWAY_PACKET((byte) 2, GatewayAttachment.class), /** * udp attachment */ - UDP_PACKET((byte) 2, UdpAttachment.class), + UDP_PACKET((byte) 3, UdpAttachment.class), /** * http attachment */ - HTTP_PACKET((byte) 3, HttpAttachment.class), + HTTP_PACKET((byte) 4, HttpAttachment.class), /** * not used attachment */ - NO_ANSWER_PACKET((byte) 4, NoAnswerAttachment.class), + NO_ANSWER_PACKET((byte) 5, NoAnswerAttachment.class), ; 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 d995d094..3e6e8ff3 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 @@ -21,7 +21,7 @@ import org.springframework.lang.Nullable; */ public class GatewayAttachment implements IAttachment { - public static final short PROTOCOL_ID = 1; + public static final short PROTOCOL_ID = 2; /** * session id @@ -73,7 +73,10 @@ public class GatewayAttachment implements IAttachment { return AttachmentType.GATEWAY_PACKET; } - @Override + /** + * EN:Used to determine which thread the message is processed on + * CN:用来确定这条消息在哪一个线程处理 + */ public int taskExecutorHash() { return useTaskExecutorHashParam ? taskExecutorHashParam : (int) uid; } diff --git a/net/src/main/java/com/zfoo/net/router/attachment/HttpAttachment.java b/net/src/main/java/com/zfoo/net/router/attachment/HttpAttachment.java index 701842d9..8c00a97b 100644 --- a/net/src/main/java/com/zfoo/net/router/attachment/HttpAttachment.java +++ b/net/src/main/java/com/zfoo/net/router/attachment/HttpAttachment.java @@ -21,7 +21,7 @@ import io.netty.handler.codec.http.HttpResponseStatus; */ public class HttpAttachment implements IAttachment { - public static final short PROTOCOL_ID = 3; + public static final short PROTOCOL_ID = 4; private long uid; @@ -45,7 +45,10 @@ public class HttpAttachment implements IAttachment { return AttachmentType.HTTP_PACKET; } - @Override + /** + * EN:Used to determine which thread the message is processed on + * CN:用来确定这条消息在哪一个线程处理 + */ public int taskExecutorHash() { return useTaskExecutorHashParam ? taskExecutorHashParam : (int) uid; } diff --git a/net/src/main/java/com/zfoo/net/router/attachment/IAttachment.java b/net/src/main/java/com/zfoo/net/router/attachment/IAttachment.java index fafa6869..14f37a32 100644 --- a/net/src/main/java/com/zfoo/net/router/attachment/IAttachment.java +++ b/net/src/main/java/com/zfoo/net/router/attachment/IAttachment.java @@ -22,10 +22,4 @@ public interface IAttachment extends IPacket { AttachmentType packetType(); - /** - * EN:Used to determine which thread the message is processed on - * CN:用来确定这条消息在哪一个线程处理 - */ - int taskExecutorHash(); - } diff --git a/net/src/main/java/com/zfoo/net/router/attachment/NoAnswerAttachment.java b/net/src/main/java/com/zfoo/net/router/attachment/NoAnswerAttachment.java index 5cc769f6..a3116934 100644 --- a/net/src/main/java/com/zfoo/net/router/attachment/NoAnswerAttachment.java +++ b/net/src/main/java/com/zfoo/net/router/attachment/NoAnswerAttachment.java @@ -20,7 +20,7 @@ package com.zfoo.net.router.attachment; */ public class NoAnswerAttachment implements IAttachment { - public static final short PROTOCOL_ID = 4; + public static final short PROTOCOL_ID = 5; private int taskExecutorHash; @@ -35,11 +35,6 @@ public class NoAnswerAttachment implements IAttachment { return AttachmentType.NO_ANSWER_PACKET; } - @Override - public int taskExecutorHash() { - return taskExecutorHash; - } - @Override public short protocolId() { return PROTOCOL_ID; diff --git a/net/src/main/java/com/zfoo/net/router/attachment/SignalAttachment.java b/net/src/main/java/com/zfoo/net/router/attachment/SignalAttachment.java index 783ae964..4214ee4e 100644 --- a/net/src/main/java/com/zfoo/net/router/attachment/SignalAttachment.java +++ b/net/src/main/java/com/zfoo/net/router/attachment/SignalAttachment.java @@ -71,7 +71,10 @@ public class SignalAttachment implements IAttachment { return AttachmentType.SIGNAL_PACKET; } - @Override + /** + * EN:Used to determine which thread the message is processed on + * CN:用来确定这条消息在哪一个线程处理 + */ public int taskExecutorHash() { return taskExecutorHash; } diff --git a/net/src/main/java/com/zfoo/net/router/attachment/SignalOnlyAttachment.java b/net/src/main/java/com/zfoo/net/router/attachment/SignalOnlyAttachment.java new file mode 100644 index 00000000..c1d9d277 --- /dev/null +++ b/net/src/main/java/com/zfoo/net/router/attachment/SignalOnlyAttachment.java @@ -0,0 +1,72 @@ +/* + * Copyright (C) 2020 The zfoo Authors + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed + * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and limitations under the License. + */ + +package com.zfoo.net.router.attachment; + +/** + * 主要用来支持godot,unity,ts这种异步语法的使用,做为async/await语法的支撑 + * + * @author godotg + * @version 3.0 + */ +public class SignalOnlyAttachment implements IAttachment { + + public static final short PROTOCOL_ID = 1; + + private int signalId; + + private long timestamp; + + @Override + public AttachmentType packetType() { + return AttachmentType.SIGNAL_ONLY_PACKET; + } + + @Override + public short protocolId() { + return PROTOCOL_ID; + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + SignalOnlyAttachment that = (SignalOnlyAttachment) o; + return signalId == that.signalId; + } + + @Override + public int hashCode() { + return signalId; + } + + public long getTimestamp() { + return timestamp; + } + + public void setTimestamp(long timestamp) { + this.timestamp = timestamp; + } + + public int getSignalId() { + return signalId; + } + + public void setSignalId(int signalId) { + this.signalId = signalId; + } + +} diff --git a/net/src/main/java/com/zfoo/net/router/attachment/UdpAttachment.java b/net/src/main/java/com/zfoo/net/router/attachment/UdpAttachment.java index 2832d729..0606b182 100644 --- a/net/src/main/java/com/zfoo/net/router/attachment/UdpAttachment.java +++ b/net/src/main/java/com/zfoo/net/router/attachment/UdpAttachment.java @@ -20,7 +20,7 @@ import com.zfoo.util.math.RandomUtils; */ public class UdpAttachment implements IAttachment { - public static final short PROTOCOL_ID = 2; + public static final short PROTOCOL_ID = 3; private String host; private int port; @@ -37,11 +37,6 @@ public class UdpAttachment implements IAttachment { return AttachmentType.UDP_PACKET; } - @Override - public int taskExecutorHash() { - return RandomUtils.randomInt(); - } - @Override public short protocolId() { return PROTOCOL_ID; diff --git a/net/src/main/java/com/zfoo/net/task/TaskBus.java b/net/src/main/java/com/zfoo/net/task/TaskBus.java index 1262a2fb..4a74eff1 100644 --- a/net/src/main/java/com/zfoo/net/task/TaskBus.java +++ b/net/src/main/java/com/zfoo/net/task/TaskBus.java @@ -15,6 +15,11 @@ package com.zfoo.net.task; import com.zfoo.event.manager.EventBus; import com.zfoo.net.NetContext; +import com.zfoo.net.router.attachment.GatewayAttachment; +import com.zfoo.net.router.attachment.HttpAttachment; +import com.zfoo.net.router.attachment.IAttachment; +import com.zfoo.net.router.attachment.SignalAttachment; +import com.zfoo.net.session.Session; import com.zfoo.protocol.collection.concurrent.CopyOnWriteHashMapLongObject; import com.zfoo.protocol.util.AssertionUtils; import com.zfoo.protocol.util.StringUtils; @@ -114,17 +119,39 @@ public final class TaskBus { */ public static void dispatch(PacketReceiverTask task) { var attachment = task.getAttachment(); - if (attachment == null) { - var session = task.getSession(); - var uid = session.getUid(); - if (uid > 0) { - execute((int) uid, task); - } else { - execute((int) session.getSid(), task); - } + dispatchBySession(task.getSession(), task); } else { - execute(attachment.taskExecutorHash(), task); + dispatchByAttachment(attachment, task); + } + } + + private static void dispatchBySession(Session session, PacketReceiverTask task) { + var uid = session.getUid(); + if (uid > 0) { + execute((int) uid, task); + } else { + execute((int) session.getSid(), task); + } + } + + private static void dispatchByAttachment(IAttachment attachment, PacketReceiverTask task) { + switch (attachment.packetType()) { + case SIGNAL_PACKET: + execute(((SignalAttachment) attachment).taskExecutorHash(), task); + break; + case GATEWAY_PACKET: + execute(((GatewayAttachment) attachment).taskExecutorHash(), task); + break; + case HTTP_PACKET: + execute(((HttpAttachment) attachment).taskExecutorHash(), task); + break; + case SIGNAL_ONLY_PACKET: + case NO_ANSWER_PACKET: + case UDP_PACKET: + dispatchBySession(task.getSession(), task); + break; + default: } }