/* * Copyright (C) 2006-2016 DLR, Germany * * All rights reserved * * http://www.rcenvironment.de/ */ package de.rcenvironment.core.component.execution.internal; import java.lang.reflect.UndeclaredThrowableException; import java.util.List; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import de.rcenvironment.core.component.api.BatchedConsoleRowsProcessor; import de.rcenvironment.core.component.execution.api.ConsoleRow; import de.rcenvironment.core.component.execution.api.SingleConsoleRowsProcessor; import de.rcenvironment.core.toolkitbridge.transitional.ConcurrencyUtils; import de.rcenvironment.toolkit.modules.concurrency.api.BatchAggregator; import de.rcenvironment.toolkit.modules.concurrency.api.BatchProcessor; /** * Collects single {@link ConsoleRow}s and forwards them as batches to the provided * {@link BatchedConsoleRowsProcessor}. * * @author Robert Mischke */ public class BatchingConsoleRowsForwarderImpl implements SingleConsoleRowsProcessor { // the maximum number of ConsoleRows to aggregate to a single batch // NOTE: arbitrary value; adjust when useful/necessary private static final int MAX_BATCH_SIZE = 500; // the maximum time a ConsoleRow may be delayed by batch aggregation // NOTE: arbitrary value; adjust when useful/necessary private static final long MAX_BATCH_LATENCY_MSEC = 200; private final BatchAggregator<ConsoleRow> batchAggregator; private final Log log = LogFactory.getLog(getClass()); public BatchingConsoleRowsForwarderImpl(final BatchedConsoleRowsProcessor consoleRowsReceiver) { BatchProcessor<ConsoleRow> batchProcessor = new BatchProcessor<ConsoleRow>() { @Override public void processBatch(List<ConsoleRow> batch) { ConsoleRow[] batchArray = batch.toArray(new ConsoleRow[batch.size()]); // TODO can be disabled if too verbose // log.debug("Sending batch of " + batchArray.length + " console rows"); try { consoleRowsReceiver.processConsoleRows(batchArray); } catch (UndeclaredThrowableException e) { log.error("Could not send console rows to caller.", e); } } }; batchAggregator = ConcurrencyUtils.getFactory().createBatchAggregator(MAX_BATCH_SIZE, MAX_BATCH_LATENCY_MSEC, batchProcessor); } @Override public void onConsoleRow(ConsoleRow consoleRow) { batchAggregator.enqueue(consoleRow); } }