/* * Copyright 2008 Glencoe Software, Inc. All rights reserved. * Use is subject to license terms supplied in LICENSE.txt */ package ome.services.sessions.stats; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; import ome.util.messages.InternalMessage; /** * Counter object which increments an internal long by some integer value, * and according to some strategy publishes an {@link InternalMessage} subclass. * * @author Josh Moore, josh at glencoesoftware.com * @since Beta4 */ public abstract class LongCounter implements ApplicationEventPublisherAware { private final Logger log = LoggerFactory.getLogger(getClass()); private ApplicationEventPublisher publisher; private int interval = 0; private long last = 0; private final Object mutex = new Object(); protected long count = 0; public LongCounter(int interval) { this.interval = interval; } public void setApplicationEventPublisher( ApplicationEventPublisher applicationEventPublisher) { this.publisher = applicationEventPublisher; } public void increment(int incr) { synchronized (mutex) { count = count + incr; if (count >= (last+interval)) { last = count; InternalMessage message = message(); try { log.info("Publishing "+ message); publisher.publishEvent(message); } catch (Throwable t) { log.error(message + " produced an error: "+t); } } } } /** * * @return The message. */ protected abstract InternalMessage message(); }