Mercurial > hg > release > thermostat-0.11
changeset 863:39987bc895d4
Make Storage.putPojo() implementations async.
Reviewed-by: neugens
Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2012-December/004825.html
author | Roman Kennke <rkennke@redhat.com> |
---|---|
date | Mon, 17 Dec 2012 16:37:43 +0100 |
parents | 05b6f3969868 |
children | 8e16f9b4ef38 |
files | storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorage.java storage/mongo/src/test/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorageTest.java web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java web/client/src/test/java/com/redhat/thermostat/web/client/internal/WebStorageTest.java |
diffstat | 4 files changed, 61 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorage.java Mon Dec 17 16:36:50 2012 +0100 +++ b/storage/mongo/src/main/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorage.java Mon Dec 17 16:37:43 2012 +0100 @@ -42,6 +42,8 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; import com.mongodb.BasicDBObject; import com.mongodb.DB; @@ -81,7 +83,13 @@ private UUID agentId; + private Executor threadpool; + public MongoStorage(StartupConfiguration conf) { + this(conf, Executors.newCachedThreadPool()); + } + + MongoStorage(StartupConfiguration conf, Executor threadpool) { conn = new MongoConnection(conf); conn.addListener(new ConnectionListener() { @Override @@ -96,6 +104,8 @@ } } }); + + this.threadpool = threadpool; } @Override @@ -131,7 +141,17 @@ } @Override - public void putPojo(Category cat, boolean replace, AgentIdPojo pojo) { + public void putPojo(final Category cat, final boolean replace, final AgentIdPojo pojo) { + threadpool.execute(new Runnable() { + + @Override + public void run() { + putImpl(cat, replace, pojo); + } + }); + } + + private void putImpl(Category cat, boolean replace, AgentIdPojo pojo) { DBCollection coll = getCachedCollection(cat); MongoPojoConverter converter = new MongoPojoConverter(); DBObject toInsert = converter.convertPojoToMongo(pojo);
--- a/storage/mongo/src/test/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorageTest.java Mon Dec 17 16:36:50 2012 +0100 +++ b/storage/mongo/src/test/java/com/redhat/thermostat/storage/mongodb/internal/MongoStorageTest.java Mon Dec 17 16:37:43 2012 +0100 @@ -53,6 +53,7 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; import java.util.UUID; +import java.util.concurrent.Executor; import org.junit.After; import org.junit.Before; @@ -156,7 +157,13 @@ private DBCursor cursor; private MongoStorage makeStorage() { - MongoStorage storage = new MongoStorage(conf); + Executor exec = new Executor() { + @Override + public void execute(Runnable command) { + command.run(); + } + }; + MongoStorage storage = new MongoStorage(conf, exec); storage.mapCategoryToDBCollection(testCategory, testCollection); storage.mapCategoryToDBCollection(emptyTestCategory, emptyTestCollection); return storage;
--- a/web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java Mon Dec 17 16:36:50 2012 +0100 +++ b/web/client/src/main/java/com/redhat/thermostat/web/client/internal/WebStorage.java Mon Dec 17 16:37:43 2012 +0100 @@ -52,6 +52,8 @@ import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; import java.util.logging.Level; import java.util.logging.Logger; @@ -282,7 +284,14 @@ private String password; private SecureRandom random; + private Executor threadpool; + public WebStorage(StartupConfiguration config) throws StorageException { + this(config, Executors.newCachedThreadPool()); + } + + // Used for testing. + WebStorage(StartupConfiguration config, Executor threadpool) { categoryIds = new HashMap<>(); gson = new GsonBuilder().registerTypeHierarchyAdapter(Pojo.class, new ThermostatGSONConverter()).create(); @@ -295,6 +304,8 @@ if (config.getDBConnectionString().startsWith(HTTPS_PREFIX)) { registerSSLScheme(connManager); } + + this.threadpool = threadpool; } private void registerSSLScheme(ClientConnectionManager conManager) @@ -483,8 +494,19 @@ } @Override - public void putPojo(Category category, boolean replace, AgentIdPojo pojo) + public void putPojo(final Category category, final boolean replace, final AgentIdPojo pojo) throws StorageException { + + threadpool.execute(new Runnable() { + + @Override + public void run() { + putImpl(category, replace, pojo); + } + }); + } + + private void putImpl(Category category, boolean replace, AgentIdPojo pojo) { // TODO: This logic should probably be moved elsewhere. I.e. out of the // Storage API. if (pojo.getAgentId() == null) {
--- a/web/client/src/test/java/com/redhat/thermostat/web/client/internal/WebStorageTest.java Mon Dec 17 16:36:50 2012 +0100 +++ b/web/client/src/test/java/com/redhat/thermostat/web/client/internal/WebStorageTest.java Mon Dec 17 16:37:43 2012 +0100 @@ -52,13 +52,13 @@ import java.io.StringReader; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; -import java.net.URLEncoder; import java.util.Arrays; import java.util.Enumeration; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.concurrent.Executor; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; @@ -81,9 +81,8 @@ import com.google.gson.JsonArray; import com.google.gson.JsonParser; import com.google.gson.JsonSyntaxException; -import com.redhat.thermostat.storage.core.AuthToken; +import com.redhat.thermostat.storage.config.StartupConfiguration; import com.redhat.thermostat.storage.core.AuthToken; -import com.redhat.thermostat.storage.config.StartupConfiguration; import com.redhat.thermostat.storage.core.Categories; import com.redhat.thermostat.storage.core.Category; import com.redhat.thermostat.storage.core.Cursor; @@ -150,7 +149,13 @@ return "http://fluff.example.org"; } }; - storage = new WebStorage(config); + Executor exec = new Executor() { + @Override + public void execute(Runnable command) { + command.run(); + } + }; + storage = new WebStorage(config, exec); storage.setEndpoint("http://localhost:" + port + "/"); storage.setAgentId(new UUID(123, 456)); headers = new HashMap<>();