カスタム トリガーを作成する (例 2)
- 最終更新日2023/07/21
カスタム トリガーを作成する (例 2)
この例は、指定した間隔で実行されるタスクを作成できるトリガーを Automation 360 で作成する方法を示しています。
トリガーは、特定の条件が満たされたときに Bot を起動し、条件が変更または停止するまで待機します。トリガーのすべての条件が一致すると、実行メソッドが呼び出され、トリガーに信号を送ります。
必要な注釈
トリガーを作成するには、次の注釈が必要です。
注釈 | 使用状況 |
---|---|
BotCommand |
trigger を commandType として BotCommand 注釈を使用します。これにより、POJO (plain old Java object) が Automation 360 を使用したトリガーの作成に適するようになります。 |
CommandPkg |
これらの値は、パッケージの作成時に使用されます。注釈に名前、ラベル、説明を指定します。 |
TriggerId |
トリガーの停止に必要なトリガー ID。 |
|
トリガー条件が満たされたときに呼び出される consumer 関数を指定します。 |
StartListen |
トリガー リスナーを開始します。 |
StopAllTriggers |
すべてのトリガーをキャンセルするために使用されるメソッドを識別します。 |
StopListen |
特定のトリガーのキャンセルを担当するメソッドを識別します。 |
事例 - タイマー トリガー
次の事例は、一定の間隔で Bot をトリガーするタイマー トリガーを作成する方法を示しています。ここで説明する Demo Trigger
コマンドのサンプルは、ユーザーが指定した間隔に基づいてトリガーを作成し、管理することができるトリガー コマンドです。このトリガーを使って、定期的にタスクを実行することができます。
@BotCommand(commandType = BotCommand.CommandType.Trigger)
@CommandPkg(label = "Demo Trigger", description = "Demo Trigger", icon = "email.svg", name = "demoTrigger",
return_type = RECORD, return_name = "TriggerData", return_description = "Available keys: triggerType")
- コマンド タイプ: Trigger
- ラベル: Demo Trigger
- 説明: Demo Trigger
- アイコン: email.svg
- 名前: demoTrigger
- リターンタイプ: RECORD
- リターン名: TriggerData
- リターンの説明: 使用可能なキー: triggerType
TriggerDemo
クラスは、トリガー タスクを管理するシングルトン クラスです。triggerId
をキーとしてタスクをマップに格納します。トリガー条件が満たされると、関連する Runnable
の run
メソッドが呼び出され、トリガーに信号を送ります。
taskMap
: 複数のトリガー タスクを格納する静的なConcurrentHashMap
。TIMER
: トリガー タスクのスケジュール設定に使用される静的なTimer
。triggerUid
:@TriggerId
で注釈が付けられ、トリガーの一意な識別子を表します。consumer
:@TriggerConsumer
で注釈が付けられた、トリガー データを受け入れるコンシューマーです。
startTrigger
:@StartListen
で注釈が付けられたこのメソッドはトリガーを開始します。トリガーの起動間隔を指定するために、interval パラメーター (秒数) を取ります。これは、実行時に関連するRunnable
のrun
メソッドを呼び出す新しいTimerTask>
を作成します。TimerTask
は、triggerUid をキーとしてtaskMap
に追加され、指定された間隔で実行されるようにスケジュールされます。getRecordValue
: トリガー データを含むRecordValue
を作成して返すプライベート メソッドです。トリガー データは、単一のキー "triggerType "とそれに対応する値 "Interval Trigger "を持つスキーマを含んでいます。stopAllTriggers
:@StopAllTriggers
の注釈が付けられたこのメソッドは、すべてのトリガー タスクをキャンセルし、taskMap
をクリアします。stopListen
:@StopListen
の注釈が付けられたこのメソッドは、triggerUid
パラメーターで識別される特定のトリガー タスクをキャンセルし、それをtaskMap
から削除します。- セッター メソッド:
setTriggerUid
とsetConsumer
は、それぞれtriggerUid
とconsumer
変数のセッター メソッドです。
/*
* Copyright (c) 2023 Automation Anywhere.
* All rights reserved.
*
* This software is the proprietary information of Automation Anywhere.
* You shall use it only in accordance with the terms of the license agreement
* you entered into with Automation Anywhere.
*/
/**
*
*/
package com.automationanywhere.botcommand.samples.trigger;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;
import com.automationanywhere.botcommand.data.Value;
import com.automationanywhere.botcommand.data.impl.RecordValue;
import com.automationanywhere.botcommand.data.impl.StringValue;
import com.automationanywhere.botcommand.data.model.Schema;
import com.automationanywhere.botcommand.data.model.record.Record;
import com.automationanywhere.commandsdk.annotations.*;
import com.automationanywhere.commandsdk.annotations.rules.GreaterThan;
import com.automationanywhere.commandsdk.annotations.rules.NotEmpty;
import com.automationanywhere.commandsdk.annotations.rules.NumberInteger;
import com.automationanywhere.commandsdk.model.AttributeType;
import com.automationanywhere.commandsdk.model.DataType;
import static com.automationanywhere.commandsdk.model.DataType.RECORD;
/**
* There will be a singleton instance of this class. Whenever a new trigger is
* created it comes with a triggerId. In this sample we create multiple tasks
* and store them in a map with these triggerId as the key. Once the condition
* of trigger matches we call the run method of the runnable to signal the
* trigger.
* In the following example we will create a trigger which triggers are user
* specified intervals.
*
*/
@BotCommand(commandType = BotCommand.CommandType.Trigger)
@CommandPkg(label = "Demo Trigger", description = "Demo Trigger", icon = "email.svg", name = "demoTrigger",
return_type = RECORD, return_name = "TriggerData", return_description = "Available keys: triggerType")
public class TriggerDemo {
// Map storing multiple tasks
private static final Map<String, TimerTask> taskMap = new ConcurrentHashMap<>();
private static final Timer TIMER = new Timer(true);
@TriggerId
private String triggerUid;
@TriggerConsumer
private Consumer consumer;
/*
* Starts the trigger.
*/
@StartListen
public void startTrigger(@Idx(index = "1", type = AttributeType.NUMBER)
@Pkg(label = "Please provide the interval to trigger in seconds", default_value = "120", default_value_type = DataType.NUMBER)
@GreaterThan("0")
@NumberInteger
@NotEmpty
Double interval) {
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
consumer.accept(getRecordValue());
}
};
taskMap.put(this.triggerUid, timerTask);
TIMER.schedule(timerTask, interval.longValue());
}
private RecordValue getRecordValue() {
List<Schema> schemas = new LinkedList<>();
List<Value> values = new LinkedList<>();
schemas.add(new Schema("triggerType"));
values.add(new StringValue("Interval Trigger"));
RecordValue recordValue = new RecordValue();
recordValue.set(new Record(schemas,values));
return recordValue;
}
/*
* Cancel all the task and clear the map.
*/
@StopAllTriggers
public void stopAllTriggers() {
taskMap.forEach((k, v) -> {
if (v.cancel()) {
taskMap.remove(k);
}
});
}
/*
* Cancel the task and remove from map
*
* @param triggerUid
*/
@StopListen
public void stopListen(String triggerUid) {
if (taskMap.get(triggerUid).cancel()) {
taskMap.remove(triggerUid);
}
}
public void setTriggerUid(String triggerUid) {
this.triggerUid = triggerUid;
}
public void setConsumer(Consumer consumer) {
this.consumer = consumer;
}
}
例これは、
Demo Trigger
を使用する例です。demoTrigger.startTrigger(60.0);
これは、60 秒ごとに実行されるトリガーを開始し、トリガー データを使用して関連するコンシューマーを呼び出します。
トリガーを止めるには、以下のメソッドを使用できます。
demoTrigger.stopAllTriggers()
: このメソッドはすべてのアクティブなトリガーを停止します。demoTrigger.stopListen(triggerUid)
: このメソッドは、triggerUid
で識別される特定のトリガーを停止します。注:triggerUid
は、各トリガーの一意な識別子で、トリガーが作成されるときに自動的に割り当てられます。