Leggi e rivedi la documentazione di Automation Anywhere

Automation Anywhere Automation 360

Chiudi contenuti

Contenuti

Apri contenuti

Esempi di attivazione del meccanismo di trazione e spinta

  • Aggiornato: 2020/12/09

    Esempi di attivazione del meccanismo di trazione e spinta

    Gli esempi forniti in questo argomento illustrano il trigger pull (link TriggerDemo) e il push (SimpleMessageListenerContainer) che utilizza il pacchetto SDK.

    Esempio di meccanismo di trazione

    Questo esempio è un'estensione del trigger basato su timer (TriggerDemo) e mostra il meccanismo di tiro del grilletto.

    • Un trigger controlla il database (DB) a intervalli regolari e se il valore SQL (DB) fornito da un utente è superiore a 0, viene attivato il trigger basato su timer.
    • Aggiungi il driver di database valido nel gradle di compilazione per eseguire questo esempio.
    Nota: Questa classe è intesa come esempio illustrativo e non deve essere utilizzata nell'ambiente di produzione.
    @BotCommand(commandType = BotCommand.CommandType.Trigger)
    @CommandPkg(label = "JDBC Query Trigger", description = "JDBC Query Trigger", icon = "jdbc.svg", name = "jdbcQueryTrigger")
    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;
    	@TriggerRunnable
    	private Runnable runnable;
    
    	/*
    	 * Starts the trigger.
    	 */
    	@StartListen
    	public void startTrigger(
    			@Idx(index="1", type = AttributeType.TEXT)
    			@Pkg(label = "Provide the database driver class")
    			@NotEmpty
    			String driverClassName,
    			
    			@Idx(index="2", type = AttributeType.TEXT)
    			@Pkg(label = "Provide the Jdbc connection string")
    			@NotEmpty
    			String jdbcUrl,
    			
    			@Idx(index="3", type = AttributeType.TEXT)
    			@Pkg(label = "Provide the user Name")
    			@NotEmpty
    			String userName,
    			
    			@Idx(index="4", type = AttributeType.CREDENTIAL)
    			@Pkg(label = "Provide the password")
    			@NotEmpty
    			SecureString password,
    			
    			@Idx(index="5", type = AttributeType.TEXT)
    			@Pkg(label = "Provide the SQL statement to check the records")
    			@NotEmpty
    			String sqlQuery,
    			
    			@Idx(index = "6", type = AttributeType.NUMBER)
    			@Pkg(label = "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)){
    						runnable.run();
    						return;
    					}
    				} catch (SQLException e) {
    					logger.warn(e.getMessage(),e);
    					logger.warn("Trigger is still running.");
    				}
    				logger.debug("no recorrds found");
    
    			}
    		};
    
    		taskMap.put(this.triggerUid, timerTask);
    		TIMER.schedule(timerTask, interval.longValue(), interval.longValue());
    	}
    
    	/*
    	 * Cancel all the tasks and clear the map.
    	 */
    	@StopAllTriggers
    	public void stopAllTriggers() {
    		taskMap.forEach((k, v) -> {
    			if (v.cancel()) {
    				taskMap.remove(k);
    			}
    		});
    	}
    
    	/*
    	 * Cancel the task and remove from the 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 BotCommandException("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 Runnable getRunnable() {
    		return runnable;
    	}
    
    	public void setRunnable(Runnable runnable) {
    		this.runnable = runnable;
    	}
    }

    Esempio di meccanismo di spinta

    L'esempio seguente mostra come creare un semplice listener di messaggi ActiveMQ (SimpleMessageListenerContainer) per dimostrare il meccanismo di spinta del trigger.

    @BotCommand(commandType = BotCommand.CommandType.Trigger)
    @CommandPkg(label = "JMS Trigger", description = "JMS Trigger", icon = "jms.svg", name = "jmsTrigger")
    public class JMSQueue implements SessionAwareMessageListener {
    
    	// Map storing multiple MessageListenerContainer
    	private static final Map<String, MessageListenerContainer> taskMap = new ConcurrentHashMap<>();
    
    	@TriggerId
    	private String triggerUid;
    	@TriggerRunnable
    	private Runnable runnable;
    	
    	//This method is called by MessageListenerContainer when a message arrives.
    	// Enable the trigger at this point 
    	@Override
    	public void onMessage(javax.jms.Message message, Session session) throws JMSException {
    		runnable.run();
    
    	}
    
    	/*
    	 * Starts the trigger.
    	 * 
    	 * This method is used to setup the trigger, that is setup the MessageListenerContainer and start it.
    	 */
    	@StartListen
    	public void startTrigger(@Idx(index = "1", type = AttributeType.TEXT)
    	@Pkg(label = "Provide the broker URL")
    	@NotEmpty
    	String brokerURL, @Idx(index = "2", type = AttributeType.TEXT)
    	@Pkg(label = "Provide the queue name")
    	@NotEmpty
    	String queueName) {
    		
    		if (taskMap.get(triggerUid) == null) {
    			synchronized (this) {
    				if (taskMap.get(triggerUid) == null) {
    					SimpleMessageListenerContainer messageListenerContainer = new SimpleMessageListenerContainer();
    					messageListenerContainer.setConnectionFactory(new PooledConnectionFactory(brokerURL));
    					messageListenerContainer.setDestinationName(queueName);
    					messageListenerContainer.setMessageListener(this);
    					messageListenerContainer.start();
    					taskMap.put(triggerUid, messageListenerContainer);
    
    				}
    			}
    		}
    
    	}
    
    	/*
    	 * Cancel all the tasks and clear the map.
    	 */
    	@StopAllTriggers
    	public void stopAllTriggers() {
    		taskMap.forEach((k, v) -> {
    			v.stop();
    			taskMap.remove(k);
    		});
    	}
    
    	/*
    	 * Cancel the task and remove from the map
    	 *
    	 * @param triggerUid
    	 */
    	@StopListen
    	public void stopListen(String triggerUid) {
    		taskMap.get(triggerUid).stop();
    		taskMap.remove(triggerUid);
    	}
    
    	public String getTriggerUid() {
    		return triggerUid;
    	}
    
    	public void setTriggerUid(String triggerUid) {
    		this.triggerUid = triggerUid;
    	}
    
    	public Runnable getRunnable() {
    		return runnable;
    	}
    
    	public void setRunnable(Runnable runnable) {
    		this.runnable = runnable;
    	}
    
    }
    Invia feedback