Einen benutzerdefinierten Auslöser erstellen (Beispiel 1)

Paket-SDK bietet Werkzeuge zur Erstellung benutzerdefinierter Auslöser, die Aktionen auf der Grundlage vordefinierter Bedingungen automatisieren.

In diesem Abschnitt erfahren Sie, wie Sie mit dem Paket-SDK von Automation Anywhere einen Intervallauslöser erstellen können. Anhand einer Beispielklasse namens TriggerDemo wird die Funktionalität Schritt für Schritt erklärt. Am Ende werden Sie ein solides Verständnis dafür haben, wie Sie Ihre eigenen benutzerdefinierten Auslöser mit Paket-SDK erstellen können:

Prozedur

  1. Abhängigkeiten und Paket: Das Codebeispiel verwendet verschiedene Importe und ist im Paket com.automationanywhere.botcommand.samples.trigger organisiert.
  2. Anmerkungen: Der Code verwendet mehrere Anmerkungen, die vom Paket-SDK bereitgestellt werden, um den Auslöser zu definieren und zu konfigurieren. Diese Anmerkungen umfassen:
    1. @BotCommand: Gibt an, dass diese Klasse einen Auslöser darstellt. Sie geben dies mit der Zeile @BotCommand(commandType = BotCommand.CommandType.Trigger) an. Wenn Sie angeben, dass es sich um einen Befehlstyp Trigger handelt, wird er im Abschnitt Auslöser im Bot-Editor angezeigt.
    2. @CommandPkg: Stellt Metadaten über den Auslöser bereit, z. B. Bezeichnung, Beschreibung, Symbol und Rückgabetyp. Der Rückgabetyp ist immer auf DATENSATZ eingestellt, wie im folgenden Beispiel gezeigt.
    3. @TriggerId: Gibt die eindeutige Kennung an, die jeder Auslöserinstanz zugewiesen ist.
    4. @TriggerConsumer: Gibt die Verbraucherfunktion an, die aufgerufen werden soll, wenn die Auslösebedingung erfüllt ist.
    5. @StartListen: Markiert die Methode, die für das Starten des Auslösers verantwortlich ist.
      Tipp: @StartListen wird zur Ausführung eines Triggers verwendet und entspricht @Execute im Falle eines Bots.
    6. @AlleTriggerStoppen: Gibt die Methode an, mit der alle Auslöser abgebrochen werden.
    7. @StopListen: Gibt die Methode an, die für das Abbrechen eines bestimmten Auslösers verantwortlich ist.
  3. Ausführung des Auslösers: Die Ausführungslogik des Auslösers ist in der Methode startTrigger mit der Anmerkung @StartListen implementiert. In diesem Beispiel wird eine TimerTask so geplant, dass sie in regelmäßigen vom Nutzer festgelegten Abständen ausgeführt wird. Wenn die vorgesehene Zeit erreicht ist, wird die Methode run der TimerTask ausgeführt, was consumer.accept auslöst. Der Verbraucher akzeptiert den RecordValue, der von der Methode getRecordValue zurückgegeben wird.
    Tipp: RecordValue ist auch für die Verwendung innerhalb Ihrer Bot-Logik verfügbar.
  4. Methode getRecordValue : Die Methode getRecordValue erstellt ein RecordValue-Objekt und füllt es mit einer Liste von Schemata und Werten. In diesem Beispiel wird das Schema triggerType mit dem entsprechenden Wert Intervallauslöser hinzugefügt.
  5. Methoden StopListen und StopAllTriggers : Diese Methoden sind mit @StopListen bzw. @StopAllTriggers vermerkt. Sie sind dafür zuständig, auslösende Aufgaben abzubrechen und aus der Aufgabenzuordnung zu entfernen.
  6. Zusätzliche Hilfsmethoden: Der Code enthält auch Getter- und Setter-Methoden für die Variablen triggerUid und consumer.
package com.automationanywhere.botcommand.samples.trigger;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Consumer;

import javax.sql.DataSource;

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.botcommand.samples.exceptions.DemoException;
import com.automationanywhere.commandsdk.annotations.*;
import org.apache.commons.dbcp2.BasicDataSource;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import com.automationanywhere.botcommand.exception.BotCommandException;
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 com.automationanywhere.core.security.SecureString;

import static com.automationanywhere.commandsdk.model.DataType.RECORD;

/**
 * This example is an extension of the timer based trigger {@link TriggerDemo} and demonstrates the
 * pull mechanism.
 * Trigger will check the DB at regular interval and if the records returned by
 * user provided SQL is more than 0 then it will get triggered.
 * NOTE 1: This class is for illustrative purpose only not safe for use in production.
 * NOTE 2: Please add the valid DB driver in build gradle to run this example.
 * 
 */
@BotCommand(commandType = BotCommand.CommandType.Trigger)
@CommandPkg(label = "JDBC Query Trigger", description = "JDBC Query Trigger", icon = "jdbc.svg", name = "jdbcQueryTrigger",
		return_type = RECORD, return_name = "TriggerData", return_description = "Available keys: triggerType")
public class DBStatus {
	
	private static Logger logger = LogManager.getLogger(DBStatus.class);
	
	
	// 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.TEXT)
			@Pkg(label = "Please provide the database driver class")
			@NotEmpty
			String driverClassName,
			
			@Idx(index="2", type = AttributeType.TEXT)
			@Pkg(label = "Please provide the Jdbc connection string")
			@NotEmpty
			String jdbcUrl,
			
			@Idx(index="3", type = AttributeType.TEXT)
			@Pkg(label = "Please provide the user Name")
			@NotEmpty
			String userName,
			
			@Idx(index="4", type = AttributeType.CREDENTIAL)
			@Pkg(label = "Please provide the password")
			@NotEmpty
			SecureString password,
			
			@Idx(index="5", type = AttributeType.TEXT)
			@Pkg(label = "Please provide the SQL to check the records")
			@NotEmpty
			String sqlQuery,
			
			@Idx(index = "6", type = AttributeType.NUMBER)
			@Pkg(label = "Please provide the interval to query in seconds", default_value = "300", default_value_type = DataType.NUMBER)
			@GreaterThan("0")
			@NumberInteger
			@NotEmpty
			Double interval) {
		
		DataSource dataSource = getDataSource(driverClassName, jdbcUrl, userName, password);
		
		TimerTask timerTask = new TimerTask() {

			@Override
			public void run() {
				logger.debug("checking DB");
				try {
					if(checkRecordsExist(dataSource.getConnection(), sqlQuery)){
						consumer.accept(getRecordValue());
						return;
					}
				} catch (SQLException e) {
					logger.warn(e.getMessage(),e);
					logger.warn("Trigger is still running.");
				}
				logger.debug("no records found");

			}
		};

		taskMap.put(this.triggerUid, timerTask);
		TIMER.schedule(timerTask, interval.longValue(), interval.longValue());
	}

	private RecordValue getRecordValue() {
		List<Schema> schemas = new LinkedList<>();
		List<Value> values = new LinkedList<>();
		schemas.add(new Schema("triggerType"));
		values.add(new StringValue("DBStatus"));

		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 static DataSource getDataSource(String driverClassName, String url, String userName,SecureString password) {
    	BasicDataSource ds = new BasicDataSource();
    	ds.setDriverClassName(driverClassName);
    	ds.setUrl(url);
    	ds.setUsername(userName);
    	ds.setPassword(password.getInsecureString());
        return ds;
    }
	
    public static boolean checkRecordsExist(Connection con, String query)
    	    throws SQLException {
			
    	    Statement stmt = null;
    	    try {
    	        stmt = con.createStatement();
    	        ResultSet rs = stmt.executeQuery(query);
    	        rs.last();
    	        if(rs.getRow() > 0)
    	        	return true;
    	    } catch (SQLException e ) {
    	        throw new DemoException("Problem running statemnt", e);
    	    } finally {
    	        if (stmt != null) { stmt.close(); }
    	    }
    	    
    	    return false;
    	}
    
	public String getTriggerUid() {
		return triggerUid;
	}

	public void setTriggerUid(String triggerUid) {
		this.triggerUid = triggerUid;
	}

	public Consumer getConsumer() {
		return consumer;
	}

	public void setConsumer(Consumer consumer) {
		this.consumer = consumer;
	}
}

Nächste Maßnahme

Im obigen Codebeispiel werden die verschiedenen Methoden und Anmerkungen beschrieben, die zur Erstellung und Verwaltung des Auslösers verwendet werden. Mit dem Verständnis des Codes und seiner Funktionalität sind Sie nun in der Lage, Ihre eigenen Intervallauslöser mit Paket-SDK zu erstellen. Experimentieren Sie mit verschiedenen Intervallen und Auslöseaktionen, um Ihre Geschäftsprozesse effektiv zu automatisieren.

Der Artikel hier ist nur ein Beispiel. Sie sollten Ihren Prozess an spezifische Anforderungen und Ihre Zielgruppe anpassen.