package eu.dnetlib.akka;

import org.springframework.beans.factory.FactoryBean;

import akka.actor.ActorRef;
import akka.dispatch.Dispatchers;
import akka.dispatch.MessageDispatcher;
import akka.util.Duration;
import akka.util.DurationInt;

/**
 * Create a dispatcher that binds an actor to a single thread. You can configure the mailbox capacity and push timeout.
 * 
 * @author marko
 * 
 */
public class ThreadDispatcherFactory implements FactoryBean {

	private int mailboxCapacity = -1;
	private int pushTimeout = 10000;

	public class Builder implements DispatcherBuilder {

		@Override
		public MessageDispatcher create(final ActorRef ref) {
			final Duration duration = new DurationInt(pushTimeout).millis();

			if (mailboxCapacity < 0)
				return Dispatchers.newThreadBasedDispatcher(ref);
			else
				return Dispatchers.newThreadBasedDispatcher(ref, mailboxCapacity, duration);
		}
	}

	@Override
	public Object getObject() throws Exception {
		return new Builder();
	}

	@Override
	public Class<?> getObjectType() {
		return null;
	}

	@Override
	public boolean isSingleton() {
		return false;
	}

	public int getMailboxCapacity() {
		return mailboxCapacity;
	}

	public void setMailboxCapacity(final int mailboxCapacity) {
		this.mailboxCapacity = mailboxCapacity;
	}

	public int getPushTimeout() {
		return pushTimeout;
	}

	public void setPushTimeout(final int pushTimeout) {
		this.pushTimeout = pushTimeout;
	}

}
