Api Websocket ping超时将冻结Mattermost“;bot“;
我正在创建一个最重要的机器人。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连接(跳过错误处理): 听力功能: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
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 {}