package org.openamq.pool;
import org.apache.mina.common.IoSession;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Holds events for a session that will be processed asynchronously by
* the thread pool in PoolingFilter.
*/
class Job implements Runnable
{
private final int _maxEvents;
private final IoSession _session;
private final java.util.Queue<Event> _eventQueue = new ConcurrentLinkedQueue<Event>();
private final AtomicBoolean _active = new AtomicBoolean();
private final AtomicInteger _refCount = new AtomicInteger();
private final JobCompletionHandler _completionHandler;
Job(IoSession session, JobCompletionHandler completionHandler, int maxEvents)
{
_session = session;
_completionHandler = completionHandler;
_maxEvents = maxEvents;
}
void acquire()
{
_refCount.incrementAndGet();
}
void release()
{
_refCount.decrementAndGet();
}
boolean isReferenced()
{
return _refCount.get() > 0;
}
void add(Event evt)
{
_eventQueue.add(evt);
}
void processAll()
{
//limit the number of events processed in one run
for (int i = 0; i < _maxEvents; i++)
{
Event e = _eventQueue.poll();
if (e == null)
{
break;
}
else
{
e.process(_session);
}
}
}
boolean isComplete()
{
return _eventQueue.peek() == null;
}
boolean activate()
{
return _active.compareAndSet(false, true);
}
void deactivate()
{
_active.set(false);
}
public void run()
{
processAll();
deactivate();
_completionHandler.completed(_session, this);
}
static interface JobCompletionHandler
{
public void completed(IoSession session, Job job);
}
}