Search in sources :

Example 1 with TriggeredScraperImpl

use of org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScraperImpl in project plc4x by apache.

the class Plc4XConsumer method startTriggered.

private void startTriggered() throws ScraperException {
    ScraperConfiguration configuration = getScraperConfig(validateTags());
    TriggerCollector collector = new TriggerCollectorImpl(plc4XEndpoint.getPlcDriverManager());
    TriggeredScraperImpl scraper = new TriggeredScraperImpl(configuration, (job, alias, response) -> {
        try {
            Exchange exchange = plc4XEndpoint.createExchange();
            exchange.getIn().setBody(response);
            getProcessor().process(exchange);
        } catch (Exception e) {
            getExceptionHandler().handleException(e);
        }
    }, collector);
    scraper.start();
    collector.start();
}
Also used : ScraperConfiguration(org.apache.plc4x.java.scraper.config.ScraperConfiguration) TriggeredScraperImpl(org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScraperImpl) Exchange(org.apache.camel.Exchange) TriggerCollector(org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollector) TriggerCollectorImpl(org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollectorImpl) ScraperException(org.apache.plc4x.java.scraper.exception.ScraperException) PlcIncompatibleDatatypeException(org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException)

Example 2 with TriggeredScraperImpl

use of org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScraperImpl in project plc4x by apache.

the class TriggeredScraperRunnerModbus method main.

/**
 * testing of TriggeredScraper vs real device (Modbus)
 */
public static void main(String[] args) throws IOException, ScraperException {
    ScraperConfiguration configuration = ScraperConfiguration.fromFile("plc4j/utils/scraper/src/test/resources/example_triggered_scraper_modbus.yml", ScraperConfigurationTriggeredImpl.class);
    PlcDriverManager plcDriverManager = new PooledPlcDriverManager();
    TriggeredScraperImpl scraper = new TriggeredScraperImpl(configuration, plcDriverManager, (j, a, m) -> {
        LOGGER.info("Results from {}/{}: {}", j, a, m);
        for (Map.Entry<String, Object> entry : m.entrySet()) {
            for (Object object : (List<Object>) entry.getValue()) {
                LOGGER.info("{}", object);
            }
        }
    }, new TriggerCollectorImpl(plcDriverManager));
    scraper.start();
}
Also used : ScraperConfiguration(org.apache.plc4x.java.scraper.config.ScraperConfiguration) TriggeredScraperImpl(org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScraperImpl) List(java.util.List) TriggerCollectorImpl(org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollectorImpl) PlcDriverManager(org.apache.plc4x.java.PlcDriverManager) PooledPlcDriverManager(org.apache.plc4x.java.utils.connectionpool.PooledPlcDriverManager) Map(java.util.Map) PooledPlcDriverManager(org.apache.plc4x.java.utils.connectionpool.PooledPlcDriverManager)

Example 3 with TriggeredScraperImpl

use of org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScraperImpl in project plc4x by apache.

the class Plc4xSourceTask method start.

@Override
public void start(Map<String, String> props) {
    AbstractConfig config = new AbstractConfig(CONFIG_DEF, props);
    String connectionName = config.getString(Constants.CONNECTION_NAME_CONFIG);
    String plc4xConnectionString = config.getString(Constants.CONNECTION_STRING_CONFIG);
    pollReturnInterval = config.getInt(Constants.KAFKA_POLL_RETURN_CONFIG);
    Integer bufferSize = config.getInt(Constants.BUFFER_SIZE_CONFIG);
    Map<String, String> topics = new HashMap<>();
    // Create a buffer with a capacity of BUFFER_SIZE_CONFIG elements which schedules access in a fair way.
    buffer = new ArrayBlockingQueue<>(bufferSize, true);
    ScraperConfigurationTriggeredImplBuilder builder = new ScraperConfigurationTriggeredImplBuilder();
    builder.addSource(connectionName, plc4xConnectionString);
    List<String> jobConfigs = config.getList(Constants.QUERIES_CONFIG);
    for (String jobConfig : jobConfigs) {
        String[] jobConfigSegments = jobConfig.split("\\|");
        if (jobConfigSegments.length < 4) {
            log.warn("Error in job configuration '{}'. " + "The configuration expects at least 4 segments: " + "{job-name}|{topic}|{rate}(|{field-alias}#{field-address})+", jobConfig);
            continue;
        }
        String jobName = jobConfigSegments[0];
        String topic = jobConfigSegments[1];
        Integer rate = Integer.valueOf(jobConfigSegments[2]);
        JobConfigurationTriggeredImplBuilder jobBuilder = builder.job(jobName, String.format("(SCHEDULED,%s)", rate)).source(connectionName);
        for (int i = 3; i < jobConfigSegments.length; i++) {
            String[] fieldSegments = jobConfigSegments[i].split("#");
            if (fieldSegments.length != 2) {
                log.warn("Error in job configuration '{}'. " + "The field segment expects a format {field-alias}#{field-address}, but got '%s'", jobName, jobConfigSegments[i]);
                continue;
            }
            String fieldAlias = fieldSegments[0];
            String fieldAddress = fieldSegments[1];
            jobBuilder.field(fieldAlias, fieldAddress);
            topics.put(jobName, topic);
        }
        jobBuilder.build();
    }
    ScraperConfigurationTriggeredImpl scraperConfig = builder.build();
    try {
        PlcDriverManager plcDriverManager = new PooledPlcDriverManager();
        TriggerCollector triggerCollector = new TriggerCollectorImpl(plcDriverManager);
        scraper = new TriggeredScraperImpl(scraperConfig, (jobName, sourceName, results) -> {
            try {
                Long timestamp = System.currentTimeMillis();
                Map<String, String> sourcePartition = new HashMap<>();
                sourcePartition.put("sourceName", sourceName);
                sourcePartition.put("jobName", jobName);
                Map<String, Long> sourceOffset = Collections.singletonMap("offset", timestamp);
                String topic = topics.get(jobName);
                // Prepare the key structure.
                Struct key = new Struct(KEY_SCHEMA).put(Constants.SOURCE_NAME_FIELD, sourceName).put(Constants.JOB_NAME_FIELD, jobName);
                // Build the Schema for the result struct.
                SchemaBuilder fieldSchemaBuilder = SchemaBuilder.struct().name("org.apache.plc4x.kafka.schema.Field");
                for (Map.Entry<String, Object> result : results.entrySet()) {
                    // Get field-name and -value from the results.
                    String fieldName = result.getKey();
                    Object fieldValue = result.getValue();
                    // Get the schema for the given value type.
                    Schema valueSchema = getSchema(fieldValue);
                    // Add the schema description for the current field.
                    fieldSchemaBuilder.field(fieldName, valueSchema);
                }
                Schema fieldSchema = fieldSchemaBuilder.build();
                Schema recordSchema = SchemaBuilder.struct().name("org.apache.plc4x.kafka.schema.JobResult").doc("PLC Job result. This contains all of the received PLCValues as well as a recieved timestamp").field(Constants.FIELDS_CONFIG, fieldSchema).field(Constants.TIMESTAMP_CONFIG, Schema.INT64_SCHEMA).field(Constants.EXPIRES_CONFIG, Schema.OPTIONAL_INT64_SCHEMA).build();
                // Build the struct itself.
                Struct fieldStruct = new Struct(fieldSchema);
                for (Map.Entry<String, Object> result : results.entrySet()) {
                    // Get field-name and -value from the results.
                    String fieldName = result.getKey();
                    Object fieldValue = result.getValue();
                    if (fieldSchema.field(fieldName).schema().type() == Schema.Type.ARRAY) {
                        fieldStruct.put(fieldName, ((List) fieldValue).stream().map(p -> ((PlcValue) p).getObject()).collect(Collectors.toList()));
                    } else {
                        fieldStruct.put(fieldName, fieldValue);
                    }
                }
                Struct recordStruct = new Struct(recordSchema).put(Constants.FIELDS_CONFIG, fieldStruct).put(Constants.TIMESTAMP_CONFIG, timestamp);
                // Prepare the source-record element.
                SourceRecord sourceRecord = new SourceRecord(sourcePartition, sourceOffset, topic, KEY_SCHEMA, key, recordSchema, recordStruct);
                // Add the new source-record to the buffer.
                buffer.add(sourceRecord);
            } catch (Exception e) {
                log.error("Error while parsing returned values", e);
            }
        }, triggerCollector);
        scraper.start();
        triggerCollector.start();
    } catch (ScraperException e) {
        log.error("Error starting the scraper", e);
    }
}
Also used : PlcDriverManager(org.apache.plc4x.java.PlcDriverManager) Date(org.apache.kafka.connect.data.Date) java.util(java.util) ScraperConfigurationTriggeredImpl(org.apache.plc4x.java.scraper.config.triggeredscraper.ScraperConfigurationTriggeredImpl) LoggerFactory(org.slf4j.LoggerFactory) LocalDateTime(java.time.LocalDateTime) PlcValue(org.apache.plc4x.java.api.value.PlcValue) JobConfigurationTriggeredImplBuilder(org.apache.plc4x.java.scraper.config.triggeredscraper.JobConfigurationTriggeredImplBuilder) ScraperException(org.apache.plc4x.java.scraper.exception.ScraperException) SecureRandom(java.security.SecureRandom) BigDecimal(java.math.BigDecimal) ScraperConfigurationTriggeredImplBuilder(org.apache.plc4x.java.scraper.config.triggeredscraper.ScraperConfigurationTriggeredImplBuilder) LocalTime(java.time.LocalTime) BigInteger(java.math.BigInteger) org.apache.kafka.connect.data(org.apache.kafka.connect.data) PooledPlcDriverManager(org.apache.plc4x.java.utils.connectionpool.PooledPlcDriverManager) ConfigDef(org.apache.kafka.common.config.ConfigDef) VersionUtil(org.apache.plc4x.kafka.util.VersionUtil) Logger(org.slf4j.Logger) java.util.concurrent(java.util.concurrent) SourceRecord(org.apache.kafka.connect.source.SourceRecord) Collectors(java.util.stream.Collectors) TriggerCollectorImpl(org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollectorImpl) TimeUnit(java.util.concurrent.TimeUnit) Constants(org.apache.plc4x.kafka.config.Constants) AbstractConfig(org.apache.kafka.common.config.AbstractConfig) ConnectException(org.apache.kafka.connect.errors.ConnectException) LocalDate(java.time.LocalDate) TriggeredScraperImpl(org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScraperImpl) TriggerCollector(org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollector) SourceTask(org.apache.kafka.connect.source.SourceTask) TriggerCollector(org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollector) SourceRecord(org.apache.kafka.connect.source.SourceRecord) TriggeredScraperImpl(org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScraperImpl) PlcDriverManager(org.apache.plc4x.java.PlcDriverManager) PooledPlcDriverManager(org.apache.plc4x.java.utils.connectionpool.PooledPlcDriverManager) ScraperException(org.apache.plc4x.java.scraper.exception.ScraperException) ScraperException(org.apache.plc4x.java.scraper.exception.ScraperException) ConnectException(org.apache.kafka.connect.errors.ConnectException) PooledPlcDriverManager(org.apache.plc4x.java.utils.connectionpool.PooledPlcDriverManager) BigInteger(java.math.BigInteger) AbstractConfig(org.apache.kafka.common.config.AbstractConfig) PlcValue(org.apache.plc4x.java.api.value.PlcValue) ScraperConfigurationTriggeredImplBuilder(org.apache.plc4x.java.scraper.config.triggeredscraper.ScraperConfigurationTriggeredImplBuilder) ScraperConfigurationTriggeredImpl(org.apache.plc4x.java.scraper.config.triggeredscraper.ScraperConfigurationTriggeredImpl) JobConfigurationTriggeredImplBuilder(org.apache.plc4x.java.scraper.config.triggeredscraper.JobConfigurationTriggeredImplBuilder) TriggerCollectorImpl(org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollectorImpl)

Example 4 with TriggeredScraperImpl

use of org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScraperImpl in project plc4x by apache.

the class TriggeredScraperRunner method main.

/**
 * testing of TriggeredScraper vs real device
 */
public static void main(String[] args) throws IOException, ScraperException {
    ScraperConfiguration configuration = ScraperConfiguration.fromFile("plc4j/utils/scraper/src/test/resources/example_triggered_scraper.yml", ScraperConfigurationTriggeredImpl.class);
    PlcDriverManager plcDriverManager = new PooledPlcDriverManager();
    TriggerCollector triggerCollector = new TriggerCollectorImpl(plcDriverManager);
    TriggeredScraperImpl scraper = new TriggeredScraperImpl(configuration, (j, a, m) -> LOGGER.info("Results from {}/{}: {}", j, a, m), triggerCollector);
    scraper.start();
    triggerCollector.start();
}
Also used : ScraperConfiguration(org.apache.plc4x.java.scraper.config.ScraperConfiguration) TriggeredScraperImpl(org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScraperImpl) TriggerCollector(org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollector) TriggerCollectorImpl(org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollectorImpl) PlcDriverManager(org.apache.plc4x.java.PlcDriverManager) PooledPlcDriverManager(org.apache.plc4x.java.utils.connectionpool.PooledPlcDriverManager) PooledPlcDriverManager(org.apache.plc4x.java.utils.connectionpool.PooledPlcDriverManager)

Aggregations

TriggeredScraperImpl (org.apache.plc4x.java.scraper.triggeredscraper.TriggeredScraperImpl)4 TriggerCollectorImpl (org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollectorImpl)4 PlcDriverManager (org.apache.plc4x.java.PlcDriverManager)3 ScraperConfiguration (org.apache.plc4x.java.scraper.config.ScraperConfiguration)3 TriggerCollector (org.apache.plc4x.java.scraper.triggeredscraper.triggerhandler.collector.TriggerCollector)3 PooledPlcDriverManager (org.apache.plc4x.java.utils.connectionpool.PooledPlcDriverManager)3 ScraperException (org.apache.plc4x.java.scraper.exception.ScraperException)2 BigDecimal (java.math.BigDecimal)1 BigInteger (java.math.BigInteger)1 SecureRandom (java.security.SecureRandom)1 LocalDate (java.time.LocalDate)1 LocalDateTime (java.time.LocalDateTime)1 LocalTime (java.time.LocalTime)1 java.util (java.util)1 List (java.util.List)1 Map (java.util.Map)1 java.util.concurrent (java.util.concurrent)1 TimeUnit (java.util.concurrent.TimeUnit)1 Collectors (java.util.stream.Collectors)1 Exchange (org.apache.camel.Exchange)1