2 * Copyright (C) 2007-2012 Mathieu Baudier
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 package org
.argeo
.slc
.services
.impl
;
18 import java
.util
.ArrayList
;
19 import java
.util
.List
;
20 import java
.util
.concurrent
.Executor
;
22 import org
.apache
.commons
.logging
.Log
;
23 import org
.apache
.commons
.logging
.LogFactory
;
24 import org
.argeo
.slc
.dao
.runtime
.SlcAgentDescriptorDao
;
25 import org
.argeo
.slc
.runtime
.SlcAgent
;
26 import org
.argeo
.slc
.runtime
.SlcAgentDescriptor
;
27 import org
.argeo
.slc
.runtime
.SlcAgentFactory
;
28 import org
.argeo
.slc
.services
.AgentService
;
29 import org
.springframework
.beans
.factory
.DisposableBean
;
30 import org
.springframework
.beans
.factory
.InitializingBean
;
32 public class AgentServiceImpl
implements AgentService
, InitializingBean
,
34 private final static Log log
= LogFactory
.getLog(AgentServiceImpl
.class);
36 private final SlcAgentDescriptorDao slcAgentDescriptorDao
;
37 private final SlcAgentFactory agentFactory
;
39 private Executor systemExecutor
;
41 private Long pingCycle
= 20000l;
43 private Boolean pingThreadActive
= true;
45 public AgentServiceImpl(SlcAgentDescriptorDao slcAgentDescriptorDao
,
46 SlcAgentFactory agentFactory
) {
47 this.slcAgentDescriptorDao
= slcAgentDescriptorDao
;
48 this.agentFactory
= agentFactory
;
51 public void register(SlcAgentDescriptor slcAgentDescriptor
) {
52 if (slcAgentDescriptorDao
.getAgentDescriptor(slcAgentDescriptor
54 slcAgentDescriptorDao
.create(slcAgentDescriptor
);
55 log
.info("Registered agent #" + slcAgentDescriptor
.getUuid());
58 public void unregister(SlcAgentDescriptor slcAgentDescriptor
) {
59 slcAgentDescriptorDao
.delete(slcAgentDescriptor
);
60 log
.info("Unregistered agent #" + slcAgentDescriptor
.getUuid());
63 public void afterPropertiesSet() throws Exception
{
65 // new PingThread().start();
67 Thread authenticatedThread
= new Thread("SLC Agents Ping") {
69 systemExecutor
.execute(new AgentsPing());
72 authenticatedThread
.start();
77 public synchronized void destroy() throws Exception
{
78 pingThreadActive
= false;
82 public void setPingCycle(Long pingCycle
) {
83 this.pingCycle
= pingCycle
;
86 public void setSystemExecutor(Executor securityService
) {
87 this.systemExecutor
= securityService
;
90 protected class AgentsPing
implements Runnable
{
93 // FIXME: temporary hack so that the ping starts after the server
94 // has been properly started.
96 Thread
.sleep(10 * 1000);
97 } catch (InterruptedException e1
) {
101 log
.info("Start pinging agents.");
102 while (pingThreadActive
) {
103 List
<SlcAgentDescriptor
> lst
= slcAgentDescriptorDao
104 .listSlcAgentDescriptors();
105 List
<String
> agentIds
= new ArrayList
<String
>();
106 for (SlcAgentDescriptor ad
: lst
)
107 agentIds
.add(ad
.getUuid());
109 if (log
.isTraceEnabled())
110 log
.trace("Ping " + agentIds
.size() + " agent(s).");
111 for (String agentId
: agentIds
) {
112 SlcAgent agent
= agentFactory
.getAgent(agentId
);
114 log
.info("Agent " + agentId
+ " did not reply to ping,"
115 + " removing its descriptor...");
116 slcAgentDescriptorDao
.delete(agentId
);
120 lst
= slcAgentDescriptorDao
.listSlcAgentDescriptors();
121 agentIds
= new ArrayList
<String
>();
122 for (SlcAgentDescriptor ad
: lst
)
123 agentIds
.add(ad
.getUuid());
124 agentFactory
.pingAll(agentIds
);
126 synchronized (AgentServiceImpl
.this) {
128 AgentServiceImpl
.this.wait(pingCycle
);
129 } catch (InterruptedException e
) {
134 log
.info("Stopped pinging agents.");