钩子程序服务断开,emqx没有自动重新连接,钩子程序校验权限问题

问题描述

环境信息

  • EMQ X 版本:4.3
  • 操作系统及版本:centos7
  • 其他

我用java编写的构造程序,已经启动,能接受到emqx的消息了,
现在测试遇到一个问题:
1.我停掉我们钩子服务后,emqx不能自动重新连接我们的钩子服务,哪里要配置吗?
2.我们用构造程序校验权限,不通过将设置结果为error了,然终端还是能连接

代码片段如下:

@Override
    public void onClientAuthenticate(ClientAuthenticateRequest request, StreamObserver<ValuedResponse> responseObserver) {
        //DEBUG("onClientAuthenticate", request);
        log.info("onClientAuthenticate:{}", gson.toJson(request));
        ClientInfo clientInfo = request.getClientinfo();
        Result result =  deviceConnectService.doLogin(clientInfo.getClientid(),clientInfo.getUsername(),clientInfo.getPassword());
        ValuedResponse reply ;
        if(result.isSuccess()){
           reply = ValuedResponse.newBuilder().setBoolResult(true).build();
            responseObserver.onNext(reply);
            responseObserver.onCompleted();
       }else{
           reply = ValuedResponse.newBuilder().setBoolResult(false).build();
       }//
    }

可以提供一下EMQ的日志吗?

钩子服务断开不能重连问题:
1.直接手动关闭钩子服务,在重启可以重连
2.在我们压测时,钩子服务挂了,后来重新启动钩子服务不能重连

构造程序校验权限问题:
就是重写了onClientAuthenticate,程序代码都到了

else{
reply = ValuedResponse.newBuilder().setBoolResult(false).build();
}

,按照道理应该是认证不通过了就不应该连接了吧?

你那要的日志是哪个?

erlang.log.1,run_erl.log,emqx.log.5

非常感谢!

@heeejianbo 你有什么想法么?

@heeejianbo 日志看起来是钩子超时了,重连机制是?

哪里可以设置重连机制?一般应该是:接到一条我们自己服务报错了,那么后面的消息应该不会影响吧;目前看要是我们一个地方报错,后面的消息都接不到我们钩子服务了

第一个问题:我们构造程序鉴权了,返回消息也给false了,但是终端还是可以登录,不知道哪里出问题了,代码如下:

@Override
    public void onClientAuthenticate(ClientAuthenticateRequest request, StreamObserver<ValuedResponse> responseObserver) {
        //DEBUG("onClientAuthenticate", request);
        log.info("onClientAuthenticate:{}", gson.toJson(request));
        ClientInfo clientInfo = request.getClientinfo();
        Result result =  deviceConnectService.doLogin(clientInfo.getClientid(),clientInfo.getUsername(),clientInfo.getPassword());
        ValuedResponse reply ;
        if(result.isSuccess()){
           reply = ValuedResponse.newBuilder().setBoolResult(true).build();
            responseObserver.onNext(reply);
            responseObserver.onCompleted();
       }else{
           reply = ValuedResponse.newBuilder().setBoolResult(false).build();
       }//
    }

第二个问题:构造服务报错,后续的消息就接不进来了

A1: ValuedResponse 有个 type 属性,设置为 STOP_AND_RETURN 在试试

A2:试试看,假如重启了 Java 的 钩子服务,看看 EMQ X 会成功重连吗?

1 个赞

重启是可以重连的

看上面图的日志,是请求Java 的 gRPC 报告 timeout 了。

有没有这段时间的具体日志,特别是钩子服务完成重启时,emqx 的日志

2.在我们压测时,钩子服务挂了,后来重新启动钩子服务不能重连

好,多谢,我多测试下看看,有问题在请教