在Web应用程序中使用全局服务和* PortType类?
问题描述:
我使用JAXWS生成了一个Web服务客户端。我注意到,当使用JAXWS客户端时,实例化Service
和*PortType
类需要一段时间。因此,每次需要进行请求时,实例化Service
和*PortType
类并不是一个好主意。在Web应用程序中使用全局服务和* PortType类?
- 将
Service
和*PortType
类设置为整个Web应用程序的全局类安全吗?它有什么优点和缺点? - 请求/响应是否有可能切换到不同的请求/响应?
- 当您在服务中调用某个方法时,它是否会创建一个新的连接?或者它只是重复使用旧的连接?
- 如果它只是重复使用旧连接,那么可能存在一些线程问题?
还给出了代码,port.calculate(requestParam)
其中port是一个全局变量,会发生什么,如果多个线程simultaneuosly叫calculate()
方法?每个线程会为每个计算调用创建一个新线程吗?或者在继续下一个呼叫之前等待每个呼叫完成?如何处理电话?我只是担心我可能会混合一些请求和响应。
感谢先进!
答
你是对的担心。这些端口不是线程安全的,但是最长时间创建的服务是线程安全的。没有这方面的官方文档,但它被声明为here,并且在forum post中进行了一项实验,显示了同一端口上的多个请求导致了乱码请求。建议的方法是创建一个服务和一个端口对象池,您可以从中检出请求。另一种选择是使用CXF,它确保客户对象的线程安全,并且更加明确如何在文档中跨线程共享。
Hi Pace!感谢您的回复!通过创建一个端口对象池意味着什么?我应该创建,例如,10个端口对象并使用哪一个可用?或者每次需要创建请求时都应该调用'getServiceHttpSoap11Endpoint()'?如果我不会改变端口的设置(例如地址),并且只会用它来调用Web服务方法(例如'calculate()'),它是否仍然会导致问题? – Arci 2013-02-20 02:32:25
另外,我读过你给出的链接,我感到困惑。什么是代理?或者它仅仅是服务类的替代术语?为什么'port.calculate(requestParam)'在同一时间在不同线程中调用时会导致问题?我想当你调用它时,它会创建一个连接到Web服务方法的新实例。因为它是安全的,因为连接与其他线程使用的不同。 – Arci 2013-02-20 02:33:08
是的,一个对象池将创建10个端口对象,然后在可用时重用它们。这是使用有限资源(如数据库连接(请参阅c3p0)或线程(请参阅ExecutorService))的常用方法。从我读过的所有东西,即使你只是调用不同的参数计算,它都可能导致问题。问题不在于请求都使用相同的连接对象(那些由Java btw内部池化的),但是还有一些其他状态不打算重用。 – Pace 2013-02-20 14:29:05