Amazon Lex V2空闲超5分钟报The session has been destroyed错误求助
问题原因
AWS Lex V2 服务端默认对空闲时间超过5分钟的会话执行自动销毁,同一个sessionId的两次请求间隔超过该阈值时,就会返回The session has been destroyed错误,属于服务端的默认会话管控逻辑,和你本地SDK的超时配置无关。
解决方案
- 方案1:调整会话空闲超时阈值
可以通过两种方式修改超时时间,最长支持设置为24小时(86400秒):- 全局配置:进入Lex控制台对应机器人的「别名」配置页,修改「会话超时」参数,该配置对当前别名下所有会话生效。
- 单请求动态配置:调用
recognizeText接口时,传入sessionState.sessionTimeoutInSeconds参数自定义当前会话的超时时间。
- 方案2:捕获销毁错误后自动重建会话
若业务允许超时后清空上下文新建会话,可在捕获到对应错误时,自动生成新的sessionId重发请求,无需上层业务感知。 - 方案3:业务侧自行维护会话状态
若需要长期保留会话上下文,不要依赖Lex的内置会话存储,可在业务数据库存储用户的会话状态(比如槽位信息、上下文属性),每次请求时主动传入sessionState参数,即使Lex侧会话销毁,也可以通过传入的状态恢复会话上下文。
代码修改示例
async sendTextMessageToAWS(textMessage, sessionId = uniqid()) { return new Promise((resolve, reject) => { const requestParams = { botAliasId: this.alias, botId: this.botName, text: textMessage, localeId: this.locale, sessionId: sessionId, // 可选:单请求指定超时时间,这里设为3600秒=1小时 sessionState: { sessionTimeoutInSeconds: 3600 } } this.lexruntime.recognizeText(requestParams, (err, response) => { if (err && err.message === "The session has been destroyed") { // 会话销毁时自动用新sessionId重发请求 const newSessionId = uniqid(); this.lexruntime.recognizeText({ ...requestParams, sessionId: newSessionId }, (retryErr, retryRes) => { if (retryErr) reject(retryErr); else resolve({...retryRes, newSessionId}); }) } else if (err) reject(err); else { console.log(JSON.stringify(response, undefined, 2)); resolve(response); } }) }) }
内容的提问来源于stack exchange,提问作者Damian Gonzalez
相关产品推荐
相关产品推荐

