@Override
    public void run() {
        if (LOGGER.isTraceEnabled()) {
            LOGGER.trace("Check condition for task of job {} for connection {}", jobName, connectionAlias);
        }
        if (this.triggerHandler.checkTrigger()) {
            // Does a single fetch only when trigger is valid
            if (LOGGER.isDebugEnabled()) {
                LOGGER.debug("Trigger for job {} and device {} is met ... scraping desired data", jobName, connectionAlias);
            }
            if (LOGGER.isTraceEnabled()) {
                LOGGER.trace("Start new scrape of task of job {} for connection {}", jobName, connectionAlias);
            }
            requestCounter.incrementAndGet();
            StopWatch stopWatch = new StopWatch();
            stopWatch.start();
            PlcConnection connection = null;
            try {
                String info = "";
                if (LOGGER.isTraceEnabled()) {
                    info = String.format("acquiring data collecting connection to (%s,%s)", connectionAlias, jobName);
                    LOGGER.trace("acquiring data collecting connection to ({},{})", connectionAlias, jobName);
                }
                connection = TriggeredScraperImpl.getPlcConnection(connectionManager, connectionString, executorService, requestTimeoutMs, info);
                if (LOGGER.isTraceEnabled()) {
                    LOGGER.trace("Connection to {} established: {}", connectionString, connection);
                }

                PlcReadResponse plcReadResponse;
                try {
                    PlcReadRequest.Builder readRequestBuilder = connection.readRequestBuilder();
                    for (Map.Entry<String, String> entry : tags.entrySet()) {
                        if (LOGGER.isTraceEnabled()) {
                            LOGGER.trace("Requesting: {} -> {}", entry.getKey(), entry.getValue());
                        }
                        readRequestBuilder.addTagAddress(entry.getKey(), entry.getValue());
                    }
                    //build and send request and store result in read response
                    plcReadResponse = readRequestBuilder
                        .build()
                        .execute()
                        .orTimeout(requestTimeoutMs, TimeUnit.MILLISECONDS)
                        .get();
                } catch (ExecutionException e) {
                    // Handle execution exception
                    LOGGER.warn("Execution Exception while reading PLC Response", e);
                    handleException(e);
                    return;
                }

                // Add statistics
                LOGGER.debug("Performing statistics");
                stopWatch.stop();
                latencyStatistics.addValue(stopWatch.getNanoTime());
                failedStatistics.addValue(0.0);
                successCounter.incrementAndGet();
                // Validate response
                validateResponse(plcReadResponse);
                // Handle response (Async)
                CompletableFuture.runAsync(() -> resultHandler.handle(jobName, connectionAlias, TriggeredScraperImpl.convertPlcResponseToMap(plcReadResponse)), executorService);
            } catch (Exception e) {
                LOGGER.warn("Exception during scraping of Job {}, Connection-Alias {}: Error-message: {} - for stack-trace change logging to DEBUG", jobName, connectionAlias, e.getCause().getMessage());
                handleException(e);
            } finally {
                if (connection != null) {
                    try {
                        connection.close();
                    } catch (Exception e) {
                        LOGGER.warn("Error on closing connection", e);
                    }
                }
            }
        }
    }
performs the triggered task from a job for one device based on the TriggerHandler as defined in Configuration
plc4j/tools/scraper/src/main/java/org/apache/plc4x/java/scraper/triggeredscraper/TriggeredScraperTask.java