カスタム トリガーを作成する (例 2)

この例は、指定した間隔で実行されるタスクを作成できるトリガーを Automation 360 で作成する方法を示しています。

トリガーは、特定の条件が満たされたときに Bot を起動し、条件が変更または停止するまで待機します。トリガーのすべての条件が一致すると、実行メソッドが呼び出され、トリガーに信号を送ります。

必要な注釈

トリガーを作成するには、次の注釈が必要です。

注釈 使用状況
BotCommand triggercommandType として BotCommand 注釈を使用します。これにより、POJO (plain old Java object) が Automation 360 を使用したトリガーの作成に適するようになります。
CommandPkg これらの値は、パッケージの作成時に使用されます。注釈に名前、ラベル、説明を指定します。
TriggerId トリガーの停止に必要なトリガー ID。

TriggerConsumer

トリガー条件が満たされたときに呼び出される 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 をキーとしてタスクをマップに格納します。トリガー条件が満たされると、関連する Runnablerun メソッドが呼び出され、トリガーに信号を送ります。

クラス変数
  • taskMap: 複数のトリガー タスクを格納する静的な ConcurrentHashMap
  • TIMER: トリガー タスクのスケジュール設定に使用される静的な Timer
  • triggerUid: @TriggerId で注釈が付けられ、トリガーの一意な識別子を表します。
  • consumer: @TriggerConsumer で注釈が付けられた、トリガー データを受け入れるコンシューマーです。
メソッド
  • startTrigger: @StartListen で注釈が付けられたこのメソッドはトリガーを開始します。トリガーの起動間隔を指定するために、interval パラメーター (秒数) を取ります。これは、実行時に関連する Runnablerun メソッドを呼び出す新しい TimerTask> を作成します。TimerTask は、triggerUid をキーとして taskMap に追加され、指定された間隔で実行されるようにスケジュールされます。
  • getRecordValue: トリガー データを含む RecordValue を作成して返すプライベート メソッドです。トリガー データは、単一のキー "triggerType "とそれに対応する値 "Interval Trigger "を持つスキーマを含んでいます。
  • stopAllTriggers: @StopAllTriggers の注釈が付けられたこのメソッドは、すべてのトリガー タスクをキャンセルし、taskMap をクリアします。
  • stopListen: @StopListen の注釈が付けられたこのメソッドは、triggerUid パラメーターで識別される特定のトリガー タスクをキャンセルし、それを taskMap から削除します。
  • セッター メソッド: setTriggerUidsetConsumer は、それぞれ triggerUidconsumer 変数のセッター メソッドです。
/*
 * 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 は、各トリガーの一意な識別子で、トリガーが作成されるときに自動的に割り当てられます。