diff --git a/pom.xml b/pom.xml
index fdc2f9f19a1..06a3942d714 100644
--- a/pom.xml
+++ b/pom.xml
@@ -76,7 +76,7 @@
com.metamx
http-client
- 0.8.1
+ 0.8.4
com.metamx
diff --git a/server/src/main/java/io/druid/guice/QueryableModule.java b/server/src/main/java/io/druid/guice/QueryableModule.java
index 4a279e57d87..f8c4259e33f 100644
--- a/server/src/main/java/io/druid/guice/QueryableModule.java
+++ b/server/src/main/java/io/druid/guice/QueryableModule.java
@@ -25,7 +25,6 @@ import com.google.inject.Binder;
import com.google.inject.util.Providers;
import io.druid.initialization.DruidModule;
import io.druid.query.QuerySegmentWalker;
-import io.druid.server.QueryServlet;
import io.druid.server.log.EmittingRequestLoggerProvider;
import io.druid.server.log.FileRequestLoggerProvider;
import io.druid.server.log.RequestLogger;
@@ -41,7 +40,6 @@ public class QueryableModule implements DruidModule
@Override
public void configure(Binder binder)
{
- binder.bind(QueryServlet.class).in(LazySingleton.class);
binder.bind(QuerySegmentWalker.class).toProvider(Providers.of(null));
binder.bind(RequestLogger.class).toProvider(RequestLoggerProvider.class).in(ManageLifecycle.class);
JsonConfigProvider.bind(binder, "druid.request.logging", RequestLoggerProvider.class);
diff --git a/server/src/main/java/io/druid/server/QueryServlet.java b/server/src/main/java/io/druid/server/QueryResource.java
similarity index 90%
rename from server/src/main/java/io/druid/server/QueryServlet.java
rename to server/src/main/java/io/druid/server/QueryResource.java
index 53a5b17a260..cbd388a9304 100644
--- a/server/src/main/java/io/druid/server/QueryServlet.java
+++ b/server/src/main/java/io/druid/server/QueryResource.java
@@ -37,22 +37,25 @@ import io.druid.guice.annotations.Smile;
import io.druid.query.Query;
import io.druid.query.QuerySegmentWalker;
import io.druid.server.log.RequestLogger;
-import org.eclipse.jetty.server.Request;
import org.joda.time.DateTime;
import javax.servlet.ServletException;
-import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.Charset;
/**
*/
-public class QueryServlet extends HttpServlet
+@Path("/druid/v2/")
+public class QueryResource
{
- private static final Logger log = new Logger(QueryServlet.class);
+ private static final Logger log = new Logger(QueryResource.class);
private static final Charset UTF8 = Charset.forName("UTF-8");
private final ObjectMapper jsonMapper;
@@ -62,7 +65,7 @@ public class QueryServlet extends HttpServlet
private final RequestLogger requestLogger;
@Inject
- public QueryServlet(
+ public QueryResource(
@Json ObjectMapper jsonMapper,
@Smile ObjectMapper smileMapper,
QuerySegmentWalker texasRanger,
@@ -77,8 +80,12 @@ public class QueryServlet extends HttpServlet
this.requestLogger = requestLogger;
}
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
+ @POST
+ @Produces("application/json")
+ public void doPost(
+ @Context HttpServletRequest req,
+ @Context HttpServletResponse resp
+ ) throws ServletException, IOException
{
Query query = null;
byte[] requestQuery = null;
@@ -111,7 +118,7 @@ public class QueryServlet extends HttpServlet
out = resp.getOutputStream();
jsonWriter.writeValue(out, results);
- long requestTime = System.currentTimeMillis() - ((Request) req).getTimeStamp();
+ long requestTime = System.currentTimeMillis() - req.getSession().getCreationTime();
emitter.emit(
new ServiceMetricEvent.Builder()
diff --git a/services/src/main/java/io/druid/cli/BrokerJettyServerInitializer.java b/services/src/main/java/io/druid/cli/BrokerJettyServerInitializer.java
deleted file mode 100644
index 08610018e19..00000000000
--- a/services/src/main/java/io/druid/cli/BrokerJettyServerInitializer.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Druid - a distributed column store.
- * Copyright (C) 2012, 2013 Metamarkets Group Inc.
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License
- * as published by the Free Software Foundation; either version 2
- * of the License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
- */
-
-package io.druid.cli;
-
-import com.google.inject.Injector;
-import com.google.inject.servlet.GuiceFilter;
-import io.druid.server.QueryServlet;
-import io.druid.server.initialization.JettyServerInitializer;
-import org.eclipse.jetty.server.Handler;
-import org.eclipse.jetty.server.Server;
-import org.eclipse.jetty.server.handler.DefaultHandler;
-import org.eclipse.jetty.server.handler.HandlerList;
-import org.eclipse.jetty.servlet.DefaultServlet;
-import org.eclipse.jetty.servlet.ServletContextHandler;
-import org.eclipse.jetty.servlet.ServletHolder;
-import org.eclipse.jetty.servlets.GzipFilter;
-
-/**
- */
-public class BrokerJettyServerInitializer implements JettyServerInitializer
-{
- @Override
- public void initialize(Server server, Injector injector)
- {
- final ServletContextHandler resources = new ServletContextHandler(ServletContextHandler.SESSIONS);
- resources.addServlet(new ServletHolder(new DefaultServlet()), "/druid/v2/datasources/*");
- resources.addFilter(GuiceFilter.class, "/druid/v2/datasources/*", null);
-
- final ServletContextHandler queries = new ServletContextHandler(ServletContextHandler.SESSIONS);
- queries.setResourceBase("/");
- queries.addServlet(new ServletHolder(injector.getInstance(QueryServlet.class)), "/druid/v2/*");
-
- final ServletContextHandler root = new ServletContextHandler(ServletContextHandler.SESSIONS);
- root.addServlet(new ServletHolder(new DefaultServlet()), "/*");
- root.addFilter(GzipFilter.class, "/*", null);
- root.addFilter(GuiceFilter.class, "/*", null);
-
- final HandlerList handlerList = new HandlerList();
- handlerList.setHandlers(new Handler[]{resources, queries, root, new DefaultHandler()});
- server.setHandler(handlerList);
- }
-}
diff --git a/services/src/main/java/io/druid/cli/CliBroker.java b/services/src/main/java/io/druid/cli/CliBroker.java
index cf66da0cece..761ebee7b7c 100644
--- a/services/src/main/java/io/druid/cli/CliBroker.java
+++ b/services/src/main/java/io/druid/cli/CliBroker.java
@@ -42,6 +42,7 @@ import io.druid.query.QuerySegmentWalker;
import io.druid.query.QueryToolChestWarehouse;
import io.druid.server.ClientInfoResource;
import io.druid.server.ClientQuerySegmentWalker;
+import io.druid.server.QueryResource;
import io.druid.server.initialization.JettyServerInitializer;
import io.druid.server.metrics.MetricsModule;
import org.eclipse.jetty.server.Server;
@@ -81,7 +82,9 @@ public class CliBroker extends ServerRunnable
JsonConfigProvider.bind(binder, "druid.broker.cache", CacheProvider.class);
binder.bind(QuerySegmentWalker.class).to(ClientQuerySegmentWalker.class).in(LazySingleton.class);
- binder.bind(JettyServerInitializer.class).to(BrokerJettyServerInitializer.class).in(LazySingleton.class);
+
+ binder.bind(JettyServerInitializer.class).to(QueryJettyServerInitializer.class).in(LazySingleton.class);
+ Jerseys.addResource(binder, QueryResource.class);
Jerseys.addResource(binder, ClientInfoResource.class);
DiscoveryModule.register(binder, Self.class);
diff --git a/services/src/main/java/io/druid/cli/CliHistorical.java b/services/src/main/java/io/druid/cli/CliHistorical.java
index bf61888ee9f..4cf2a5ff6cd 100644
--- a/services/src/main/java/io/druid/cli/CliHistorical.java
+++ b/services/src/main/java/io/druid/cli/CliHistorical.java
@@ -24,11 +24,13 @@ import com.google.inject.Binder;
import com.google.inject.Module;
import com.metamx.common.logger.Logger;
import io.airlift.command.Command;
+import io.druid.guice.Jerseys;
import io.druid.guice.LazySingleton;
import io.druid.guice.LifecycleModule;
import io.druid.guice.ManageLifecycle;
import io.druid.guice.NodeTypeConfig;
import io.druid.query.QuerySegmentWalker;
+import io.druid.server.QueryResource;
import io.druid.server.coordination.ServerManager;
import io.druid.server.coordination.ZkCoordinator;
import io.druid.server.initialization.JettyServerInitializer;
@@ -66,6 +68,8 @@ public class CliHistorical extends ServerRunnable
binder.bind(NodeTypeConfig.class).toInstance(new NodeTypeConfig("historical"));
binder.bind(JettyServerInitializer.class).to(QueryJettyServerInitializer.class).in(LazySingleton.class);
+ Jerseys.addResource(binder, QueryResource.class);
+
LifecycleModule.register(binder, ZkCoordinator.class);
LifecycleModule.register(binder, Server.class);
diff --git a/services/src/main/java/io/druid/cli/CliPeon.java b/services/src/main/java/io/druid/cli/CliPeon.java
index 1d387cebfd0..93c0041ab4b 100644
--- a/services/src/main/java/io/druid/cli/CliPeon.java
+++ b/services/src/main/java/io/druid/cli/CliPeon.java
@@ -65,6 +65,7 @@ import io.druid.segment.loading.DataSegmentKiller;
import io.druid.segment.loading.OmniDataSegmentKiller;
import io.druid.segment.loading.SegmentLoaderConfig;
import io.druid.segment.loading.StorageLocationConfig;
+import io.druid.server.QueryResource;
import io.druid.server.initialization.JettyServerInitializer;
import org.eclipse.jetty.server.Server;
@@ -149,6 +150,7 @@ public class CliPeon extends GuiceRunnable
.toInstance(new SegmentLoaderConfig().withLocations(Arrays.asList()));
binder.bind(JettyServerInitializer.class).to(QueryJettyServerInitializer.class);
+ Jerseys.addResource(binder, QueryResource.class);
Jerseys.addResource(binder, ChatHandlerResource.class);
binder.bind(NodeTypeConfig.class).toInstance(new NodeTypeConfig(nodeType));
diff --git a/services/src/main/java/io/druid/cli/QueryJettyServerInitializer.java b/services/src/main/java/io/druid/cli/QueryJettyServerInitializer.java
index f23536ff665..f3be30e00ff 100644
--- a/services/src/main/java/io/druid/cli/QueryJettyServerInitializer.java
+++ b/services/src/main/java/io/druid/cli/QueryJettyServerInitializer.java
@@ -21,7 +21,6 @@ package io.druid.cli;
import com.google.inject.Injector;
import com.google.inject.servlet.GuiceFilter;
-import io.druid.server.QueryServlet;
import io.druid.server.initialization.JettyServerInitializer;
import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
@@ -41,7 +40,6 @@ public class QueryJettyServerInitializer implements JettyServerInitializer
{
final ServletContextHandler queries = new ServletContextHandler(ServletContextHandler.SESSIONS);
queries.setResourceBase("/");
- queries.addServlet(new ServletHolder(injector.getInstance(QueryServlet.class)), "/druid/v2/*");
final ServletContextHandler root = new ServletContextHandler(ServletContextHandler.SESSIONS);
root.addServlet(new ServletHolder(new DefaultServlet()), "/*");
diff --git a/services/src/main/java/io/druid/guice/RealtimeModule.java b/services/src/main/java/io/druid/guice/RealtimeModule.java
index 094efa93f75..af4de6f5f43 100644
--- a/services/src/main/java/io/druid/guice/RealtimeModule.java
+++ b/services/src/main/java/io/druid/guice/RealtimeModule.java
@@ -31,6 +31,7 @@ import io.druid.segment.realtime.FireDepartment;
import io.druid.segment.realtime.NoopSegmentPublisher;
import io.druid.segment.realtime.RealtimeManager;
import io.druid.segment.realtime.SegmentPublisher;
+import io.druid.server.QueryResource;
import io.druid.server.initialization.JettyServerInitializer;
import org.eclipse.jetty.server.Server;
@@ -64,6 +65,7 @@ public class RealtimeModule implements Module
binder.bind(QuerySegmentWalker.class).to(RealtimeManager.class).in(ManageLifecycle.class);
binder.bind(NodeTypeConfig.class).toInstance(new NodeTypeConfig("realtime"));
binder.bind(JettyServerInitializer.class).to(QueryJettyServerInitializer.class).in(LazySingleton.class);
+ Jerseys.addResource(binder, QueryResource.class);
LifecycleModule.register(binder, Server.class);
}