package com.javamonitor.openfire.mbeans; import java.util.concurrent.atomic.AtomicLong; import org.jivesoftware.openfire.interceptor.InterceptorManager; import org.jivesoftware.openfire.interceptor.PacketInterceptor; import org.jivesoftware.openfire.session.Session; import org.xmpp.packet.IQ; import org.xmpp.packet.Message; import org.xmpp.packet.Packet; import org.xmpp.packet.Presence; /** * Counts the amount of stanzas (broken down into distinct types) that have been * processed by this server instance. * * @author Guus der Kinderen, guus.der.kinderen@gmail.com */ public class PacketCounter implements PacketCounterMBean { /** * The intercepter that is used to count individual Packet objects */ private PacketInterceptor interceptor; private final AtomicLong stanza = new AtomicLong(); private final AtomicLong message = new AtomicLong(); private final AtomicLong presence = new AtomicLong(); private final AtomicLong iq = new AtomicLong(); private final AtomicLong iqGet = new AtomicLong(); private final AtomicLong iqSet = new AtomicLong(); private final AtomicLong iqResult = new AtomicLong(); private final AtomicLong iqError = new AtomicLong(); /** * Resets all counters, and starts counting. */ public void start() { // Register a packet listener so that we can track packet traffic. interceptor = new PacketInterceptor() { public void interceptPacket(final Packet packet, final Session session, final boolean incoming, final boolean processed) { if (!processed) { // don't count packets twice! return; } stanza.incrementAndGet(); if (packet instanceof Message) { message.incrementAndGet(); } if (packet instanceof Presence) { presence.incrementAndGet(); } if (packet instanceof IQ) { iq.incrementAndGet(); switch (((IQ) packet).getType()) { case get: iqGet.incrementAndGet(); break; case set: iqSet.incrementAndGet(); break; case result: iqResult.incrementAndGet(); break; case error: iqError.incrementAndGet(); break; } } } }; // reset counters stanza.set(0); message.set(0); presence.set(0); iq.set(0); iqGet.set(0); iqSet.set(0); iqResult.set(0); iqError.set(0); // register listener InterceptorManager.getInstance().addInterceptor(interceptor); } /** * Stops counting. */ public void stop() { InterceptorManager.getInstance().removeInterceptor(interceptor); } /** * @see com.javamonitor.openfire.mbeans.PacketCounterMBean#getIQCount() */ public long getIQCount() { return iq.get(); } /** * @see com.javamonitor.openfire.mbeans.PacketCounterMBean#getIQErrorCount() */ public long getIQErrorCount() { return iqError.get(); } /** * @see com.javamonitor.openfire.mbeans.PacketCounterMBean#getIQGetCount() */ public long getIQGetCount() { return iqGet.get(); } /** * @see com.javamonitor.openfire.mbeans.PacketCounterMBean#getIQResultCount() */ public long getIQResultCount() { return iqResult.get(); } /** * @see com.javamonitor.openfire.mbeans.PacketCounterMBean#getIQSetCount() */ public long getIQSetCount() { return iqSet.get(); } /** * @see com.javamonitor.openfire.mbeans.PacketCounterMBean#getMessageCount() */ public long getMessageCount() { return message.get(); } /** * @see com.javamonitor.openfire.mbeans.PacketCounterMBean#getPresenceCount() */ public long getPresenceCount() { return presence.get(); } /** * @see com.javamonitor.openfire.mbeans.PacketCounterMBean#getStanzaCount() */ public long getStanzaCount() { return stanza.get(); } }