package eu.dnetlib.workflow;

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import com.googlecode.sarasvati.Engine;
import com.googlecode.sarasvati.NodeToken;

/**
 * AsyncJobNode calls the AbstractJobNode.execute method in a separate thread.
 * 
 * @author claudio
 * 
 */
public abstract class AsyncJobNode extends AbstractJobNode {

	private ExecutorService executor = Executors.newCachedThreadPool();

	protected abstract void executeAsync(Engine engine, NodeToken token);

	@Override
	public void execute(final Engine engine, final NodeToken token) {
		executor.submit(new Runnable() {
			@Override
			public void run() {
				executeAsync(engine, token);
			}
		});
	}

	public ExecutorService getExecutor() {
		return executor;
	}

	public void setExecutor(ExecutorService executor) {
		this.executor = executor;
	}

}
