使用嵌入式Jetty Web服务器从客户端获取大量消息

时间:2017-03-23 11:32:32

标签: java server jetty

我有一个项目,其中服务器需要能够连接到大量客户端并接收来自它们的观察消息并将它们放入队列中。我当前的粗略实现使用一个非常基本的处理程序来获取客户端请求作为文本:

public class JettyServer
{

    public JettyServer() throws Exception
    {
        Server server = new Server(6558);
        ObservationHandler handler = new ObservationHandler();
        server.setHandler(handler);

        server.start();
        server.join();

    } 

    public class ObservationHandler extends AbstractHandler
    {
        @Override
        public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException
        {
            String requestString = request.getReader().lines().collect(Collectors.joining(System.lineSeparator()));

            // code to add requestString to thread safe queue ...

            baseRequest.setHandled(true);
        }

    }
}

这允许我以文本形式获取客户端请求,但我不确定这是我应该怎么做的。有没有办法从客户那里收到信息,而不是以请求的形式? Jetty似乎非常关注服务器到客户端的事务,但反之则不然。我之前使用过jetty网络套接字,但我不确定我在这里想要的是与客户端的连接可能是间歇性的。是否有更好的服务器服务或Jetty实现来执行此操作?

1 个答案:

答案 0 :(得分:0)

为什么不创建一个可以根据需要检索数据并进行处理的servlet?

只需创建一个扩展HttpServlet的类:

public class MyServlet extends HttpServlet

然后,覆盖doGetdoPost这样的方法:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
    response.setContentType("text/html");
    response.setStatus(HttpServletResponse.SC_OK);
    response.getWriter().println("<h1>"+greeting+"</h1>");
    response.getWriter().println("session=" + request.getSession(true).getId());
}

在您的服务器配置中,您还必须根据servlet将侦听的“路径”将servlet添加到上下文中。在以下示例中,有三个HelloServlet实例。第一个侦听每条路径,第二条路径仅以“/ it”开头,第三条路径以“/ fr”开头:

public class OneServletContext{
   public static void main(String[] args) throws Exception{
     Server server = new Server(8080);

     ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
     context.setContextPath("/");
     server.setHandler(context);

     context.addServlet(new ServletHolder(new HelloServlet()),"/*");
     context.addServlet(new ServletHolder(new HelloServlet("Buongiorno Mondo")),"/it/*");
     context.addServlet(new ServletHolder(new HelloServlet("Bonjour le Monde")),"/fr/*");

     server.start();
     server.join();
}

}

有关详细信息,请查看https://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty