package org.openamq.client.protocol;
import org.apache.mina.common.IoFilterAdapter;
import org.apache.mina.common.IoSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* A MINA filter that monitors the numbers of messages pending to be sent by MINA. It outputs a message
* when a threshold has been exceeded, and has a frequency configuration so that messages are not output
* too often.
*
*/
public class ProtocolBufferMonitorFilter extends IoFilterAdapter
{
private static final Logger _logger = LoggerFactory.getLogger(ProtocolBufferMonitorFilter.class);
public static long DEFAULT_FREQUENCY = 5000;
public static int DEFAULT_THRESHOLD = 3000;
private int _bufferedMessages = 0;
private int _threshold;
private long _lastMessageOutputTime;
private long _outputFrequencyInMillis;
public ProtocolBufferMonitorFilter()
{
_threshold = DEFAULT_THRESHOLD;
_outputFrequencyInMillis = DEFAULT_FREQUENCY;
}
public ProtocolBufferMonitorFilter(int threshold, long frequency)
{
_threshold = threshold;
_outputFrequencyInMillis = frequency;
}
public void messageReceived( NextFilter nextFilter, IoSession session, Object message ) throws Exception
{
_bufferedMessages++;
if (_bufferedMessages > _threshold)
{
long now = System.currentTimeMillis();
if ((now - _lastMessageOutputTime) > _outputFrequencyInMillis)
{
_logger.warn("Protocol message buffer exceeded threshold of " + _threshold + ". Current backlog: " +
_bufferedMessages);
_lastMessageOutputTime = now;
}
}
nextFilter.messageReceived(session, message);
}
public void messageSent( NextFilter nextFilter, IoSession session, Object message ) throws Exception
{
_bufferedMessages--;
nextFilter.messageSent(session, message);
}
public int getBufferedMessages()
{
return _bufferedMessages;
}
public int getThreshold()
{
return _threshold;
}
public void setThreshold(int threshold)
{
_threshold = threshold;
}
public long getOutputFrequencyInMillis()
{
return _outputFrequencyInMillis;
}
public void setOutputFrequencyInMillis(long outputFrequencyInMillis)
{
_outputFrequencyInMillis = outputFrequencyInMillis;
}
public long getLastMessageOutputTime()
{
return _lastMessageOutputTime;
}
}