package example; import java.util.logging.Level; import java.util.logging.Logger; public class PeriodicTask implements PeriodicTaskMBean, javax.resource.spi.work.Work { static protected final Logger log = Logger.getLogger(PeriodicTask.class.getName()); private long _estimatedAverageTime = 5000; private boolean _isActive = false; private long _lastActiveTime = -1; private long _totalActiveCount = 0; private long _totalActiveTime = 0; public PeriodicTask() { } /** * {@inheritDoc} */ public void setEstimatedAverageTime(long estimatedAverageTime) { _estimatedAverageTime = estimatedAverageTime; } /** * {@inheritDoc} */ public long getEstimatedAverageTime() { return _estimatedAverageTime; } public void init() throws Exception { } /** * {@inheritDoc} */ public boolean isActive() { synchronized (this) { return _isActive == true; } } /** * {@inheritDoc} */ public long getEstimatedTimeRemaining() { synchronized (this) { if (_isActive) { long now = System.currentTimeMillis(); long activeTime = now - _lastActiveTime; long estimate = getAverageActiveTime() - activeTime; if (estimate < 0) return 1000; else return estimate; } else return 0; } } /** * {@inheritDoc} */ public long getLastActiveTime() { return _lastActiveTime; } /** * {@inheritDoc} */ public long getTotalActiveCount() { return _totalActiveCount; } /** * {@inheritDoc} */ public long getTotalActiveTime() { return _totalActiveTime; } /** * {@inheritDoc} */ public long getAverageActiveTime() { synchronized (this) { long count = _isActive ? _totalActiveCount -1 : _totalActiveCount; if (count < 1) return _estimatedAverageTime; else return _totalActiveTime / count; } } /** * {@inheritDoc} * * Various statistical information is collected and maintained by this method, * the actual task is performed by the performTask() method. */ public void run() { synchronized (this) { if (_isActive == true) return; _isActive = true; _lastActiveTime = System.currentTimeMillis(); _totalActiveCount++; } try { log.fine("performing task"); performTask(); log.fine("done performing task"); } catch (Exception ex) { log.log(Level.WARNING,"task failed",ex); } finally { synchronized (this) { _totalActiveTime += (System.currentTimeMillis() - _lastActiveTime); _isActive = false; } } } protected void performTask() throws Exception { // for the purposes of this tutorial, sleep for 10 seconds // to imitate a task that takes 10 seconds to perform Thread.sleep(10 * 1000L); } /** * Required implementation of javax.resource.spi.work.Work.release() */ public void release() { } }