当您使用javax.xml.ws.Endpoint.publish处理传入的restful / soap请求时,它是否会为每个请求生成一个线程?或者我自己会处理线程吗?
我一直试图解决这个问题几天了。文档提示了线程,但没有具体的内容。
Doc说:可以在端点上设置执行程序以获得更好的控制 用于分派传入请求的线程。例如, 可以通过创建一个来启用具有某些参数的线程池 ThreadPoolExecutor并将其注册到端点。
对于我看起来它处理线程,但你无法控制它们,所以添加一个ThreadPoolExecutor来执行线程,你将拥有一个可以使用的线程池。这是对的吗?
答案 0 :(得分:4)
检查JavaTM API for XML-Based Web Services specification(JAX-WS)的 5.2.7 部分似乎表明了这一点,尽管看起来有一些实施特定行为的空间。要真正了解发生了什么,您必须调查您正在使用的JAX-WS实现以及特定的部署环境。我认为行为可能会有所不同,具体取决于服务是在Servlet容器中部署还是在独立进程中部署。您对线程的控制仅限于提供特定的ThreadPoolExecutor
实现。 5.2.7 部分声明:
5.2.7执行人
可以使用Endpoint
配置
java.util.concurrent.Executor
个实例。然后,执行程序将用于将任何传入请求分派给应用程序。setExecutor
的{{1}}和getExecutor
方法可用于修改和检索为服务配置的执行程序。<>一致性(使用执行程序):如果通过
Endpoint
方法在Endpoint
上成功设置了执行程序对象,那么实现必须在发布{{setExecutor
时使用它来分派传入的请求1}}通过Endpoint
方法。如果使用publish(String address)
方法执行发布,则实现可以使用指定的执行程序或特定于正在使用的服务器上下文的另一个执行程序。<>一致性(默认执行程序):如果尚未在
publish(Object serverContext))
上设置执行程序,则实现必须使用自己的执行程序,Endpoint
或类似机制来分派传入的请求。
此外, 5.2.2 部分引用该部分末尾附近的 5.2.7 :
5.2.2发布
...
通常会调用
java.util.concurrent.ThreadPoolExecutor
来为并发请求提供服务,因此应该编写其实现者以支持多个线程。可以像往常一样使用Endpoint
关键字来控制对关键代码段的访问。为了更好地控制用于分派传入请求的线程,应用程序可以直接设置要使用的执行程序,如5.2.7节所述。
我意识到这可能不能完全回答你的问题,但希望它指出你可以得到你正在寻找的答案。
答案 1 :(得分:3)
Executor needs to be set以使端点成为多线程。一个简单的多线程Executor就是fixed thread pool Executor.
endpoint.setExecutor(Executors.newFixedThreadPool(4));
这将允许您的WebService同时接受4个连接。但请确保您的服务是线程安全的。
答案 2 :(得分:1)
我无法在官方doco中找到并回答这个问题,但在阅读了“Java Web Services:Up and Running”之后,似乎不生成线程每个连接。因此,服务被阻止,直到完成一个请求,然后处理新请求。
答案 3 :(得分:1)
Endpoint.publish(Url,ServiceImplObj)在给定的网址上发布网络服务。没有。分配给请求处理的线程真正受jvm的控制,因为这是一个轻量级部署,由jvm本身处理。
为了更好地说明,您可以在服务端打印当前线程名称,您可以看到服务线程是由jvm管理的线程池分配的。
[pool-1-thread-1]: Response[57]:
[pool-1-thread-5]: Response[58]:
[pool-1-thread-4]: Response[59]:
[pool-1-thread-3]: Response[60]:
[pool-1-thread-6]: Response[61]:
[pool-1-thread-6]: Response[62]:
我使用过jdk1.6.0_35
xjc -version xjc版本“JDK 6中的JAXB 2.1.10” 用于XML绑定的JavaTM体系结构(JAXB)参考实现,(构建JAXB 2.1.10 JDK 6)