View Javadoc

1   /*
2    * #%L
3    * Bitrepository Monitoring Service
4    * %%
5    * Copyright (C) 2010 - 2012 The State and University Library, The Royal Library and The State Archives, Denmark
6    * %%
7    * This program is free software: you can redistribute it and/or modify
8    * it under the terms of the GNU Lesser General Public License as 
9    * published by the Free Software Foundation, either version 2.1 of the 
10   * License, or (at your option) any later version.
11   * 
12   * This program is distributed in the hope that it will be useful,
13   * but WITHOUT ANY WARRANTY; without even the implied warranty of
14   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15   * GNU General Lesser Public License for more details.
16   * 
17   * You should have received a copy of the GNU General Lesser Public 
18   * License along with this program.  If not, see
19   * <http://www.gnu.org/licenses/lgpl-2.1.html>.
20   * #L%
21   */
22  package org.bitrepository.monitoringservice;
23  
24  import java.util.Map;
25  import javax.jms.JMSException;
26  
27  import org.bitrepository.access.AccessComponentFactory;
28  import org.bitrepository.access.getstatus.GetStatusClient;
29  import org.bitrepository.common.settings.Settings;
30  import org.bitrepository.common.utils.SettingsUtils;
31  import org.bitrepository.monitoringservice.alarm.BasicMonitoringServiceAlerter;
32  import org.bitrepository.monitoringservice.alarm.MonitorAlerter;
33  import org.bitrepository.monitoringservice.collector.StatusCollector;
34  import org.bitrepository.monitoringservice.status.ComponentStatus;
35  import org.bitrepository.monitoringservice.status.ComponentStatusStore;
36  import org.bitrepository.monitoringservice.status.StatusStore;
37  import org.bitrepository.protocol.messagebus.MessageBus;
38  import org.bitrepository.protocol.messagebus.MessageBusManager;
39  import org.bitrepository.protocol.security.SecurityManager;
40  import org.bitrepository.service.LifeCycledService;
41  import org.bitrepository.settings.referencesettings.AlarmLevel;
42  import org.slf4j.Logger;
43  import org.slf4j.LoggerFactory;
44  
45  /**
46   * The monitoring service.
47   */
48  public class MonitoringService implements LifeCycledService {
49      private final Logger log = LoggerFactory.getLogger(getClass());
50      /** The settings. */
51      private final Settings settings;
52      /** The store of collected statuses */
53      private final StatusStore statusStore;
54      /** The client for getting statuses. */
55      private final GetStatusClient getStatusClient;
56      /** The alerter for sending alarms */
57      private final MonitorAlerter alerter;
58      /** The status collector */
59      private final StatusCollector collector;
60      
61      /**
62       * Constructor.
63       * @param settings The settings.
64       * @param securityManager The security manager.
65       */
66      public MonitoringService(Settings settings, SecurityManager securityManager) {
67          this.settings = settings;
68          SettingsUtils.initialize(settings);
69          MessageBus messageBus = MessageBusManager.getMessageBus(settings, securityManager);
70          statusStore = new ComponentStatusStore(SettingsUtils.getStatusContributorsForCollection());
71          alerter = new BasicMonitoringServiceAlerter(settings, messageBus, AlarmLevel.ERROR, statusStore);
72          getStatusClient = AccessComponentFactory.getInstance().createGetStatusClient(settings, securityManager,
73                  settings.getReferenceSettings().getMonitoringServiceSettings().getID());
74          collector = new StatusCollector(getStatusClient, settings, statusStore, alerter);
75          collector.start();
76      }
77      
78      /**
79       * @return The map of the status for the components.
80       */
81      public Map<String, ComponentStatus> getStatus() {
82          return statusStore.getStatusMap();
83      }
84      
85      @Override
86      public void start() {}
87      
88      /**
89       * @return The maximum number of attempts to retrieve a status from a component before dispatching an alarm.
90       */
91      public int getMaxRetries() {
92          return settings.getReferenceSettings().getMonitoringServiceSettings().getMaxRetries().intValue();
93      } 
94      
95      /**
96       * @return The interval between collecting status from the components.
97       */
98      public long getCollectionInterval() {
99          return settings.getReferenceSettings().getMonitoringServiceSettings().getCollectionInterval();
100     }
101     
102     @Override
103     public void shutdown() {
104         collector.stop();
105         MessageBus messageBus = MessageBusManager.getMessageBus();
106         if ( messageBus != null) {
107             try {
108                 messageBus.close();
109             } catch (JMSException e) {
110                 log.warn("Failed to close message bus cleanly, " + e.getMessage());
111             }
112         }
113     }
114 }