Servlet3.1规范翻译——Servlet接口
?
?
2.3.3.4 线程安全除了startAsync 和complete 方法,请求和响应对象的实现都不保证线程安全。这意味着它们应该仅在请求处理线程范围内使用或应用确保线程安全的访问请求和响应对象。
如果应用使用容器管理对象创建一个线程,例如请求或响应对象,这些对象必须在其生命周期内被访问,就像3.10和5.6章节定义的那样。请注意,除了startAsync和complete方法,请求和响应对象不是线程安全的。如果这些对象需要多线程访问,需要同步这些访问或通过包装器添加线程安全语义,比如,同步化调用访问请求属性的方法,或者在线程内为响应对象使用一个局部输出流。
?2.3.3.5 升级处理在HTTP/1.1,Upgrade通用头(general-header)允许客户端指定其支持和希望使用的其他通信协议。如果服务器找到合适的切换协议,那么新的协议将在之后的通信中使用。Servlet容器提供了HTTP升级机制。不过,Servlet容器本身不知道任何升级协议。协议处理封装在协议处理器。在容器和协议处理器之间通过字节流进行数据读取或写入。
当收到一个升级(upgrade)请求,servlet可以调用HttpServletRequest.upgrade方法启动升级处理。应用准备和发送一个合适的响应到客户端。退出servlet service方法之后,servlet容器完成所有过滤器的处理并标记连接已交给协议处理器处理。然后调用协议处理器的init方法,传入一个WebConnection以允许协议处理器访问数据流。
Servlet过滤器仅处理初始的HTTP请求和响应,然后它们将不会再参与到后续的通信中。换句话说,一旦请求被升级,它们将不会被调用。
协议处理器(ProtocolHandler)可以使用非阻塞IO(non blocking IO)消费和生产消息。
?
2.3.4 终止服务(End of Service)Servlet容器没必要保持装载的Servlet持续任何特定的一段时间。一个Servlet实例可能会在servlet容器内保持活跃(active)持续一段时间(以毫秒为单位),Servlet容器的寿命可能是几天,几个月,或几年,或者是任何之间的时间。
当Servlet容器确定servlet应该从服务中移除时,将调用Servlet接口的destroy方法以允许Servlet释放它使用的任何资源和保存任何持久化的状态。例如,当想要节省内存资源或它被关闭时,容器可以做这个。
在servlet容器调用destroy方法之前,它必须让当前正在执行service方法的任何线程完成执行,或者超过了服务器定义的时间限制。
?
一旦调用了servlet实例的destroy方法,容器无法再路由其他请求到该servlet实例了。如果容器需要再次使用该servlet,它必须用该servlet类的一个新的实例。在destroy方法完成后,servlet容器必须释放servlet实例以便被垃圾回收。