Java 在web应用程序中使用全局服务和*PortType类?

Java 在web应用程序中使用全局服务和*PortType类?,java,web-services,jakarta-ee,jax-ws,Java,Web Services,Jakarta Ee,Jax Ws,我使用JAXWS生成了一个web服务客户端。我注意到,在使用JAXWS客户机时,实例化服务和*PortType类需要一段时间。因此,每次需要发出请求时实例化服务和*PortType类不是一个好主意 将服务和*PortType类设置为整个web应用程序的全局类是否安全?它的优点和缺点是什么 请求/响应是否有可能切换到不同的请求/响应 当您在服务中调用一个方法时,它会创建一个新的连接吗?或者它只是重复使用一个旧的连接 如果只是重用旧连接,那么可能会出现线程问题,对吗 同样给出了代码,port.c

我使用JAXWS生成了一个web服务客户端。我注意到,在使用JAXWS客户机时,实例化
服务
*PortType
类需要一段时间。因此,每次需要发出请求时实例化
服务
*PortType
类不是一个好主意

  • 服务
    *PortType
    类设置为整个web应用程序的全局类是否安全?它的优点和缺点是什么
  • 请求/响应是否有可能切换到不同的请求/响应
  • 当您在服务中调用一个方法时,它会创建一个新的连接吗?或者它只是重复使用一个旧的连接
  • 如果只是重用旧连接,那么可能会出现线程问题,对吗
同样给出了代码,
port.calculate(requestParam)
其中port是一个全局变量,如果多个线程同时调用
calculate()
方法会发生什么?每个线程是否会为每个计算调用创建一个新线程?或者,它会在继续下一个调用之前等待每个调用完成吗?如何处理这些电话?我只是担心我可能会把一些请求和响应混在一起


提前感谢

你担心是对的。端口不是线程安全的,但是创建服务所需时间最长,是线程安全的。这方面没有正式的文档,但是已经说明了这一点,在这篇文章中,我们做了一个实验,显示在同一个端口上的多个请求会导致请求被篡改。建议的方法是创建一个服务和一个端口对象池,您可以从中签出以发出请求。另一种选择是使用CXF,它确实使客户机对象具有线程安全性,并且在文档中更明确地说明了如何跨线程共享。

Hi-Pace!谢谢你的回复!创建端口对象池意味着什么?例如,我应该创建10个端口对象并使用哪一个可用?或者我应该在每次需要发出请求时调用
getServiceHttpSoap11Endpoint()
?如果我不更改端口的设置(例如地址),只使用它调用webservice方法(例如
calculate()
),它还会导致问题吗?是的,对象池将创建10个端口对象,然后在可用时重用它们。这是在有限资源(如数据库连接(请参见c3p0)或线程(请参见ExecutorService))下采用的常见方法。从我读到的所有内容来看,即使您只是使用不同的参数调用calculate,它也可能导致问题。问题不在于所有请求都使用相同的连接对象(这些对象由Java btw内部池化),而是存在一些不打算重用的其他状态。代理是端口的替代术语。该服务创建端口/代理。端口被视为“代理”,因为它们具有与端点相同的所有方法,因此它们是端点的代理。是。每次调用get方法时,它都会创建一个新端口。一、 就个人而言,我会推荐CXF,但我没有确凿的证据或事实支持这一决定。然而,我不确定他们中的任何一个是否会非常注重性能。大多数SOAP库关注服务器性能而不是客户端性能。没问题。请记住,如果使用CXF,可能不需要实现池。