【发布时间】:2020-05-25 19:02:01
【问题描述】:
我正在尝试使用 GAS(谷歌应用脚本)实现聊天机器人。并且在 LockService 方面遇到了一些麻烦。它似乎无法正常工作或根本无法正常工作。
当我从适当的聊天中收到新消息时,我保存了延迟值(8 秒)以忽略来自此聊天的后续消息。我使用 lockService 来避免跳过并发消息。
但是它不起作用,并且遗漏了一些消息。
我的代码:
function get_message_safely(chat_id, message) {
var lock = LockService.getScriptLock();
const delay = 8*1000; // 8 seconds
// save time of getting message
var get_time = (new Date()).getTime();
// lock
// set lock before accessing data
try {
if (lock.hasLock()) { // ==always false (for unknown reasons)
sendLog('get_message_safely/hasLock', 'lock = true' + '\n' + message);
}
lock.waitLock(10000); // wait 10 seconds for others' use of the code section and lock to stop and then proceed
} catch (error) {
sendLog('get_message_safely/lock_service', 'ОШИБКА: ' + error);
send_message(chat_id, "Наши сервера сейчас загружены. Отправьте сообщение повторно или попробуйте позже.");
lock.releaseLock();
return;
}
// get data from PropertiesService
var scriptProperties = PropertiesService.getScriptProperties();
var chat_access_flag = scriptProperties.getProperty(chat_id);
if (chat_access_flag != undefined) { // if chat already exist
if (chat_access_flag == 'false') { // access denied
sendLog('get_message_safely/lock_service', 'LockService: доступ запрещен.\n' + message);
lock.releaseLock();
return;
}
var lock_time = Number(chat_access_flag);
if (get_time <= lock_time) { // access denied: lock_time is still actual
sendLog('get_message_safely/lock_service', 'LockService: доступ запрещен т.к. время не прошло:\n' + lock_time + ' - ' + get_time + ' = ' + (lock_time - get_time) + '\n' + message);
lock.releaseLock();
return;
}
sendLog('get_message_safely/lock_service', 'LockService: доступ разрешен:\n' + lock_time + ' - ' + get_time + ' = ' + (lock_time - get_time) + '\nnew_lock_time: ' + (get_time + delay) + '\n' + message);
}
scriptProperties.setProperty(chat_id, get_time + delay); // if access is allowed, set new delay
// lock release
lock.releaseLock(); // release the lock
get_message(chat_id, message); // handling message
}
所以,有时我遇到这种情况(当我同时发送很多消息时),lockService 应该处理它但它没有:
案例(示例):
// lock_time == a;
// get 1 message: access allowed. So set new value to lock_time (=b)
// lock_time == b;
// get 2 message: access denied. get_time < lock_time (=b)
// lock_time still == b;
// get 3 message: access allowed: get_time > lock_time, where lock_time == a (!???). So set new value to lock_time (=c);
// lock_time == с (??)
// get 4 message: access denied: get_time < lock_time (=b)
由于 lockService 处理消息应该按顺序完成。但是某些消息由于某种原因访问 PropertiesService 并同时获得相同的日期。
这让我大吃一惊。你知道这里发生了什么吗? 我怎样才能达到理想的结果?
【问题讨论】:
-
嗨@NikitaGoncharov!在研究了您的代码后,我发现
.hasLock()总是返回false。在您的情况下,这可能意味着之前既没有调用过.waitLock()也没有调用过.tryLock()。您能否实现这些方法中的任何一个,看看是否有帮助?