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

问题描述:

我使用JAXWS生成了一个Web服务客户端。我注意到,当使用JAXWS客户端时,实例化Service*PortType类需要一段时间。因此,每次需要进行请求时,实例化Service*PortType类并不是一个好主意。在Web应用程序中使用全局服务和* PortType类?

  • Service*PortType类设置为整个Web应用程序的全局类安全吗?它有什么优点和缺点?
  • 请求/响应是否有可能切换到不同的请求/响应?
  • 当您在服务中调用某个方法时,它是否会创建一个新的连接?或者它只是重复使用旧的连接?
  • 如果它只是重​​复使用旧连接,那么可能存在一些线程问题?

还给出了代码,port.calculate(requestParam)其中port是一个全局变量,会发生什么,如果多个线程simultaneuosly叫calculate()方法?每个线程会为每个计算调用创建一个新线程吗?或者在继续下一个呼叫之前等待每个呼叫完成?如何处理电话?我只是担心我可能会混合一些请求和响应。

感谢先进!

你是对的担心。这些端口不是线程安全的,但是最长时间创建的服务是线程安全的。没有这方面的官方文档,但它被声明为here,并且在forum post中进行了一项实验,显示了同一端口上的多个请求导致了乱码请求。建议的方法是创建一个服务和一个端口对象池,您可以从中检出请求。另一种选择是使用CXF,它确保客户对象的线程安全,并且更加明确如何在文档中跨线程共享。

+0

Hi Pace!感谢您的回复!通过创建一个端口对象池意味着什么?我应该创建,例如,10个端口对象并使用哪一个可用?或者每次需要创建请求时都应该调用'getServiceHttpSoap11Endpoint()'?如果我不会改变端口的设置(例如地址),并且只会用它来调用Web服务方法(例如'calculate()'),它是否仍然会导致问题? – Arci 2013-02-20 02:32:25

+0

另外,我读过你给出的链接,我感到困惑。什么是代理?或者它仅仅是服务类的替代术语?为什么'port.calculate(requestParam)'在同一时间在不同线程中调用时会导致问题?我想当你调用它时,它会创建一个连接到Web服务方法的新实例。因为它是安全的,因为连接与其他线程使用的不同。 – Arci 2013-02-20 02:33:08

+1

是的,一个对象池将创建10个端口对象,然后在可用时重用它们。这是使用有限资源(如数据库连接(请参阅c3p0)或线程(请参阅ExecutorService))的常用方法。从我读过的所有东西,即使你只是调用不同的参数计算,它都可能导致问题。问题不在于请求都使用相同的连接对象(那些由Java btw内部池化的),但是还有一些其他状态不打算重用。 – Pace 2013-02-20 14:29:05