Change header template for a new version
[jabaws.git] / webservices / compbio / stat / servlet / StatisticCollector.java
1 /* Copyright (c) 2011 Peter Troshin\r
2  *  \r
3  *  JAva Bioinformatics Analysis Web Services (JABAWS) @version: 2.0     \r
4  * \r
5  *  This library is free software; you can redistribute it and/or modify it under the terms of the\r
6  *  Apache License version 2 as published by the Apache Software Foundation\r
7  * \r
8  *  This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without\r
9  *  even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Apache \r
10  *  License for more details.\r
11  * \r
12  *  A copy of the license is in apache_license.txt. It is also available here:\r
13  * @see: http://www.apache.org/licenses/LICENSE-2.0.txt\r
14  * \r
15  * Any republication or derived work distributed in source code form\r
16  * must include this copyright and license notice.\r
17  */\r
18 package compbio.stat.servlet;\r
19 \r
20 import java.util.concurrent.Executors;\r
21 import java.util.concurrent.ScheduledExecutorService;\r
22 import java.util.concurrent.ScheduledFuture;\r
23 import java.util.concurrent.TimeUnit;\r
24 \r
25 import javax.servlet.ServletContextEvent;\r
26 import javax.servlet.ServletContextListener;\r
27 \r
28 import org.apache.log4j.Logger;\r
29 \r
30 import compbio.engine.conf.PropertyHelperManager;\r
31 import compbio.stat.collector.ExecutionStatCollector;\r
32 import compbio.stat.collector.StatDB;\r
33 import compbio.util.PropertyHelper;\r
34 import compbio.util.Util;\r
35 \r
36 public class StatisticCollector implements ServletContextListener {\r
37 \r
38         static PropertyHelper ph = PropertyHelperManager.getPropertyHelper();\r
39 \r
40         private final Logger log = Logger.getLogger(StatisticCollector.class);\r
41 \r
42         private ScheduledFuture<?> localcf;\r
43         private ScheduledFuture<?> clustercf;\r
44         private ScheduledExecutorService executor;\r
45 \r
46         @Override\r
47         public void contextDestroyed(ServletContextEvent arg0) {\r
48                 try {\r
49                         if (localcf != null) {\r
50                                 localcf.cancel(true);\r
51                         }\r
52                         if (clustercf != null) {\r
53                                 clustercf.cancel(true);\r
54                         }\r
55                         executor.shutdown();\r
56                         executor.awaitTermination(3, TimeUnit.SECONDS);\r
57                 } catch (InterruptedException e) {\r
58                         log.warn(e.getMessage(), e);\r
59                 } finally {\r
60                         StatDB.shutdownDBServer();\r
61                         executor.shutdownNow();\r
62                 }\r
63         }\r
64 \r
65         @Override\r
66         public void contextInitialized(ServletContextEvent arg0) {\r
67                 String clusterWorkDir = getClusterJobDir();\r
68                 int clusterMaxRuntime = getClusterJobTimeOut();\r
69 \r
70                 int localMaxRuntime = getLocalJobTimeOut();\r
71                 String localWorkDir = compbio.engine.client.Util\r
72                                 .convertToAbsolute(getLocalJobDir());\r
73 \r
74                 log.info("Initializing statistics collector");\r
75                 executor = Executors.newScheduledThreadPool(2);\r
76 \r
77                 if (collectClusterStats()) {\r
78 \r
79                         ExecutionStatCollector clusterCollector = new ExecutionStatCollector(\r
80                                         clusterWorkDir, clusterMaxRuntime);\r
81                         clustercf = executor.scheduleAtFixedRate(clusterCollector, 60,\r
82                                         24 * 60, TimeUnit.MINUTES);\r
83                         // clustercf = executor.scheduleAtFixedRate(clusterCollector, 15,\r
84                         // 30,\r
85                         // TimeUnit.SECONDS);\r
86                         log.info("Collecting cluster statistics ");\r
87                 } else {\r
88                         log.info("Cluster statistics collector is disabled or not configured! ");\r
89                 }\r
90                 if (collectLocalStats()) {\r
91                         ExecutionStatCollector localCollector = new ExecutionStatCollector(\r
92                                         localWorkDir, localMaxRuntime);\r
93                         // localcf = executor.scheduleAtFixedRate(localCollector, 100, 60,\r
94                         // TimeUnit.SECONDS);\r
95 \r
96                         localcf = executor.scheduleAtFixedRate(localCollector, 10, 24 * 60,\r
97                                         TimeUnit.MINUTES);\r
98                         log.info("Collecting local statistics ");\r
99                 } else {\r
100                         log.info("Local statistics collector is disabled or not configured! ");\r
101                 }\r
102         }\r
103 \r
104         static String getClusterJobDir() {\r
105                 return getStringProperty(ph.getProperty("cluster.tmp.directory"));\r
106         }\r
107 \r
108         static int getClusterJobTimeOut() {\r
109                 int maxRunTime = 24 * 7;\r
110                 String clusterMaxRuntime = ph.getProperty("cluster.stat.maxruntime");\r
111                 if (clusterMaxRuntime != null) {\r
112                         clusterMaxRuntime = clusterMaxRuntime.trim();\r
113                         maxRunTime = Integer.parseInt(clusterMaxRuntime);\r
114                 }\r
115                 return maxRunTime;\r
116         }\r
117 \r
118         static int getLocalJobTimeOut() {\r
119                 int maxRunTime = 24;\r
120                 String localMaxRuntime = ph.getProperty("local.stat.maxruntime");\r
121                 if (localMaxRuntime != null) {\r
122                         localMaxRuntime = localMaxRuntime.trim();\r
123                         maxRunTime = Integer.parseInt(localMaxRuntime);\r
124                 }\r
125 \r
126                 return maxRunTime;\r
127         }\r
128 \r
129         static String getLocalJobDir() {\r
130                 return getStringProperty(ph.getProperty("local.tmp.directory"));\r
131         }\r
132 \r
133         private static String getStringProperty(String propName) {\r
134                 if (propName != null) {\r
135                         propName = propName.trim();\r
136                 }\r
137                 return propName;\r
138         }\r
139 \r
140         static boolean collectClusterStats() {\r
141                 return getBooleanProperty(ph\r
142                                 .getProperty("cluster.stat.collector.enable"));\r
143         }\r
144 \r
145         static boolean collectLocalStats() {\r
146                 return getBooleanProperty(ph.getProperty("local.stat.collector.enable"));\r
147         }\r
148 \r
149         private static boolean getBooleanProperty(String propValue) {\r
150                 boolean enabled = false;\r
151                 if (!Util.isEmpty(propValue)) {\r
152                         propValue = propValue.trim();\r
153                         enabled = Boolean.parseBoolean(propValue);\r
154                 }\r
155                 return enabled;\r
156         }\r
157 \r
158 }\r