-
Notifications
You must be signed in to change notification settings - Fork 205
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
多次调用UserIdSettingKit.settingUserId,会出现逻辑服请求网关服超时的情况 #344
Comments
同一个连接只能调用一次登录。 |
为啥回报超时错误呢?感觉直接返回false是不是会好一点,这块是怎么考虑设计的? |
正常业务不会登录两次。 方法内返回的 false,里面会打印错误日志。 |
登录后,该 channelId 就没有意义了。 see ioGame/common/common-core/src/main/java/com/iohao/game/action/skeleton/protocol/HeadMetadata.java Lines 119 to 129 in ba88679
|
channelId这个地方我明白了。还有一个我纠结的点在于SettingUserIdMessage这个消息对外服接收到之后,可以判断是否登录了,如果登录了就返回false,而不是现在这样因为channelId为null,导致超时不返回消息,逻辑服再捕获异常返false,感觉怪怪的。 |
同一个用户允许多次登录才是问题,建议在 action 中自己加个用户是否已经登录了的判断。 |
本来我也遇到过这个问题但是规避了 |
使用技巧: 自定义注解配合 ioGame 线程相关 (yuque.com) 的线程编排,可以实现让登录方法交给虚拟线程处理,这样就不会阻塞用户线程。 1,在 loginVerify 方法上添加一个自定义的 VirtualThread 注解。
@ActionController(LoginCmd.cmd)
public class LoginAction {
/**
* 登录验证
*
* @param loginVerify 登录
* @param flowContext flowContext
* @return 用户信息
*/
@VirtualThread
@ActionMethod(LoginCmd.loginVerify)
public UserInfo loginVerify(LoginVerify loginVerify, FlowContext flowContext) {
... ... 省略部分代码
}
} 2,重写 RequestMessageClientProcessorHook 接口,处理 VirtualThread 注解。 public final class MyRequestMessageClientProcessorHook implements RequestMessageClientProcessorHook {
@Override
public void processLogic(BarSkeleton barSkeleton, FlowContext flowContext) {
ActionCommand actionCommand = flowContext.getActionCommand();
var annotation = actionCommand.getAnnotation(VirtualThread.class);
// 使用虚拟线程处理业务
if (Objects.nonNull(annotation)) {
TaskKit.executeVirtual(() -> barSkeleton.handle(flowContext));
return;
}
... ...
}
}
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface VirtualThread {
} |
你的问题
作者你好,使用单机多进程方式分别启动网关服、对外服、逻辑服,使用模拟客户端调用1-0路由,action方法中为UserIdSettingKit.settingUserId,第一次调用没问题正常返回,再次调用这个路由则会出现逻辑服请求网关服超时的情况
com.iohao.game.bolt.broker.client.kit.UserIdSettingKit.settingUserId:99 - Rpc invocation timeout[responseCommand TIMEOUT]! the address is 127.0.0.1:10200
复现步骤
game.zip
版本
dev分支最新代码
The text was updated successfully, but these errors were encountered: