/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.runtime.core.internal.streaming.object.iterator;
import org.mule.runtime.core.util.queue.Queue;
import java.io.IOException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Implementation of {@link Producer} to stream the contents of a {@link org.mule.runtime.core.util.queue.Queue} A polling timeout
* value might be specified, otherwise the default value of 5000 milliseconds will be assumed
*/
public class QueueProducer<T> implements Producer<T> {
private static final Logger logger = LoggerFactory.getLogger(QueueProducer.class);
private static final long DEFAULT_TIMEOUT_VALUE = 5000;
private Queue queue;
private int size;
private long timeout;
/**
* Creates an instance with 5000 milliseconds as the default polling value
*
* @param queue the queue to stream from
*/
public QueueProducer(Queue queue) {
this(queue, DEFAULT_TIMEOUT_VALUE);
}
public QueueProducer(Queue queue, long timeout) {
if (queue == null) {
throw new IllegalArgumentException("Cannot make a producer out of a null queue");
}
this.queue = queue;
this.size = queue.size();
this.timeout = timeout;
}
/**
* {@inheritDoc} This implementation will poll from the queue once and will return the obtained item. If the producer is closed
* or if the queue times out while polling, then <code>null</code> is returned. If the poll method throws
* {@link InterruptedException} then <code>null</code> is returned as well
*/
@Override
@SuppressWarnings("unchecked")
public T produce() {
if (this.queue == null) {
return null;
}
T item = null;
try {
item = (T) this.queue.poll(this.timeout);
} catch (InterruptedException e) {
logger.warn("Thread interrupted while polling in producer. Will return an empty list", e);
}
return item;
}
@Override
public void close() throws IOException {
this.queue = null;
}
@Override
public int getSize() {
return this.size;
}
}