前回タイムアウトの待ち時間が設定できず、トリガーの時間浪費が厳しいと書きました。
そこで、UrlFetchApp.fetchAll
を使って並列でリクエストを送ることにしました。
これなら全部タイムアウトしても最悪値ひとつだけの時間消費で済むはずと考えたからです。
UrlFetchApp.fetchAll
が並列であることは解説していただいているのでよいとして、タイムアウトしたときの処理はよくわかりませんでした。
// スプレッドシートで管理している監視先情報の取得
var infoObj = JSON.parse(getData(SERVER_SHEET_NAME))
var requests = []
infoObj.map(function(row) {
requests.push({
url: row.URL,
method: 'get',
muteHttpExceptions: true,
})
})
try {
var responses = UrlFetchApp.fetchAll(requests);
} catch(e) {
Logger.log(e)
}
Logger.log(responses)
requestsの中には接続できないURLが含まれています。
結論として、
タイムアウトで例外が発生し、responses
が空だった
というのが軽い検証の結果でした。
仮にこれが真だとすると、ひとつでもコケる可能性があるURLがあると他の正常なリクエストも巻き添えで死ぬため、
そういった場合はfetchAll
ではなくfetch
ループのほうがマシな可能性まで生まれるんじゃないかと思います。
頻繁に死ぬようなURLを短時間にチェックする方法がやはり異端かな。