とある条件を満たしてから15分後にメール通知を送信する方法について
オプション
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
04-28-2023 02:26 AM - 編集済み 04-28-2023 02:28 AM
1件の返信1
オプション
- 新着としてマーク
- ブックマーク
- 購読
- ミュート
- RSS フィードを購読する
- ハイライト
- 印刷
- 不適切なコンテンツを報告
05-05-2023 03:01 AM
NotificationのAdvanced conditionのScriptのみ(When to sendのスクリプト)を使って作ってみました。あえてNotification のScriptをのみを使う方式なので、少々特殊な方法も含んでいます。主な動きはNotificationを15分後に再呼び出しするScheduleJobをScriptで作成しています。それと通知状態を判断するためにEventTableを使っています。(GWに4時間ぐらいかかっています。Scriptのヒントだけでよいなら早いですが、本当にアイデアが動くかどうか実際に作って検証する必要があり、Scriptを作って動作確認してわかりやすい形式に整えて投稿しています)
answer = (function () {
gs.info('Test Notification');
// Event Table を利用して、通知状態を把握する
var grEvent = new GlideRecord('sysevent');
grEvent.setLimit(1);
grEvent.addQuery('name', 'STARTSWITH', 'midserver.' + current.name);
grEvent.orderByDesc('sys_created_on');
grEvent.query();
if (grEvent.next()) {
gs.info('Test Notification ' + grEvent.name);
// 待機状態なら通知はしないで待機
if (grEvent.name == 'midserver.' + current.name + '.waiting') return false;
// 通知許可状態なら通知
if (grEvent.name == 'midserver.' + current.name + '.sendemail') {
//通知状態を正常に戻す。再通知を制御する場合はこの辺りを改良する
gs.eventQueue('midserver.' + current.name + '.normal', current);
return true;
}
}
//15分後に通知するかどうか判断する関数
var notifyServerDown = function (sysid) {
gs.info('Test Notification notifyServerDown');
var grMid = new GlideRecord('ecc_agent');
var eventtype = 'normal';
//MIDServerを特定
if (grMid.get(sysid)) {
//MIDServerの状態がDown
if (grMid.status == 'Down') {
var grEvent = new GlideRecord('sysevent');
grEvent.setLimit(1);
grEvent.addQuery('name', 'STARTSWITH', 'midserver.' + grMid.name);
grEvent.orderByDesc('sys_created_on');
grEvent.query();
if (grEvent.next()) {
//通知許可状態がwaitingなら、通知許可
if (grEvent.name == 'midserver.' + grMid.name + '.waiting') {
eventtype = 'sendemail';
}
}
}
//通知状態をEventに発行
gs.eventQueue('midserver.' + grMid.name + '.' + eventtype, grMid);
if (eventtype == 'sendemail') {
grMid.setForceUpdate(true);//変更箇所がなくても更新する
//Record更新をすることで再度Notificationを実行させる
grMid.update();
}
}
gs.info('Test Notification notifyServerDown ' + eventtype);
};
gs.info('Test Notification ScheduleOnce');
//15分後に通知するか判断する処理を発行する
var sched = new ScheduleOnce();
sched.script = '(' + notifyServerDown + ')("' + current.sys_id + '");';
sched.setLabel('notifyServerDown');
sched.setAsSeconds(15 * 60);
sched.schedule();
//通知待機状態をEventに発行
gs.eventQueue('midserver.' + current.name + '.waiting', current);
return false;//いまは通知しないで待機状態
})();