X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.server%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fservices%2Fimpl%2Fruntime%2FAgentServiceImpl.java;h=1f2397a09be8f55f94281a19b6e214c5091f78f4;hb=a9bd656db864f3f648d375deef6833c2f53f29ba;hp=0f127269fbee00d1d671a943fd35133ab8716770;hpb=0f26a1ac2596c4f949973028af21bc0f951b7b7a;p=gpl%2Fargeo-slc.git diff --git a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/runtime/AgentServiceImpl.java b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/runtime/AgentServiceImpl.java index 0f127269f..1f2397a09 100644 --- a/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/runtime/AgentServiceImpl.java +++ b/runtime/org.argeo.slc.server/src/main/java/org/argeo/slc/services/impl/runtime/AgentServiceImpl.java @@ -1,18 +1,33 @@ package org.argeo.slc.services.impl.runtime; +import java.util.ArrayList; +import java.util.List; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.slc.dao.runtime.SlcAgentDescriptorDao; +import org.argeo.slc.runtime.SlcAgent; import org.argeo.slc.runtime.SlcAgentDescriptor; +import org.argeo.slc.runtime.SlcAgentFactory; import org.argeo.slc.services.runtime.AgentService; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.InitializingBean; -public class AgentServiceImpl implements AgentService { +public class AgentServiceImpl implements AgentService, InitializingBean, + DisposableBean { private final static Log log = LogFactory.getLog(AgentServiceImpl.class); private final SlcAgentDescriptorDao slcAgentDescriptorDao; + private final SlcAgentFactory agentFactory; + + private Long pingCycle = 60000l; - public AgentServiceImpl(SlcAgentDescriptorDao slcAgentDescriptorDao) { + private Boolean pingThreadActive = true; + + public AgentServiceImpl(SlcAgentDescriptorDao slcAgentDescriptorDao, + SlcAgentFactory agentFactory) { this.slcAgentDescriptorDao = slcAgentDescriptorDao; + this.agentFactory = agentFactory; } public void register(SlcAgentDescriptor slcAgentDescriptor) { @@ -25,4 +40,49 @@ public class AgentServiceImpl implements AgentService { log.info("Unregistered agent #" + slcAgentDescriptor.getUuid()); } + public void afterPropertiesSet() throws Exception { + if (pingCycle > 0) + new PingThread().start(); + } + + public synchronized void destroy() throws Exception { + pingThreadActive = false; + notifyAll(); + } + + public void setPingCycle(Long pingCycle) { + this.pingCycle = pingCycle; + } + + protected class PingThread extends Thread { + public void run() { + while (pingThreadActive) { + List lst = slcAgentDescriptorDao + .listSlcAgentDescriptors(); + List agentIds = new ArrayList(); + for (SlcAgentDescriptor ad : lst) + agentIds.add(ad.getUuid()); + + if (log.isDebugEnabled()) + log.debug("Ping " + agentIds.size() + " agent."); + for (String agentId : agentIds) { + SlcAgent agent = agentFactory.getAgent(agentId); + if (!agent.ping()) { + log.info("Agent " + agentId + " did not reply to ping," + + " removing its descriptor..."); + slcAgentDescriptorDao.delete(agentId); + } + } + + synchronized (AgentServiceImpl.this) { + try { + AgentServiceImpl.this.wait(pingCycle); + } catch (InterruptedException e) { + // silent + } + } + } + } + + } }