Search in sources :

Example 1 with ListFlowFileRequest

use of org.apache.nifi.controller.queue.ListFlowFileRequest in project nifi by apache.

the class StandardFlowFileQueue method listFlowFiles.

@Override
public ListFlowFileStatus listFlowFiles(final String requestIdentifier, final int maxResults) {
    // purge any old requests from the map just to keep it clean. But if there are very few requests, which is usually the case, then don't bother
    if (listRequestMap.size() > 10) {
        final List<String> toDrop = new ArrayList<>();
        for (final Map.Entry<String, ListFlowFileRequest> entry : listRequestMap.entrySet()) {
            final ListFlowFileRequest request = entry.getValue();
            final boolean completed = request.getState() == ListFlowFileState.COMPLETE || request.getState() == ListFlowFileState.FAILURE;
            if (completed && System.currentTimeMillis() - request.getLastUpdated() > TimeUnit.MINUTES.toMillis(5L)) {
                toDrop.add(entry.getKey());
            }
        }
        for (final String requestId : toDrop) {
            listRequestMap.remove(requestId);
        }
    }
    // numSteps = 1 for each swap location + 1 for active queue + 1 for swap queue.
    final ListFlowFileRequest listRequest = new ListFlowFileRequest(requestIdentifier, maxResults, size());
    final Thread t = new Thread(new Runnable() {

        @Override
        public void run() {
            int position = 0;
            int resultCount = 0;
            final List<FlowFileSummary> summaries = new ArrayList<>();
            // Create an ArrayList that contains all of the contents of the active queue.
            // We do this so that we don't have to hold the lock any longer than absolutely necessary.
            // We cannot simply pull the first 'maxResults' records from the queue, however, because the
            // Iterator provided by PriorityQueue does not return records in order. So we would have to either
            // use a writeLock and 'pop' the first 'maxResults' records off the queue or use a read lock and
            // do a shallow copy of the queue. The shallow copy is generally quicker because it doesn't have to do
            // the sorting to put the records back. So even though this has an expensive of Java Heap to create the
            // extra collection, we are making this trade-off to avoid locking the queue any longer than required.
            final List<FlowFileRecord> allFlowFiles;
            final Prioritizer prioritizer;
            readLock.lock();
            try {
                logger.debug("{} Acquired lock to perform listing of FlowFiles", StandardFlowFileQueue.this);
                allFlowFiles = new ArrayList<>(activeQueue);
                prioritizer = new Prioritizer(StandardFlowFileQueue.this.priorities);
            } finally {
                readLock.unlock("List FlowFiles");
            }
            listRequest.setState(ListFlowFileState.CALCULATING_LIST);
            // sort the FlowFileRecords so that we have the list in the same order as on the queue.
            Collections.sort(allFlowFiles, prioritizer);
            for (final FlowFileRecord flowFile : allFlowFiles) {
                summaries.add(summarize(flowFile, ++position));
                if (summaries.size() >= maxResults) {
                    break;
                }
            }
            logger.debug("{} Finished listing FlowFiles for active queue with a total of {} results", StandardFlowFileQueue.this, resultCount);
            listRequest.setFlowFileSummaries(summaries);
            listRequest.setState(ListFlowFileState.COMPLETE);
        }
    }, "List FlowFiles for Connection " + getIdentifier());
    t.setDaemon(true);
    t.start();
    listRequestMap.put(requestIdentifier, listRequest);
    return listRequest;
}
Also used : ArrayList(java.util.ArrayList) ListFlowFileRequest(org.apache.nifi.controller.queue.ListFlowFileRequest) FlowFilePrioritizer(org.apache.nifi.flowfile.FlowFilePrioritizer) List(java.util.List) ArrayList(java.util.ArrayList) FlowFileRecord(org.apache.nifi.controller.repository.FlowFileRecord) Map(java.util.Map) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) ConcurrentMap(java.util.concurrent.ConcurrentMap)

Example 2 with ListFlowFileRequest

use of org.apache.nifi.controller.queue.ListFlowFileRequest in project nifi by apache.

the class StandardFlowFileQueue method cancelListFlowFileRequest.

@Override
public ListFlowFileStatus cancelListFlowFileRequest(final String requestIdentifier) {
    logger.info("Canceling ListFlowFile Request with ID {}", requestIdentifier);
    final ListFlowFileRequest request = listRequestMap.remove(requestIdentifier);
    if (request != null) {
        request.cancel();
    }
    return request;
}
Also used : ListFlowFileRequest(org.apache.nifi.controller.queue.ListFlowFileRequest)

Aggregations

ListFlowFileRequest (org.apache.nifi.controller.queue.ListFlowFileRequest)2 ArrayList (java.util.ArrayList)1 List (java.util.List)1 Map (java.util.Map)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 ConcurrentMap (java.util.concurrent.ConcurrentMap)1 FlowFileRecord (org.apache.nifi.controller.repository.FlowFileRecord)1 FlowFilePrioritizer (org.apache.nifi.flowfile.FlowFilePrioritizer)1