사용자 정의 트리거 생성(예 1)
- 최종 업데이트2024/11/07
사용자 정의 트리거 생성(예 1)
패키지 SDK는 미리 정의된 조건에 따라 작업을 자동화하는 사용자 정의 트리거를 구축하는 도구를 제공합니다.
이 섹션에서는 Automation Anywhere의 패키지 SDK를 사용하여 간격 트리거를 생성하는 방법을 학습하겠습니다. TriggerDemo
라는 샘플 클래스는 기능을 단계별로 설명하는 데 사용됩니다. 마지막에는 패키지 SDK를 사용하여 사용자 정의 트리거를 구축하는 방법을 확실하게 이해하게 될 것입니다.
프로시저
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;
}
}
다음 단계
위의 코드 샘플에서는 트리거를 생성하고 관리하는 데 사용되는 다양한 메소드와 주석 기호를 설명합니다. 코드와 해당 기능을 이해하면 이제 패키지 SDK를 사용하여 자신만의 간격 트리거를 생성할 수 있습니다. 다양한 간격으로 실험하고 작업을 트리거하여 비즈니스 프로세스를 효과적으로 자동화하십시오.
위의 문서는 샘플일 뿐이며 특정 요구 사항 및 대상 고객에 따라 추가로 수정하고 사용자 지정해야 합니다.