Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Api Websocket ping超时将冻结Mattermost“;bot“;_Api_Go_Websocket_Timeout_Mattermost - Fatal编程技术网

Api Websocket ping超时将冻结Mattermost“;bot“;

Api Websocket ping超时将冻结Mattermost“;bot“;,api,go,websocket,timeout,mattermost,Api,Go,Websocket,Timeout,Mattermost,我正在创建一个最重要的机器人。websocket连接在随机时间段(1分钟、8分钟、2小时等)后收到ping超时(PingTimeoutChannel)后停止响应。Mattermost服务器是v.5.13,API v.4 bot通过创建新的Client4连接到Mattermost API。接下来,它以用户身份登录,并在创建带有已接收授权令牌的Websocket客户端之后登录。它开始监听所有频道,当它接收到一个事件,该事件是一条指向他的消息(@botname),它会自动响应(创建model.post

我正在创建一个最重要的机器人。websocket连接在随机时间段(1分钟、8分钟、2小时等)后收到ping超时(PingTimeoutChannel)后停止响应。Mattermost服务器是v.5.13,API v.4

bot通过创建新的Client4连接到Mattermost API。接下来,它以用户身份登录,并在创建带有已接收授权令牌的Websocket客户端之后登录。它开始监听所有频道,当它接收到一个事件,该事件是一条指向他的消息(@botname),它会自动响应(创建model.post)

我选择使用简单的用户名/密码身份验证进行登录,就像在Mattermost示例bot中一样。但是,我尝试将其重写为个人访问令牌身份验证(如中所示),因为我认为它可以解决超时问题。但是,此解决方案不再有效,它在尝试以这种方式登录时会出现“无效或过期的会话错误,请重新登录”

所以我放弃了这个想法,开始搜索超时发生的位置。服务器ping正常,websocket不正常。我尝试了很多方法,直到重新连接为止(通过再次创建新的Mattermost API和Websocket客户端)。机器人仍然没有响应。我已经没有主意了

Websocket连接(跳过错误处理):

听力功能:

        for {
            select {

            case <-connection.Websocket.PingTimeoutChannel:
                logs.WriteToFile("Websocket ping timeout. Connecting again.")
                log.Println("Websocket ping timeout. Connecting again.")
                mux.Lock()
                connection.Connect()
                mux.Unlock()

            case event := <-connection.Websocket.EventChannel:
                mux.Lock()
                if event != nil {
                    if event.IsValid() && isMessage(event.Event){
                        handleEvent(event)
                    }
                }
                mux.Unlock()
            }
        }
    }()
    // block to the go function
    select {}
用于{
挑选{
案例使用运行程序并修复任何问题。更详细地描述程序停止响应时正在执行的操作。是否在问题中的select或其他位置阻止了该程序?如果您不知道该程序正在执行的操作,则通过结束程序SIGQUIT转储GOROUTIE堆栈。使用运行程序并修复任何问题。请更详细地描述程序停止响应时正在执行的操作。它是在问题中的select上被阻止还是在其他地方被阻止?如果您不知道该程序正在执行的操作,请通过SIGQUIT结束程序来转储goroutine堆栈。
        for {
            select {

            case <-connection.Websocket.PingTimeoutChannel:
                logs.WriteToFile("Websocket ping timeout. Connecting again.")
                log.Println("Websocket ping timeout. Connecting again.")
                mux.Lock()
                connection.Connect()
                mux.Unlock()

            case event := <-connection.Websocket.EventChannel:
                mux.Lock()
                if event != nil {
                    if event.IsValid() && isMessage(event.Event){
                        handleEvent(event)
                    }
                }
                mux.Unlock()
            }
        }
    }()
    // block to the go function
    select {}