问题标签 [servlet-3.1]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
463 浏览

websocket - Tomcat 8.5 线程模型

我的应用程序通过 Tomcat 8.5(servlet 3.1)的 JSR 356 实现使用 Web Sockets。根据 JSR,它应该使用 NIO,但我不确定是否理解。

当客户端请求 Web Socket 连接时,客户端和服务器之间会创建一个永久对话。在这种情况下,我想知道客户端或服务器的每个请求是否由 Tomcat 池的不同线程处理,或者是否始终专用于该连接。

此外,该线程如何处理请求?例如,它是等待 JDBC 调用(阻塞 IO)还是在这种情况下释放(NIO)?与众所周知的仅使用 NIO 的 Netty 相比,Tomcat 线程模型在 websocket 案例中有何不同/相似?

0 投票
1 回答
800 浏览

servlets - WAS 9 如何在 Websphere 9 中使用 servlet 3.0?

根据给定的规范,WAS9 正在使用 JAVAEE 7 和相关规范。由于某些限制,我想使用 servlet spec 3.0。有没有办法配置它。我正在使用普通配置文件(无自由配置文件)。

限制是我有两个具有相同 URL 映射的 servlet,这在 servlet spec-3.1 中是不允许的

按照给这里我可以使用servlet规范3。

如何让 WAS 9 使用 servlet 规范 3?

0 投票
1 回答
523 浏览

java - 支持异步的基于连接池的 Web 服务器与基于事件循环的 Web 服务器

我正在学习 Vertx 和它的生态系统,首先我了解了事件循环,这个概念对我来说真的很好。

但是从 Servlet 3.1 开始,我们可以在基于 JAVA 的服务器中使用异步支持。

我正在使用 Spring,它是一个名为的新类deferredresult,它可以从 tomcat 获取线程,从执行器线程池执行逻辑给线程,使 tomcat 中的线程可以自由地处理另一个请求,然后在它完成时返回响应。

在事件循环中,所有的阻塞调用都应该由worker vertx完成,概念是完全一样的,你给阻塞调用一个线程,并在任务完成时提供回调事件循环执行回调并返回响应。

这些概念看起来和我很相似。

也许我错过了一些东西,但这些概念之间有什么区别?

0 投票
1 回答
470 浏览

jakarta-ee - 如何将 web.xml 转换为 @WebServlet?

我有一个带有 servlet 3.1 的 Web 应用程序,并且有一个没有 @WebFilter 注释的 servlet 过滤器,它工作正常。

我想用@WebServlet 注释替换它,但使用相同的旧过滤器而不创建新过滤器类并在旧过滤器类中使用@WebFilter。下面是我的 web.xml 文件。

我试图用下面的servlet替换它。

我没有找到过滤器映射和安全约束的任何注释。

你能帮我解决这个问题吗?

0 投票
2 回答
1076 浏览

servlets - 了解 Jetty 的“待处理/未就绪时关闭”警告

我们有一个异步 servlet,它从 Jetty 生成以下警告日志:

启用调试日志后,我得到以下堆栈跟踪:

它没有太大帮助。

只有在 Jetty 调用了onTimeout()我们的AsyncListener. QA 有时可以通过kill -9在客户端应用程序上使用来重现它。

如何使用示例 servlet 客户端代码重现此警告?我想在比我们的生产代码更简单的环境中理解这个问题,以便之后能够修复生产代码。示例 servlet 应该如何表现?是否可以在同一个 JUnit 测试中使用 Apache Commons HttpClient 客户端重现它?(这对于编写没有复杂网络黑客攻击的集成测试非常有用,例如kill -9。)

我尝试了一些方法来实现示例异步 servlet 和客户端,但均未成功。我认为附加此代码不会有太大帮助,但如果有人感兴趣,我可以这样做。

码头版本:9.4.8.v20171121

更新(2018-06-27):

考虑到@Joakim Erdfelt 的有用回答,我没有close()在我们的代码中找到任何调用,但发现了可疑的同步丢失。这是我们的异步轮询 servlet 的基础:

可能的竞争条件:

  1. DataFeederThread: 调用dataArrived()-> writeImpl(),然后它得到的output.isReady()true.
  2. onTimeout()完成上下文的Jetty 调用。
  3. DataFeederThread:output.write()在 while 循环中调用但找到了完整的上下文。

这种情况会导致Closed while Pending/Unready警告还是另一个问题?我是对的,制造completeImpl() synchronized解决了问题还是有其他需要关心的事情?

更新(2018-06-28):

我们在以下代码段中也有类似的onError实现:QueueWriteListener

onError无论如何,日志消息周围没有错误日志Closed while Pending/Unready(查看每个两个小时的时间范围),只有 EOF,如下面的来自我们的DataFeederThread

0 投票
1 回答
303 浏览

java - isReady() 在关闭状态下返回 true - 为什么?

ServletOutputStream.isReady()javadoc 说以下内容

返回:如果写入此 ServletOutputStream 将成功,则返回 true,否则返回 false。

尽管 Jetty 的ServletOutputStream实现,在流处于状态HttpOutput的情况下似乎表现得相当混乱。CLOSED它返回true

来源:HttpOutput.java :1011 。

此外,当它是时,所有三种write方法都会HttpOutput抛出:EofExceptionCLOSED

所以看起来 write 永远不会成功。这种行为背后的原因是什么?

0 投票
1 回答
213 浏览

servlets - 来自 Jetty 的“待处理/未就绪时关闭”警告

在我们的异步 servlet 中修复同步问题后,我们仍然很少见

来自码头的警告。通过上面的修复,在我们的生产系统中,它从每天约 90 次减少到每天约 5 次。这种情况很少见,而且看起来好多了,但可能仍然缺少一些小东西。

完整的堆栈跟踪:

写入输出流(不同步)的唯一代码如下setContentType()setStatus()flushBuffer()在此处调用:

这在我们QueueWriteListener的设置之前运行,所以如果flushBuffer()是同步的,它应该不是问题。

无论如何,查找 Jetty 的源代码,Reponse.flush()调用HttpOutput.flush()其中调用new AsyncFlush().iterate()似乎可疑但调试doPost()/flushBuffer()这个case分支没有运行。

完整代码:

因此,似乎在 Jetty 完成和(异步)关闭输出之间,没有人可以写入输出,因此其状态不应更改为挂起或未就绪。尽管如此,它仍然以某种方式发生。Closed while Pending/Unready此警告的原因可能是什么?

我检查了我们的日志(没有相关的)。

onError(AsyncEvent event)(还)不在synchronized我们的代码中,但它不相关,因为它的日志消息从未出现在我们的日志中。

GitHub相关讨论:https ://github.com/eclipse/jetty.project/issues/2689

0 投票
3 回答
2994 浏览

java - 由于 servlet-api,SpringBoot 应用程序无法启动

大家好,首先对不起我的英语。我正在尝试启动我的 springboot 应用程序,但由于 servlet-api 3.1 和旧版本冲突,它没有启动,但我不知道哪个依赖项为此发生冲突,希望有人能帮助我。以下是我的 pom 文件详细信息:

这是我使用 springboot 2.0.4 和 spring 5 删除的 spring 依赖项。

这是我即将到来的错误消息:

0 投票
0 回答
158 浏览

java - tomcat的非阻塞servlet获取读写监听器的方法调用是否应该同步?

我试图了解非阻塞 io 如何在 servlet 中工作。下面的代码是tomcat附带的示例,用于显示新的servlet“NumberWriter”的功能。这个 servlet 有一个“doGet”方法和一个实现读写侦听器的内部类“NumberWriterListener”。如果我将System.out.println(Thread.currentThread().getId());doGet 方法放入该 servlet 的所有请求,则在控制台上显示不同的线程 ID。在 NumberWriterListener 类上有一条评论:“一次只应该有一个容器线程调用侦听器。” 这是否意味着 doGet 方法应该同步?如果所有 doGet 方法都在不同的线程上,并且一次只有一个线程应该调用侦听器?如果有人可以帮助理解我将不胜感激。谢谢

这是 servlet 示例:

0 投票
1 回答
500 浏览

spring-webflux - 在 servlet 3.1 容器中使用 ServletHttpHandlerAdapter spring web-flux 进行请求转发

根据servlet 3.1 容器上的文档,ServletHttpHandlerAdapter 可以注册为 servlet 并且可以支持 nio。我需要将请求转发到其他资源,如下所示

在呼叫转发时,我遇到了错误。

哪个是正确的,因为 spring 创建了 org.springframework.http.server.reactive.ServletServerHttpResponse 并最初调用 response.getOutputStream(),现在如何支持请求转发?

问题也记录到 spring jira 以供讨论 -链接