Skip to content

Commit 8c3ecfd

Browse files
committed
Added possibility to serve from files instead of DB for increased performance
1 parent cde184f commit 8c3ecfd

File tree

5 files changed

+129
-3
lines changed

5 files changed

+129
-3
lines changed

scripts/create_flat_files.py

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
#!/usr/bin/env python
2+
3+
"""
4+
This script produces flatfiles for the weather-server
5+
"""
6+
7+
from datetime import datetime, timedelta
8+
import os
9+
10+
11+
START = datetime(2009, 1, 1)
12+
END = datetime(2011, 12, 31)
13+
LOCATIONS = ["rotterdam"]
14+
15+
START = datetime(2008, 8, 1)
16+
END = datetime(2010, 10, 3)
17+
LOCATIONS = ["minneapolis", "cleveland", "seattle", "san francisco",
18+
"palm springs", "phoenix", "memphis", "miami", "denver"]
19+
20+
BASE_URL = "http://localhost:8080/"\
21+
"WeatherServer/faces/index.xhtml"\
22+
"?weatherDate=%s&weatherLocation=%s"
23+
DIR = "/home/govert/Dropbox/flat_files/%s/%s.%s.xml"
24+
25+
26+
def wget_date(date, location):
27+
date_string = date.strftime("%Y%m%d00")
28+
url = BASE_URL % (date_string, location)
29+
file_name = DIR % (location.replace(" ", "_"), date_string, location)
30+
31+
print
32+
print date, date_string, url, file_name
33+
print 'wget "%s" -O %s' % (url, file_name)
34+
os.system('wget "%s" -O %s' % (url, file_name))
35+
36+
37+
def main():
38+
for location in LOCATIONS:
39+
date = START
40+
while (True):
41+
wget_date(date, location)
42+
43+
date += timedelta(1)
44+
if date > END:
45+
break
46+
47+
48+
if __name__ == "__main__":
49+
main()
50+

src/main/java/org/powertac/weatherserver/Parser.java

+48-1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
import javax.xml.transform.TransformerFactory;
2121
import javax.xml.transform.dom.DOMSource;
2222
import javax.xml.transform.stream.StreamResult;
23+
import java.io.BufferedReader;
24+
import java.io.FileReader;
25+
import java.io.IOException;
2326
import java.io.StringWriter;
2427
import java.util.ArrayList;
2528
import java.util.List;
@@ -65,6 +68,50 @@ public static String parseRestRequest (Map<?, ?> params)
6568
weatherLocation.getLocationName(), weatherDate.getMediumString()));
6669
}
6770

71+
if (properties.getProperty("useFlatFiles").equals("true")) {
72+
String flatFile = parseFile(weatherDate, weatherLocation);
73+
if (flatFile != null) {
74+
return flatFile;
75+
}
76+
}
77+
78+
return queryDB (responseType, weatherDate, weatherLocation);
79+
}
80+
81+
private static String parseFile (WeatherDate weatherDate, Location location)
82+
{
83+
StringBuilder sb = null;
84+
BufferedReader br = null;
85+
try {
86+
String sCurrentLine;
87+
sb = new StringBuilder();
88+
br = new BufferedReader(
89+
new FileReader(properties.getProperty("flatFileLocation")
90+
+ weatherDate.getSmallString() + "."
91+
+ location.getLocationName() + ".xml"));
92+
93+
while ((sCurrentLine = br.readLine()) != null) {
94+
sb.append(sCurrentLine);
95+
}
96+
} catch (IOException ignored) {
97+
sb = null;
98+
} finally {
99+
try {
100+
if (br != null) {
101+
br.close();
102+
}
103+
} catch (IOException ignored) {}
104+
}
105+
106+
if (sb != null) {
107+
return sb.toString();
108+
}
109+
return null;
110+
}
111+
112+
private static String queryDB (String responseType, WeatherDate weatherDate,
113+
Location weatherLocation)
114+
{
68115
List<Weather> reports = new ArrayList<Weather>();
69116
List<Forecast> forecasts = new ArrayList<Forecast>();
70117
List<Energy> energys = new ArrayList<Energy>();
@@ -105,7 +152,7 @@ else if (responseType.equalsIgnoreCase("energy")) {
105152
}
106153

107154
return createXML(reports, forecasts, energys);
108-
}
155+
}
109156

110157
private static String createXML (List<Weather> reports,
111158
List<Forecast> forecasts,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package org.powertac.weatherserver.listeners;
2+
3+
import javax.servlet.ServletContextEvent;
4+
import javax.servlet.ServletContextListener;
5+
import java.util.Set;
6+
7+
8+
public class Initializer implements ServletContextListener
9+
{
10+
public void contextDestroyed (ServletContextEvent e)
11+
{
12+
Set<Thread> threadSet = Thread.getAllStackTraces().keySet();
13+
Thread[] threadArray = threadSet.toArray(new Thread[threadSet.size()]);
14+
for (Thread t: threadArray) {
15+
if (t.getName().contains("Abandoned connection cleanup thread")) {
16+
synchronized(t) {
17+
t.stop(); //don't complain, it works
18+
}
19+
}
20+
}
21+
}
22+
23+
public void contextInitialized (ServletContextEvent e)
24+
{
25+
}
26+
}

src/main/resources/weatherserver.properties.template

+4-1
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,7 @@ reportTable = reports
2828
forecastTable = forecasts
2929
energyTable = energy
3030

31-
showRequestInLog = false
31+
showRequestInLog = false
32+
33+
useFlatFiles = false
34+
flatFileLocation = /tmp/

src/main/webapp/WEB-INF/web.xml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
33
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
4-
id="YourProjectName" version="3.0">
4+
id="PowerTAC-WeatherServer" version="3.0">
55
<display-name>WeatherServer</display-name>
66

77
<!-- End Spring -->

0 commit comments

Comments
 (0)