/** * Copyright (C) 2008 Progress Software, Inc. All rights reserved. * http://fusesource.com * * The software in this package is published under the terms of the AGPL license * a copy of which has been included with this distribution in the license.txt file. */ package org.fusesource.cloudmix.agent; import java.net.ConnectException; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.Callable; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; /** * A polling spring bean which can poll any of the available agents such as * {@link InstallerAgent} * * @version $Revision: 1.1 $ */ public class AgentPoller implements InitializingBean, DisposableBean { private static final transient Log LOG = LogFactory.getLog(AgentPoller.class); private Callable<Object> agent = new InstallerAgent(); private Timer timer; private long pollingPeriod = 1000L; private long initialPollingDelay = 500L; private long lastConnectWarning = 0; public AgentPoller() { } public AgentPoller(Callable<Object> agent) { this.agent = agent; } public void afterPropertiesSet() throws Exception { start(); } public void start() throws Exception { timer = new Timer(true); timer.scheduleAtFixedRate(new TimerTask() { public void run() { agentPoll(); } }, initialPollingDelay, pollingPeriod); } public void agentPoll() { try { agent.call(); } catch (ConnectException e) { handleConnectException(e); } catch (Exception e) { if (e.getCause() instanceof ConnectException) { handleConnectException((ConnectException) e.getCause()); } else { LOG.warn("Caught exception while polling Agent: ", e); } } catch (Error e) { LOG.warn("Error in poll", e); throw e; } } private void handleConnectException(ConnectException ce) { long now = System.currentTimeMillis(); if (now - lastConnectWarning > 60000) { LOG.warn("polling attempt failed: cloudmix server unavailable"); lastConnectWarning = now; } else { LOG.debug("polling attempt failed: cloudmix server unavailable"); } } public void destroy() throws Exception { timer.cancel(); } // Properties //------------------------------------------------------------------------- public long getPollingPeriod() { return pollingPeriod; } public void setPollingPeriod(long pollingPeriod) { this.pollingPeriod = pollingPeriod; } public long getInitialPollingDelay() { return initialPollingDelay; } public void setInitialPollingDelay(long initialPollingDelay) { this.initialPollingDelay = initialPollingDelay; } public Timer getTimer() { return timer; } public void setTimer(Timer timer) { this.timer = timer; } public Callable<Object> getAgent() { return agent; } public void setAgent(Callable<Object> agent) { this.agent = agent; } public void setInstallerAgent(InstallerAgent agnt) { setAgent(agnt); } }