`

Java学习——接触Jetty服务器

 
阅读更多

Jetty不只是个性能优秀的web服务器,还能作为插件供我们开发使用,下面就简单接触一下,我下载的jetty版本是8.1.8版本。最新版9.0.0的api相比8.1.8有不小改动,出于了解学习的目的就随便找个来用。

 

“从一万里高空看Jetty”就是下面这个架构

 

 

Connector

|

|

 Server — — ThreadPool

|

|

 Handler

 

Connector负责前端请求的接受,handler负责后台处理,同时维持一个threadpool线程池供服务器调用。

 

Connector分下面几种

 

 

1,SelectChannelConnector

使用高效的NIO模型以及非阻塞线程模型接收request。

当使用coninuations时,线程不会阻塞等待,当一个filter或者servlet在continuation调用getEvent时,会抛出

一个运行时异常,Jetty捕获这个异常但并不响应给客户端,而是释放线程然后将continuation放回时间片队列。当continuation超时或者

有事件发生时,Jetty申请一个线程去继续处理改请求。

 

2,SocketConnector

传统的阻塞IO以及线程模型,为每个连接开启一个线程去处理,当环境不支持NIO时使用这个

 

3,SslSelectChannelConnector(支持ssl协议的NIO模型)

4,SslSocketConnector(支持ssl协议的阻塞IO模型)

5,Ajp13SocketConnector(支持AJP13协议,官方wiki上建议使用普通的HTTP connector)

 

Handler是Jetty的一个组件用来处理接收到的请求,核心api就是handle方法

 

public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
    throws IOException, ServletException

 target——请求的目标,一般是URI(某些场景下为资源名称或者资源URI)

baseRequest——原始的请求对象

request——request或者它的一个包装

response——response或者它的一个包装

只要实现这个方法,就可以处理请求,或者将请求传递给别的handler(or servlet),或者包装改请求,所以有三类handlers

 

1,Coordinating Handlers : HandlerCollection , ContextHandlerCollection

将请求路由到别的handlers。

2,Filtering Handlers : HandlerWrapper , ContextHandler , SessionHandler

包装补充请求并传递给别的handlers

如:

 

		try
		{
			base_request.setSession(a_session);
			next_handler.handle(target,request,response,dispatch);
		}
		finally
		{
			base_request.setSession(old_session);
		}

 3,Generating Handlers : ResourceHandler , ServletHandler

产生content内容

 

		response.setContentType("text/html");
		response.setStatus(HttpServletResponse.SC_OK);
		response.getWriter().println("<h1>Hello OneHandler</h1>");
		
		//如果不想请求再被别的handler处理,则处理方式如下
		base_request.setHandled(true);

 handler的调用方法:顺序调用,嵌套调用

顺序调用(各个Handlers的行为不受调用顺序和下一个调用的影响,独立处理request产生response)

Caller  -->  Handler 1

Caller  -->  Handler 2

Caller  -->  User Code

Caller  -->  Handler 3

 

嵌套调用(更加常用)

Caller  -->  Handler 1

Handler 1  -->  Handler 2

Handler 2  -->  User Code

 

关于Jetty的架构更多参考 : http://wiki.eclipse.org/Jetty/Reference/Jetty_Architecture

 

下面写一个简单的程序测试,集成Jetty的步骤如下:

1,Create the server

2,Add/Configure Connectors(线程池的线程数目不可太小,不然会启动失败)

3,Add/Configure Handlers

4,Add/Configure Servlets/Webapps to Handlers

5,Start the server

6,Wait(join the server to prevent main exiting)

 

package test;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.*;
import org.eclipse.jetty.server.bio.SocketConnector;
import org.eclipse.jetty.server.handler.*;
import org.eclipse.jetty.server.nio.SelectChannelConnector;
import org.eclipse.jetty.util.thread.QueuedThreadPool;

public class PJetty extends AbstractHandler {
	
	public void handle(	String target,
						Request baseRequest,
						HttpServletRequest request,
						HttpServletResponse response)
	throws IOException,ServletException
	{
		response.setContentType("text/html;charset=utf-8");
		response.setStatus(HttpServletResponse.SC_OK);
		baseRequest.setHandled(true);
		response.getWriter().println("<h1>Hello World</h1>");	
	}
	
	public static void main(String[] args) throws Exception {
		//Set connectors
		SelectChannelConnector connector1 = new SelectChannelConnector();
		connector1.setPort(1987);
		connector1.setThreadPool(new QueuedThreadPool(20));
		//request per second : 4207.30 [#/sec] (mean)
		SocketConnector connector2 = new SocketConnector();
		connector2.setPort(1988);
		connector2.setName("jetty");
		//request per second : 4166.46 [#/sec] (mean)
		
		Server server = new Server();
		server.setConnectors(new Connector[]{connector1,connector2});
		//server.setHandler(new PJetty());
		
		//Set handlers
		HandlerList handlers = new HandlerList();
		handlers.setHandlers(new Handler[]{new PJetty(), new DefaultHandler()});
	
		server.setHandler(handlers);
        server.start();
        server.join();
	}
}

 编译运行方法如下:

 

root # export CLASSPATH=$CLASSPATH:/pwd/to/jetty/lib/
root # javac -classpath .:* test/PJetty.java
root # java -cp .:* test/PJetty
2012-12-18 14:09:51.789:INFO:oejs.Server:jetty-8.1.8.v20121106
2012-12-18 14:09:51.865:INFO:oejs.AbstractConnector:Started SelectChannelConnector@0.0.0.0:1987
2012-12-18 14:09:51.866:INFO:oejs.AbstractConnector:Started SocketConnector@0.0.0.0:1988
分享到:
评论

相关推荐

    安卓Android源码——i-jetty开源项目.zip

    【描述】中的"安卓Android源码——i-jetty开源项目.zip"意味着这个压缩包包含了一个完整的源代码实现,开发者可以通过阅读和分析这些源代码来学习如何在Android环境中配置和运行Jetty服务器。 从【标签】"安卓 源码...

    Android源码——i-jetty开源项目.zip

    i-jetty开源项目就是专为Android平台设计的一个轻量级HTTP服务器,它基于Java的Jetty服务器,实现了在Android设备上运行HTTP服务的功能。本文将详细探讨这个项目的核心概念、工作原理以及如何在实际开发中应用。 1....

    maven工程在Jetty服务器上的自动化部署(开发者模式)

    标题“maven工程在Jetty服务器上的自动化部署(开发者模式)”指出了本主题的核心——如何使用Maven构建工具配合Jetty轻量级服务器,实现Java Web项目的自动化部署,并且强调了这是针对开发者的模式,意味着会涉及到...

    jetty-6.1.9服务器(2),包含源码

    Jetty服务器的架构设计使其可以轻松地与其他Java库集成,例如Spring框架,这使得开发者能够在不增加太多复杂性的情况下构建复杂的Web应用。它的模块化特性意味着你可以根据需要选择安装和配置特定的服务,如...

    java面试——SpringBoot面试专题.zip

    - **嵌入式Servlet容器**:Spring Boot支持内嵌Tomcat、Jetty等Servlet容器,无需单独部署。 2. **Spring Boot的启动流程** - **SpringApplication.run()**:这是启动Spring Boot应用的入口,它会创建...

    Jetty Servlet+ HttpClient 制作的 Java HttpProxy

    最后,启动Jetty服务器,代理服务器就会监听指定端口并等待客户端连接。你可以根据实际需求调整服务器配置,例如设置线程池大小、超时时间等。 5. **客户端使用** 客户端配置HTTP代理时,需要设置代理服务器的...

    jetty-distribution-9.2.2.v20140723.zip

    这使得开发者能够在自己的项目中直接启动和控制Jetty服务器,简化了部署流程。 4. **模块化设计**:Jetty的模块化架构允许用户根据需求选择安装和配置组件,如HTTP服务器、HTTP客户端、Servlet容器、WebSocket...

    jetty-distribution-9.1.0.v20131115

    【标题】"jetty-distribution-9.1.0.v20131115"指的是Jetty服务器的一个发行版本,这个版本发布于2013年11月15日。Jetty是一个开源的、轻量级的Java Web服务器和HTTP服务器,它主要被设计用于快速开发和部署Web应用...

    jetty启动器资源配置文件

    通过深入理解这些配置项,可以帮助开发者更好地优化Jetty服务器的性能,确保其在不同应用场景下稳定高效地运行。此外,Jetty还提供了丰富的文档资源和技术支持,开发者可以根据实际需求灵活配置Jetty的各项参数,以...

    深入体验Java Web开发内幕——核心基础

    Java EE容器如Tomcat、Jetty、Glassfish等,它们负责管理Web应用的生命周期,提供Servlet和JSP的运行环境。容器自动处理线程安全、事务管理等问题,开发者只需关注业务逻辑。 六、数据库连接与JDBC Java Database ...

    java web项目——51商城

    10. **部署与服务器**:项目上线涉及Tomcat或Jetty等应用服务器的配置,以及Nginx等反向代理和负载均衡服务器的使用。了解Docker容器化部署也是现代Web开发的趋势。 以上只是部分可能涉及的技术点,实际项目开发...

    Eclipse Jetty插件

    Eclipse Jetty插件是为Eclipse集成开发环境(IDE)设计的一款扩展...了解并熟练使用Eclipse Jetty插件,对于从事Java Web开发的工程师来说,能够提高开发效率,简化部署流程,同时也能更好地利用Jetty服务器的性能优势。

    Jetty cometd(Continuation)学习笔记

    在部署使用Jetty Cometd时,首先需要在服务器端配置相应的类库,包括Jetty服务器核心库、Cometd API和实现库,以及Servlet API。接着,在`web.xml`中配置`ContinuationCometdServlet`,这个Servlet负责处理Cometd...

    java软件开发——顶岗实习周记25篇.rar

    这份"java软件开发——顶岗实习周记25篇.pdf"文档,很可能是某个学生或初入职场的开发者在Java实习期间所记录的工作与学习心得,提供了宝贵的实战经验与反思。 首先,Java作为全球最流行的编程语言之一,其语法严谨...

    Java后端学习路线梳理(csdn)————程序.pdf

    Web服务器(如Nginx)、应用服务器(如Tomcat、Jetty、Undertow)以及中间件(如Redis、RabbitMQ、Kafka、Dubbo、gRPC、Thrift、Spring Cloud、Netty)都是需要了解和掌握的。 数据库层面,你需要熟悉ORM框架...

    图书管理系统——java版

    - **部署**:系统部署在服务器上,可选择Tomcat或Jetty等应用服务器。 - **监控**:使用日志系统记录运行情况,便于问题排查;监控工具如Prometheus和Grafana可实时监控系统性能。 - **更新与维护**:定期更新和...

    jsp struts2 mysql实现的Java web员工工资管理系统

    此外,为了便于部署和维护,项目通常会采用Maven或Gradle等构建工具进行依赖管理,使用Eclipse、IntelliJ IDEA等IDE进行开发,使用Tomcat或Jetty等应用服务器运行Web应用。 总之,这个基于JSP、Struts2和MySQL的...

    Java开发指南--Servlets和JSP篇(PDG).rar

    Java开发指南——Servlets与JSP篇,是Java开发者深入理解Web应用开发的重要参考资料。Servlets和JSP(JavaServer Pages)是Java EE平台中用于构建动态网站的关键技术。Servlets是Java编程语言中的服务器端应用程序...

    jetty 入门实例

    在Jetty解压后的目录中,找到`start.jar`文件,通过命令行执行`java -jar start.jar`,这将启动Jetty服务器。如果一切顺利,你将在控制台看到Jetty成功启动的信息。 现在,我们创建第一个HelloWorld Web应用。在...

    java web项目案例——知识管理软件

    【Java Web项目案例——知识管理软件】是一款基于Java Web技术构建的应用,旨在提供一个高效、易用的知识管理和分享平台。这个项目涵盖了多个关键的技术点,是学习和提升Java Web技能的绝佳实例。以下是对该项目各个...

Global site tag (gtag.js) - Google Analytics