java Jersey 2.1客户端线程安全吗?

Posted

技术标签:

【中文标题】java Jersey 2.1客户端线程安全吗?【英文标题】:Is java Jersey 2.1 client thread safe? 【发布时间】:2013-08-07 08:53:24 【问题描述】:

Documentation for jersey 2.0 says:

客户端实例是昂贵的资源。推荐一个 配置的实例被重用于 Web 资源的创建。这 创建 Web 资源,构建请求和接收 响应保证是线程安全的。因此一个客户端实例和 WebResource 实例可以在多个线程之间共享

客户端在 2.1 版中仍然是线程安全的吗?我在docs for 2.1.中找不到有关线程安全的信息

【问题讨论】:

我给你开了一张票(我哈哈):java.net/jira/browse/JERSEY-3094 【参考方案1】:

是的,Jersey 2.1 客户端是线程安全的,即使在未来的 Jersey 版本中也应该是线程安全的。您可以从一个 Client 实例创建多个 WebTarget,并在这些 WebTarget 上调用多个请求,甚至在一个 WebTarget 实例上同时调用更多请求。

如果您将自定义的非线程安全提供程序注册到客户端或 WebTget 中,则可能会破坏线程安全。例如,非线程安全且无法同时处理更多请求的 ClientRequestFilter。 Jersey 内置提供程序是线程安全的。一些 Jersey 扩展提供程序不能是线程安全的,在这种情况下,这是在提供程序的 javadoc 中指定的。

【讨论】:

有用的答案。你也有这方面的资料吗? 这个限制是来自 JAX-RS 还是仅来自 Jersey?因为javax.ws.rs.client.Client 只说:客户端是重量级的对象......初始化以及处置客户端实例可能是一项相当昂贵的操作。因此建议只构建少量的客户端实例......客户端实例必须在被释放之前正确关闭以避免泄漏资源。所以没有关于线程安全,只有即将被重用,但同时一无所获。 @datakey 完全正确,有人可以确认答案吗?我不知道该怎么想ClientWebTarget ..! @lucasvc - 事实上,javax.ws.rs.client.Client 确实接近被重用。它说:客户端实例必须在处置之前正确关闭以避免资源泄漏。close() 方法的文档说:一旦客户端关闭,在客户端实例上调用任何其他方法将导致抛出 IllegalStateException。 因此关闭后无法重用。 仍然......问题仍然存在。由于某些未知原因,线程安全的文档已被删除。大声笑,我希望像这样的东西被添加,而不是被删除?票务:java.net/jira/browse/JERSEY-3094【参考方案2】:

我认为,基于2.1 release notes,这方面没有任何改变,但我在文档中找不到这种改变的动机。

【讨论】:

以上是关于java Jersey 2.1客户端线程安全吗?的主要内容,如果未能解决你的问题,请参考以下文章

Java - Spring 的 ReactorNettyWebSocketClient 线程安全吗?

Jetty websocket 客户端类 WebSocketClient 线程安全吗?

Java并发线程通信

面试官:你对多线程熟悉吗,谈谈线程安全中的原子性,有序性和可见性?

如何配置用于 Jersey REST 调用的最大并发线程数?

Java高并发-Java内存模型和线程安全