首页 > 解决方案 > Google App Script Chat Bot 中的状态管理 (PropertiesService) 问题

问题描述

我有一个使用 Google App Script 实现的 Google Hangouts Chat 机器人。正如预期的那样,它基本上接收到一条消息,处理它并做出响应。我使用 PropertiesService 为给定用户保留机器人状态。在处理消息之前,脚本会读取之前存储的状态,用它来处理消息,更新状态,存储然后返回。


var STORAGE_KEY = "my_bot_storage";

function onMessage(event) {

  let message = undefined;

  if (event && event.message) {
    message = event.message.argumentText;
  }

  var lock = LockService.getUserLock();

  var success = lock.tryLock(5000);

  if (!success) {
    console.warn('Could not obtain lock after 5 seconds.');
  }

  var userData = PropertiesService.getUserProperties().getProperty(STORAGE_KEY);

  botState = JSON.parse(userData);

  let bot = new Robot(botState);

  let response = bot.onMessage(message);

  var data = JSON.stringify(botState);

  PropertiesService.getUserProperties().setProperty(STORAGE_KEY, data);

  lock.releaseLock();

  return {
    "text": response
  }

}

function onAddToSpace(event) { // Does nothing }

function onRemoveFromSpace(event) { // Does nothing }

除了上面的代码(Code.gs)之外,我还有一个额外的脚本,它使用一个简单的 onMessage 函数定义 Robot 类,该函数处理输入并创建输出 - 我可以重现问题的测试版本只需将文本添加到原始消息并将结果发回。基本设置遵循快速入门

它大部分时间都在工作,但有时在处理消息时,恢复的状态不是上一条消息保存的状态。我添加了日志以确认读取和保存属性的确切时间,并且根据日志,消息的状态始终在读取以下消息的状态之前保存。

我认为日志可能隐藏了实际的持久性事务,然后我添加了代码来锁定脚本——假设存在并发问题。但这没有用。归根结底,如果 PropertiesService 是异步的,我认为锁无论如何都不起作用。

知道会发生什么吗?

标签: javascriptgoogle-apps-scriptconcurrencyhangouts-chat

解决方案


推荐阅读