X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;ds=sidebyside;f=runtime%2Forg.argeo.slc.server%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Fservices%2Fimpl%2Fruntime%2FAgentServiceImpl.java;h=525719aa4936acca48690a36d521a9b5705efed5;hb=61cf879a296d5afdb5d0b6aaa7c6bea1eed9e442;hp=a4a67c10e5529d9a96f5098d105cb978be58f8b2;hpb=11a9d0e8d3e9f610d0546463cfaf07ae884cb249;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 a4a67c10e..525719aa4 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,17 +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 { +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) { @@ -19,4 +35,60 @@ public class AgentServiceImpl { log.info("Registered agent #" + slcAgentDescriptor.getUuid()); } + public void unregister(SlcAgentDescriptor slcAgentDescriptor) { + slcAgentDescriptorDao.delete(slcAgentDescriptor); + 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.isTraceEnabled()) + 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); + } + } + + lst = slcAgentDescriptorDao.listSlcAgentDescriptors(); + agentIds = new ArrayList(); + for (SlcAgentDescriptor ad : lst) + agentIds.add(ad.getUuid()); + agentFactory.pingAll(agentIds); + + synchronized (AgentServiceImpl.this) { + try { + AgentServiceImpl.this.wait(pingCycle); + } catch (InterruptedException e) { + // silent + } + } + } + } + + } }