diff --git a/im-client/pom.xml b/im-client/pom.xml
index c7cea70..8fcbe95 100644
--- a/im-client/pom.xml
+++ b/im-client/pom.xml
@@ -29,6 +29,10 @@
com.google.inject
guice
+
+ com.google.inject.extensions
+ guice-multibindings
+
org.reflections
reflections
diff --git a/im-client/src/main/java/net/sopod/soim/client/ClientMain.java b/im-client/src/main/java/net/sopod/soim/client/ClientMain.java
index b81909f..5bde5c4 100644
--- a/im-client/src/main/java/net/sopod/soim/client/ClientMain.java
+++ b/im-client/src/main/java/net/sopod/soim/client/ClientMain.java
@@ -18,16 +18,12 @@ import net.sopod.soim.client.config.GuiceIoc;
public class ClientMain {
public static void main(String[] args) {
-// ImNetClient client = new ImNetClient();
-// client.connect("127.0.0.1", 8088);
-
// 创建 ioc 容器
GuiceIoc guiceIoc = new GuiceIoc(ClientMain.class);
Injector injector = Guice.createInjector(Stage.PRODUCTION, guiceIoc);
// 启动 cmd scanner
- CmdStarter cmdStarter = injector.getInstance(CmdStarter.class);
- cmdStarter.start();
+ injector.getInstance(CmdStarter.class).start();
}
}
diff --git a/im-client/src/main/java/net/sopod/soim/client/cmd/CmdDispatcher.java b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdDispatcher.java
index c231bc2..0fad400 100644
--- a/im-client/src/main/java/net/sopod/soim/client/cmd/CmdDispatcher.java
+++ b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdDispatcher.java
@@ -7,6 +7,7 @@ import com.google.inject.Injector;
import com.google.inject.Singleton;
import net.sopod.soim.client.cmd.handler.CmdHandler;
import net.sopod.soim.client.logger.Logger;
+import net.sopod.soim.common.util.StringUtil;
/**
* CommandDispatcher
@@ -39,7 +40,9 @@ public class CmdDispatcher {
if (args.length > 0) {
System.arraycopy(cmdArgs, 1, args, 0, args.length);
}
-
+ if (StringUtil.isEmpty(cmd)) {
+ return;
+ }
CmdEnum cmdEnum = CmdEnum.getValue(cmd);
if (cmdEnum == null) {
Logger.error("未知指令: {}", cmd);
diff --git a/im-client/src/main/java/net/sopod/soim/client/cmd/CmdEnum.java b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdEnum.java
index e9aff4a..1979f37 100644
--- a/im-client/src/main/java/net/sopod/soim/client/cmd/CmdEnum.java
+++ b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdEnum.java
@@ -1,8 +1,8 @@
package net.sopod.soim.client.cmd;
import net.sopod.soim.client.cmd.handler.CmdHandler;
-import net.sopod.soim.client.handler.ExitHandler;
-import net.sopod.soim.client.handler.LoginHandler;
+import net.sopod.soim.client.handler.cmd.ExitHandler;
+import net.sopod.soim.client.handler.cmd.LoginHandler;
/**
* Commands
diff --git a/im-client/src/main/java/net/sopod/soim/client/cmd/CmdStarter.java b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdStarter.java
index 119c076..158feaa 100644
--- a/im-client/src/main/java/net/sopod/soim/client/cmd/CmdStarter.java
+++ b/im-client/src/main/java/net/sopod/soim/client/cmd/CmdStarter.java
@@ -1,14 +1,14 @@
package net.sopod.soim.client.cmd;
import com.google.inject.Inject;
-import com.google.inject.Injector;
import com.google.inject.Singleton;
import net.sopod.soim.client.logger.Logger;
import java.util.Scanner;
/**
- * Args
+ * CmdStarter
+ * 命令启动器
*
* @author tmy
* @date 2022-04-25 10:28
@@ -18,25 +18,38 @@ public class CmdStarter {
private final CmdDispatcher cmdDispatcher;
+ private Scanner scanner;
+
@Inject
public CmdStarter(CmdDispatcher cmdDispatcher) {
this.cmdDispatcher = cmdDispatcher;
}
public void start() {
- Scanner scanner = new Scanner(System.in);
+ this.close();
+ this.scanner = new Scanner(System.in);
Logger.pre("【client】: ");
- while(scanner.hasNextLine()) {
- String cmd = scanner.nextLine();
- cmdDispatcher.dispatchCmd(cmd);
+ while(this.scanner.hasNextLine()) {
+ String cmd = this.scanner.nextLine();
+ this.cmdDispatcher.dispatchCmd(cmd);
+
+ // 退出
+ if (CmdEnum.exit.name().equals(cmd.split("[ \t]+")[0])) {
+ Logger.info("bye bye");
+ break;
+ }
Logger.pre("【client】: ");
}
-
- scanner.close();
}
- public void exit() {
+ public void close() {
+ if (this.scanner != null) {
+ this.scanner.close();
+ }
+ }
+ public static void printPre() {
+ Logger.pre("【client】: ");
}
}
diff --git a/im-client/src/main/java/net/sopod/soim/client/config/GuiceIoc.java b/im-client/src/main/java/net/sopod/soim/client/config/GuiceIoc.java
index ba9aee1..160afab 100644
--- a/im-client/src/main/java/net/sopod/soim/client/config/GuiceIoc.java
+++ b/im-client/src/main/java/net/sopod/soim/client/config/GuiceIoc.java
@@ -2,6 +2,8 @@ package net.sopod.soim.client.config;
import com.google.inject.AbstractModule;
import com.google.inject.Singleton;
+import com.google.inject.multibindings.Multibinder;
+import net.sopod.soim.client.session.MessageHandler;
import org.reflections.Reflections;
import java.util.Collections;
@@ -31,8 +33,15 @@ public class GuiceIoc extends AbstractModule {
* guice 注册 bean
*/
@Override
+ @SuppressWarnings("unchecked")
protected void configure() {
for (Class> beanType : this.beanTypes) {
+ if (MessageHandler.class.isAssignableFrom(beanType)) {
+ Multibinder.newSetBinder(binder(), MessageHandler.class)
+ .addBinding()
+ .to((Class extends MessageHandler>) beanType);
+ continue;
+ }
bind(beanType);
}
// 注册后释放内存
diff --git a/im-client/src/main/java/net/sopod/soim/client/handler/ExitHandler.java b/im-client/src/main/java/net/sopod/soim/client/handler/ExitHandler.java
deleted file mode 100644
index 24aa9d6..0000000
--- a/im-client/src/main/java/net/sopod/soim/client/handler/ExitHandler.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package net.sopod.soim.client.handler;
-
-import com.google.inject.Singleton;
-import net.sopod.soim.client.cmd.handler.NonArgsHandler;
-
-/**
- * ExitHandler
- *
- * @author tmy
- * @date 2022-04-25 11:53
- */
-@Singleton
-public class ExitHandler extends NonArgsHandler {
-
- @Override
- public void handle() {
- System.exit(1);
- }
-
-}
diff --git a/im-client/src/main/java/net/sopod/soim/client/handler/cmd/ExitHandler.java b/im-client/src/main/java/net/sopod/soim/client/handler/cmd/ExitHandler.java
new file mode 100644
index 0000000..ad81eb9
--- /dev/null
+++ b/im-client/src/main/java/net/sopod/soim/client/handler/cmd/ExitHandler.java
@@ -0,0 +1,30 @@
+package net.sopod.soim.client.handler.cmd;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import net.sopod.soim.client.cmd.CmdStarter;
+import net.sopod.soim.client.cmd.handler.NonArgsHandler;
+import net.sopod.soim.client.session.SoImSession;
+
+/**
+ * ExitHandler
+ *
+ * @author tmy
+ * @date 2022-04-25 11:53
+ */
+@Singleton
+public class ExitHandler extends NonArgsHandler {
+
+ @Inject
+ private SoImSession soImSession;
+
+ @Inject
+ private CmdStarter cmdStarter;
+
+ @Override
+ public void handle() {
+ cmdStarter.close();
+ soImSession.close();
+ }
+
+}
diff --git a/im-client/src/main/java/net/sopod/soim/client/handler/LoginHandler.java b/im-client/src/main/java/net/sopod/soim/client/handler/cmd/LoginHandler.java
similarity index 89%
rename from im-client/src/main/java/net/sopod/soim/client/handler/LoginHandler.java
rename to im-client/src/main/java/net/sopod/soim/client/handler/cmd/LoginHandler.java
index 90ffd83..0065dc7 100644
--- a/im-client/src/main/java/net/sopod/soim/client/handler/LoginHandler.java
+++ b/im-client/src/main/java/net/sopod/soim/client/handler/cmd/LoginHandler.java
@@ -1,4 +1,4 @@
-package net.sopod.soim.client.handler;
+package net.sopod.soim.client.handler.cmd;
import com.google.inject.Inject;
import com.google.inject.Singleton;
@@ -35,17 +35,16 @@ public class LoginHandler implements CmdHandler {
@Override
public void handleArgs(ArgsLogin args) {
- Logger.info("login args: {}", args);
HashMap params = new HashMap<>();
params.put("account", args.getAccount());
params.put("password", args.getPassword());
+ Logger.info("登录中...");
LoginResDTO loginRes = HttpClient.restPost(clientConfig.getLoginUrl(), params, LoginResDTO.class);
if (!Boolean.TRUE.equals(loginRes.getSuccess())) {
Logger.error("登录失败: {}", loginRes.getMessage());
return;
}
- String authToken = loginRes.getAuthToken();
- Logger.info("登录成功: {}", authToken);
+ Logger.info("登录成功: {}", loginRes.getUid());
Auth.ReqTokenAuth reqTokenAuth = Auth.ReqTokenAuth.newBuilder()
.setUid(loginRes.getUid())
diff --git a/im-client/src/main/java/net/sopod/soim/client/handler/msg/ResTokenAuthHandler.java b/im-client/src/main/java/net/sopod/soim/client/handler/msg/ResTokenAuthHandler.java
new file mode 100644
index 0000000..0f32f29
--- /dev/null
+++ b/im-client/src/main/java/net/sopod/soim/client/handler/msg/ResTokenAuthHandler.java
@@ -0,0 +1,26 @@
+package net.sopod.soim.client.handler.msg;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import net.sopod.soim.client.session.MessageHandler;
+import net.sopod.soim.client.session.SoImSession;
+import net.sopod.soim.data.msg.auth.Auth;
+
+/**
+ * ResTokenAuthHandler
+ *
+ * @author tmy
+ * @date 2022-04-27 9:46
+ */
+@Singleton
+public class ResTokenAuthHandler implements MessageHandler {
+
+ @Inject
+ private SoImSession soImSession;
+
+ @Override
+ public void handleMsg(Auth.ResTokenAuth msg) {
+ soImSession.authResult(msg.getSuccess(), msg.getMessage());
+ }
+
+}
diff --git a/im-client/src/main/java/net/sopod/soim/client/logger/Logger.java b/im-client/src/main/java/net/sopod/soim/client/logger/Logger.java
index 94dfd22..8c75c6f 100644
--- a/im-client/src/main/java/net/sopod/soim/client/logger/Logger.java
+++ b/im-client/src/main/java/net/sopod/soim/client/logger/Logger.java
@@ -1,5 +1,7 @@
package net.sopod.soim.client.logger;
+import net.sopod.soim.client.cmd.CmdStarter;
+
/**
* Logger
*
@@ -21,7 +23,13 @@ public class Logger {
for (int i = 0; i < args.length; i++) {
args[i] = String.valueOf(args[i]);
}
- System.out.println(String.format(msg, args));
+ if ("main".equals(Thread.currentThread().getName())) {
+ System.out.println(String.format(msg, args));
+ } else {
+ // 其他线程异步打印
+ System.out.println(System.lineSeparator() + String.format(msg, args));
+ CmdStarter.printPre();
+ }
}
public static void pre(String pre) {
diff --git a/im-client/src/main/java/net/sopod/soim/client/session/MessageDispatcher.java b/im-client/src/main/java/net/sopod/soim/client/session/MessageDispatcher.java
new file mode 100644
index 0000000..9482468
--- /dev/null
+++ b/im-client/src/main/java/net/sopod/soim/client/session/MessageDispatcher.java
@@ -0,0 +1,53 @@
+package net.sopod.soim.client.session;
+
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import com.google.protobuf.MessageLite;
+import io.netty.channel.ChannelHandler;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.SimpleChannelInboundHandler;
+import net.sopod.soim.common.util.Reflects;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * MessageDispatcher
+ *
+ * @author tmy
+ * @date 2022-04-27 9:48
+ */
+@Singleton
+@ChannelHandler.Sharable
+public class MessageDispatcher extends SimpleChannelInboundHandler {
+
+ private Map, MessageHandler> msgHandlers;
+
+ @Inject
+ public MessageDispatcher(Set handlers) {
+ this.registryHandlers(handlers);
+ }
+
+ @Override
+ protected void channelRead0(ChannelHandlerContext channelHandlerContext, MessageLite msg) throws Exception {
+ MessageHandler messageHandler = msgHandlers.get(msg.getClass());
+ messageHandler.handleMsg(msg);
+ }
+
+ private void registryHandlers(Set handlers) {
+ for (MessageHandler> handler : handlers) {
+ List msgTypes = Reflects.getSuperInterfaceGenericTypes(handler.getClass());
+ Map, MessageHandler> msgHandlers = new HashMap<>();
+ try {
+ Class> msgType = msgTypes.size() == 0 ? Object.class : Class.forName(msgTypes.get(0));
+ msgHandlers.put(msgType, handler);
+ } catch (ClassNotFoundException e) {
+ e.printStackTrace();
+ }
+ this.msgHandlers = msgHandlers;
+ }
+ }
+
+}
diff --git a/im-client/src/main/java/net/sopod/soim/client/session/MessageHandler.java b/im-client/src/main/java/net/sopod/soim/client/session/MessageHandler.java
new file mode 100644
index 0000000..8d3d7f0
--- /dev/null
+++ b/im-client/src/main/java/net/sopod/soim/client/session/MessageHandler.java
@@ -0,0 +1,13 @@
+package net.sopod.soim.client.session;
+
+/**
+ * MessageHandler
+ *
+ * @author tmy
+ * @date 2022-04-27 9:50
+ */
+public interface MessageHandler {
+
+ void handleMsg(T msg);
+
+}
diff --git a/im-client/src/main/java/net/sopod/soim/client/session/SoImSession.java b/im-client/src/main/java/net/sopod/soim/client/session/SoImSession.java
index 6c0de45..f9c234d 100644
--- a/im-client/src/main/java/net/sopod/soim/client/session/SoImSession.java
+++ b/im-client/src/main/java/net/sopod/soim/client/session/SoImSession.java
@@ -1,5 +1,6 @@
package net.sopod.soim.client.session;
+import com.google.inject.Inject;
import com.google.inject.Singleton;
import com.google.protobuf.MessageLite;
import io.netty.bootstrap.Bootstrap;
@@ -32,6 +33,13 @@ public class SoImSession {
private AtomicBoolean auth = new AtomicBoolean(false);
+ private final MessageDispatcher messageDispatcher;
+
+ @Inject
+ public SoImSession(MessageDispatcher messageDispatcher) {
+ this.messageDispatcher = messageDispatcher;
+ }
+
public void connect(String host, Integer port, Auth.ReqTokenAuth tokenAuth) {
eventLoopGroup = new NioEventLoopGroup(2);
Bootstrap b = new Bootstrap()
@@ -41,43 +49,73 @@ public class SoImSession {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
ch.pipeline()
- .addLast(new ImMessageCodec());
- // .addLast(new ProtoMessageCodec());
+ .addLast(new ImMessageCodec())
+ .addLast(messageDispatcher);
}
});
try {
+ Logger.info("连接中...");
clientChannel = b.connect(host, port).await().channel();
// 连接后立即发送认证消息
- // TODO ResHandler
clientChannel.writeAndFlush(tokenAuth);
- } catch (InterruptedException e) {
- e.printStackTrace();
+ } catch (Exception e) {
+ Logger.error("连接服务器失败: {}", e.getMessage());
}
}
+ /**
+ * 处理登录认证结果
+ */
+ public void authResult(boolean success, String message) {
+ this.auth.set(success);
+ if (this.auth.get()) {
+ Logger.info("连接服务器成功");
+ return;
+ }
+ Logger.info("连接服务器失败: {}", message);
+ this.close();
+ }
+
+ public void authSuccess() {
+ // token 认证成功,连接建立
+ this.auth.set(true);
+ Logger.info("连接服务器成功");
+ }
+
+ /**
+ * 发送消息
+ */
public void send(MessageLite message) {
if (!auth.get()) {
- Logger.error("请登录后发送消息");
+ Logger.error("请先登录");
return;
}
if (clientChannel == null
|| !clientChannel.isActive()) {
- Logger.error("连接未打开");
+ Logger.error("连接已关闭");
return;
}
clientChannel.write(message);
}
+ /**
+ * 关闭 tcp 连接
+ */
public void close() {
if (clientChannel != null) {
- try {
- clientChannel.close().await();
- } catch (InterruptedException e) {
- logger.error("channel close error: ", e);
+ if (this.clientChannel.isActive()) {
+ try {
+ clientChannel.close().await();
+ Logger.info("连接已关闭");
+ } catch (InterruptedException e) {
+ Logger.error("连接关闭失败: {}", e.getMessage());
+ }
}
+ this.clientChannel = null;
}
if (eventLoopGroup != null) {
eventLoopGroup.shutdownGracefully();
+ this.eventLoopGroup = null;
}
}
diff --git a/im-common/src/main/java/net/sopod/soim/common/constant/AppConstant.java b/im-common/src/main/java/net/sopod/soim/common/constant/AppConstant.java
new file mode 100644
index 0000000..54c7699
--- /dev/null
+++ b/im-common/src/main/java/net/sopod/soim/common/constant/AppConstant.java
@@ -0,0 +1,21 @@
+package net.sopod.soim.common.constant;
+
+/**
+ * AppConstant
+ *
+ * @author tmy
+ * @date 2022-04-27 15:04
+ */
+public interface AppConstant {
+
+ String APP_REGISTRY_GROUP = "so-im";
+
+ /** im-entry 注册中心名称 */
+ String APP_IM_ENTRY_REGISTRY_NAME = "im-entry-instance";
+
+ String APP_IM_ENTRY_NAME = "im-entry";
+
+ String APP_IM_HTTP_ENTRY_NAME = "im-http-entry";
+ String APP_IM_DAS_USER_NAME = "im-das-user";
+
+}
diff --git a/im-common/src/main/java/net/sopod/soim/common/util/Collects.java b/im-common/src/main/java/net/sopod/soim/common/util/Collects.java
index 4738e61..24f748f 100644
--- a/im-common/src/main/java/net/sopod/soim/common/util/Collects.java
+++ b/im-common/src/main/java/net/sopod/soim/common/util/Collects.java
@@ -1,5 +1,8 @@
package net.sopod.soim.common.util;
+import java.util.*;
+import java.util.function.Function;
+
/**
* Collects
*
@@ -20,4 +23,41 @@ public class Collects {
return arr;
}
+ public static Map> group(Collection collect,
+ Function groupBy,
+ Function valBy) {
+ return group(3, collect, groupBy, valBy);
+ }
+
+ /**
+ * 对 list 数据进行分组
+ * @param aboutFactorOfSize 集合数据条数约是分组后数据的n倍
+ * @param collect 集合数据
+ * @param groupBy 集合元素分组值
+ * @param valBy 分组结果
+ * @param 集合元素类型
+ * @param 分组值类型
+ * @param 分组结果类型
+ * @return 分组结果
+ */
+ public static Map> group(int aboutFactorOfSize,
+ Collection collect,
+ Function groupBy,
+ Function valBy) {
+ if (aboutFactorOfSize < 1) {
+ throw new IllegalArgumentException("aboutFactorOfSize需大于0");
+ }
+ if (collect == null || collect.isEmpty()) {
+ return Collections.emptyMap();
+ }
+ Map> result = new HashMap<>(Math.max(6, Math.min(16, collect.size() / aboutFactorOfSize)));
+ for (T item : collect) {
+ K key = groupBy.apply(item);
+ V val = valBy.apply(item);
+ List vals = result.computeIfAbsent(key, k -> new LinkedList<>());
+ vals.add(val);
+ }
+ return result;
+ }
+
}
diff --git a/im-common/src/main/java/net/sopod/soim/common/util/Reflects.java b/im-common/src/main/java/net/sopod/soim/common/util/Reflects.java
index f0979f2..092536c 100644
--- a/im-common/src/main/java/net/sopod/soim/common/util/Reflects.java
+++ b/im-common/src/main/java/net/sopod/soim/common/util/Reflects.java
@@ -1,6 +1,7 @@
package net.sopod.soim.common.util;
import java.lang.reflect.Type;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
@@ -17,16 +18,35 @@ public class Reflects {
* 获取父类上的泛型
* @return 父类上的泛型
*/
- public static List getSuperclassGenericTypes(Class> clazz) {
+ public static List getSuperClassGenericTypes(Class> clazz) {
// 获取 handler 的泛型消息
Type superType = clazz.getGenericSuperclass();
String typeName = superType.getTypeName();
- int idx = typeName.indexOf('<');
+ return parseGenericType(typeName);
+ }
+
+ /**
+ * 获取父接口上的泛型
+ * @return 父接口上的泛型
+ */
+ public static List getSuperInterfaceGenericTypes(Class> clazz) {
+ // 获取 handler 的泛型消息
+ Type[] genericTypes = clazz.getGenericInterfaces();
+ List types = new ArrayList<>(6);
+ for (Type genericType : genericTypes) {
+ List interfaceGenericTypes = parseGenericType(genericType.getTypeName());
+ types.addAll(interfaceGenericTypes);
+ }
+ return types;
+ }
+
+ private static List parseGenericType(String genericClass) {
+ int idx = genericClass.indexOf('<');
if (idx == -1) {
// 父类没有泛型
return Collections.emptyList();
}
- String genericName = typeName.substring(idx + 1, typeName.length() - 1);
+ String genericName = genericClass.substring(idx + 1, genericClass.length() - 1);
// 父类只有一个泛型
if (!genericName.contains(",")) {
return Collections.singletonList(genericName);
diff --git a/im-common/src/main/java/net/sopod/soim/common/util/StringUtil.java b/im-common/src/main/java/net/sopod/soim/common/util/StringUtil.java
index 2b764d7..6d37521 100644
--- a/im-common/src/main/java/net/sopod/soim/common/util/StringUtil.java
+++ b/im-common/src/main/java/net/sopod/soim/common/util/StringUtil.java
@@ -16,4 +16,8 @@ public class StringUtil {
return (new UUID(random.nextLong(), random.nextLong())).toString().replace("-", "");
}
+ public static boolean isEmpty(String content) {
+ return content == null || content.length() == 0;
+ }
+
}
diff --git a/im-core/src/main/java/net/sopod/soim/core/handler/NetUserMessageHandler.java b/im-core/src/main/java/net/sopod/soim/core/handler/NetUserMessageHandler.java
index addf696..ce216ed 100644
--- a/im-core/src/main/java/net/sopod/soim/core/handler/NetUserMessageHandler.java
+++ b/im-core/src/main/java/net/sopod/soim/core/handler/NetUserMessageHandler.java
@@ -15,7 +15,7 @@ public abstract class NetUserMessageHandler implements MessageHandler {
public final void exec(NetUser netUser, T msg) {
MessageLite res = handle(netUser, msg);
if (res != null) {
- netUser.write(res);
+ netUser.writeNow(res);
}
}
diff --git a/im-core/src/main/java/net/sopod/soim/core/registry/ProtoMessageHandlerRegistry.java b/im-core/src/main/java/net/sopod/soim/core/registry/ProtoMessageHandlerRegistry.java
index 8ae305e..4a68907 100644
--- a/im-core/src/main/java/net/sopod/soim/core/registry/ProtoMessageHandlerRegistry.java
+++ b/im-core/src/main/java/net/sopod/soim/core/registry/ProtoMessageHandlerRegistry.java
@@ -41,7 +41,7 @@ public class ProtoMessageHandlerRegistry {
Collection handlers = beansOfType.values();
for (MessageHandler> handler : handlers) {
// 获取 handler 泛型
- List genericTypes = Reflects.getSuperclassGenericTypes(handler.getClass());
+ List genericTypes = Reflects.getSuperClassGenericTypes(handler.getClass());
try {
Class> type = genericTypes.size() == 0 ? Object.class : Class.forName(genericTypes.get(0));
MessageHandler> existHandler = TYPE_HANDLER_MAP.putIfAbsent(type, handler);
diff --git a/im-entry/src/main/java/net/sopod/soim/entry/EntryApplication.java b/im-entry/src/main/java/net/sopod/soim/entry/EntryApplication.java
index d378283..4605f32 100644
--- a/im-entry/src/main/java/net/sopod/soim/entry/EntryApplication.java
+++ b/im-entry/src/main/java/net/sopod/soim/entry/EntryApplication.java
@@ -1,8 +1,11 @@
package net.sopod.soim.entry;
+import com.alibaba.nacos.api.exception.NacosException;
+import net.sopod.soim.entry.registry.RegistryService;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.ConfigurableApplicationContext;
/**
* EntryMain
@@ -14,8 +17,12 @@ import org.springframework.boot.autoconfigure.SpringBootApplication;
@EnableDubbo
public class EntryApplication {
- public static void main(String[] args) {
- SpringApplication.run(EntryApplication.class, args);
+ public static void main(String[] args) throws NacosException {
+ ConfigurableApplicationContext context = SpringApplication.run(EntryApplication.class, args);
+
+ // 注册 im-entry 服务
+ RegistryService registryService = context.getBean(RegistryService.class);
+ registryService.registryImEntry();
}
}
diff --git a/im-entry/src/main/java/net/sopod/soim/entry/config/EntryServerConfig.java b/im-entry/src/main/java/net/sopod/soim/entry/config/EntryServerConfig.java
index 1336363..4de00cc 100644
--- a/im-entry/src/main/java/net/sopod/soim/entry/config/EntryServerConfig.java
+++ b/im-entry/src/main/java/net/sopod/soim/entry/config/EntryServerConfig.java
@@ -1,6 +1,7 @@
package net.sopod.soim.entry.config;
import lombok.Data;
+import net.sopod.soim.common.constant.AppConstant;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.stereotype.Component;
@@ -17,13 +18,15 @@ import org.springframework.stereotype.Component;
@Data
public class EntryServerConfig {
- private String name = "entry server";
+ private String name = AppConstant.APP_IM_ENTRY_NAME;
/** entry 所在服务器 ip */
private String ip = "127.0.0.1";
private Integer port = 8088;
+ private String nacosAddr;
+
/** 消息消费者线程数 */
private Integer workerSize;
diff --git a/im-entry/src/main/java/net/sopod/soim/entry/handler/auth/ReqTokenAuthHandler.java b/im-entry/src/main/java/net/sopod/soim/entry/handler/auth/ReqTokenAuthHandler.java
index ad5f97e..5821e3f 100644
--- a/im-entry/src/main/java/net/sopod/soim/entry/handler/auth/ReqTokenAuthHandler.java
+++ b/im-entry/src/main/java/net/sopod/soim/entry/handler/auth/ReqTokenAuthHandler.java
@@ -12,7 +12,7 @@ import org.springframework.stereotype.Service;
* ReqTokenAuthHandler
* 连接用户携带 token 登录
* 1.调用 token 校验解析服务获取用户信息
- * 1.1 存储用户信息、entry节点信息 到 router
+ * 1.1 存储用户信息、entry 节点信息 到 router
* 2. entry channel attr(UserInfo) / return false, channel close
*
* return ResTokenAuth(success/false)
@@ -28,7 +28,10 @@ public class ReqTokenAuthHandler extends NetUserMessageHandlerim-common
${soim.version}
+
+ net.sopod
+ im-data
+ ${soim.version}
+
org.springframework.boot
spring-boot-starter
diff --git a/pom.xml b/pom.xml
index 55f22a7..9e016dc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -72,7 +72,12 @@
com.google.inject
guice
- 4.1.0
+ 4.2.3
+
+
+ com.google.inject.extensions
+ guice-multibindings
+ 4.2.3
org.apache.commons