问题标签 [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.
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 案例中有何不同/相似?
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?
java - 支持异步的基于连接池的 Web 服务器与基于事件循环的 Web 服务器
我正在学习 Vertx 和它的生态系统,首先我了解了事件循环,这个概念对我来说真的很好。
但是从 Servlet 3.1 开始,我们可以在基于 JAVA 的服务器中使用异步支持。
我正在使用 Spring,它是一个名为的新类deferredresult
,它可以从 tomcat 获取线程,从执行器线程池执行逻辑给线程,使 tomcat 中的线程可以自由地处理另一个请求,然后在它完成时返回响应。
在事件循环中,所有的阻塞调用都应该由worker vertx完成,概念是完全一样的,你给阻塞调用一个线程,并在任务完成时提供回调事件循环执行回调并返回响应。
这些概念看起来和我很相似。
也许我错过了一些东西,但这些概念之间有什么区别?
jakarta-ee - 如何将 web.xml 转换为 @WebServlet?
我有一个带有 servlet 3.1 的 Web 应用程序,并且有一个没有 @WebFilter 注释的 servlet 过滤器,它工作正常。
我想用@WebServlet 注释替换它,但使用相同的旧过滤器而不创建新过滤器类并在旧过滤器类中使用@WebFilter。下面是我的 web.xml 文件。
我试图用下面的servlet替换它。
我没有找到过滤器映射和安全约束的任何注释。
你能帮我解决这个问题吗?
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 的基础:
可能的竞争条件:
- DataFeederThread: 调用
dataArrived()
->writeImpl()
,然后它得到的output.isReady()
是true
. onTimeout()
完成上下文的Jetty 调用。- DataFeederThread:
output.write()
在 while 循环中调用但找到了完整的上下文。
这种情况会导致Closed while Pending/Unready
警告还是另一个问题?我是对的,制造completeImpl()
synchronized
解决了问题还是有其他需要关心的事情?
更新(2018-06-28):
我们在以下代码段中也有类似的onError
实现:QueueWriteListener
onError
无论如何,日志消息周围没有错误日志Closed while Pending/Unready
(查看每个两个小时的时间范围),只有 EOF,如下面的来自我们的DataFeederThread
:
java - isReady() 在关闭状态下返回 true - 为什么?
ServletOutputStream.isReady()
javadoc 说以下内容:
返回:如果写入此 ServletOutputStream 将成功,则返回 true,否则返回 false。
尽管 Jetty 的ServletOutputStream
实现,在流处于状态HttpOutput
的情况下似乎表现得相当混乱。CLOSED
它返回true
:
来源:HttpOutput.java :1011 。
此外,当它是时,所有三种write
方法都会HttpOutput
抛出:EofException
CLOSED
所以看起来 write 永远不会成功。这种行为背后的原因是什么?
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
java - 由于 servlet-api,SpringBoot 应用程序无法启动
大家好,首先对不起我的英语。我正在尝试启动我的 springboot 应用程序,但由于 servlet-api 3.1 和旧版本冲突,它没有启动,但我不知道哪个依赖项为此发生冲突,希望有人能帮助我。以下是我的 pom 文件详细信息:
这是我使用 springboot 2.0.4 和 spring 5 删除的 spring 依赖项。
这是我即将到来的错误消息:
java - tomcat的非阻塞servlet获取读写监听器的方法调用是否应该同步?
我试图了解非阻塞 io 如何在 servlet 中工作。下面的代码是tomcat附带的示例,用于显示新的servlet“NumberWriter”的功能。这个 servlet 有一个“doGet”方法和一个实现读写侦听器的内部类“NumberWriterListener”。如果我将System.out.println(Thread.currentThread().getId());
doGet 方法放入该 servlet 的所有请求,则在控制台上显示不同的线程 ID。在 NumberWriterListener 类上有一条评论:“一次只应该有一个容器线程调用侦听器。” 这是否意味着 doGet 方法应该同步?如果所有 doGet 方法都在不同的线程上,并且一次只有一个线程应该调用侦听器?如果有人可以帮助理解我将不胜感激。谢谢
这是 servlet 示例: