dnet-core/dnet-core-services/src/main/java/eu/dnetlib/enabling/resultset/ResultSetEPRPool.java

138 lines
3.6 KiB
Java

package eu.dnetlib.enabling.resultset;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import javax.annotation.PostConstruct;
import javax.xml.ws.wsaddressing.W3CEndpointReference;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Required;
import eu.dnetlib.enabling.tools.UniqueIdentifierGenerator;
import eu.dnetlib.enabling.tools.UniqueIdentifierGeneratorImpl;
public class ResultSetEPRPool {
private static final Log log = LogFactory.getLog(ResultSetEPRPool.class); // NOPMD by marko on 11/24/08 5:02 PM
static class PreparedResultSet {
private String rsId;
private W3CEndpointReference epr;
public PreparedResultSet(final String rsId, final W3CEndpointReference epr) {
super();
this.rsId = rsId;
this.epr = epr;
}
public String getRsId() {
return rsId;
}
public void setRsId(final String rsId) {
this.rsId = rsId;
}
public W3CEndpointReference getEpr() {
return epr;
}
public void setEpr(final W3CEndpointReference epr) {
this.epr = epr;
}
}
class PoolFiller implements Runnable {
@Override
public void run() {
while (true)
try {
final PreparedResultSet resultSet = prepareResultSet();
pool.put(resultSet);
} catch (final InterruptedException e) {
// eat this exception
log.debug("cannot add resultset to pool", e);
}
}
private PreparedResultSet prepareResultSet() {
final String rsId = idGenerator.generateIdentifier();
return new PreparedResultSet(rsId, createEPR(rsId));
}
private W3CEndpointReference createEPR(final String rsId) {
return getResultSetService().getEprBuilder().getEndpointReference(getResultSetService().getEndpoint(), rsId);
}
}
/**
* resultset service.
*/
private ResultSetServiceImpl resultSetService;
private int capacity = 1000;
private int fillerThreads = 10;
private final BlockingQueue<PreparedResultSet> pool = new LinkedBlockingQueue<PreparedResultSet>(capacity);
/**
* identifier generator.
*/
private UniqueIdentifierGenerator idGenerator = new UniqueIdentifierGeneratorImpl("rs-");
@PostConstruct
public void init() {
log.info("-------<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>> Starting fill threads");
for (int i = 0; i < fillerThreads; i++)
startFillter();
}
protected void startFillter() {
final Thread filler = new Thread(new PoolFiller());
filler.setDaemon(true);
filler.start();
}
public W3CEndpointReference registerResultSet(final ResultSet resultSet) {
final PreparedResultSet prepared = nextPreparedResultSet();
if (prepared == null) {
log.info("EPR cache is empty, creating EPR in caller thread");
return getResultSetService().getEprBuilder().getEndpointReference(getResultSetService().getEndpoint(), idGenerator.generateIdentifier());
}
getResultSetService().getResultsetRegistry().addResultSet(resultSet, prepared.getRsId());
return prepared.getEpr();
}
private PreparedResultSet nextPreparedResultSet() {
log.info(">>>> fetching a prepared resultset from the pool");
return pool.poll();
}
public int getCapacity() {
return capacity;
}
public void setCapacity(int capacity) {
this.capacity = capacity;
}
public UniqueIdentifierGenerator getIdGenerator() {
return idGenerator;
}
public void setIdGenerator(UniqueIdentifierGenerator idGenerator) {
this.idGenerator = idGenerator;
}
public ResultSetServiceImpl getResultSetService() {
return resultSetService;
}
@Required
public void setResultSetService(ResultSetServiceImpl resultSetService) {
this.resultSetService = resultSetService;
}
}