2014-08-30 115 views
0

我正在使用以下方法来创建Web服务客户端。我可能想知道是否在创建如下的存根实例后建立了客户端和服务器之间的连接。 否则客户端和服务器之间的连接调用远程方法调用后建立如stub.xxxmethod()myervicePort.xxxMetho()Webservice客户端创建方法

RPC/Encoded 
stub = new MyWsRPCPortStub(new URL(), new MyWsRPCLocator()); 
stub.setTimeout(pdbTimeout); 

Document/Literal 
MyServicePort myervicePort = service.getMyServicePort(); 

学习上的问题,我要决定何时存根实例将被创建后?我的意思是将有两种方式:

1在应用程序中创建只有一个存根实例,我的意思是我会用单例模式

2 - 每次调用一个方法调用之前创建存根实例

什么如果我只使用一个存根实例与多线程appiication,同时每个线程开放区别插座在调用stub.xxMethod()

同时 T1-> stub.xxMethod() T2->存根。 xxMethod() T3-> stub.xxMethod()

回答

1

首先,您提到在客户端使用Web服务的许可不取决于Web服务风格是RPC还是文档文字。两种风格的客户端都是一样的。这些样式仅仅决定了如何在客户端和服务器之间交换SOAP消息的结构。开始的帖子: - here

使用通过HTTP运行的SOAP协议在客户端和服务器之间发送消息。因此,客户端和服务器之间的通信应该主要看作是一个普通的HTTP请求/响应模型,而不是在何时以及如何建立和维护它们之间的连接,这是底层TCP协议的工作;并且Web服务客户端和底层操作系统中的API为我们完全抽象出这些细节。

但是,如果您想知道Web服务客户端何时发出HTTP请求,您可以使用任何数据包捕获工具(例如“wireshark”)来跟踪它。通常,如果您只有一种方法的Web服务,当您使用Service service = Service.create(url, qname) api和YourWSInterface.xxxmethod()上的HTTP POST时,通常会收到HTTP GET请求。

关于何时创建存根;在多线程环境中;如果您打算在发送到Web服务之前使用客户端存根上的BindingProvider来设置数据(而不仅仅是只读的调用)是;您需要在客户端代码中使用一些syhcnronization(使用单个实例)或创建一个客户端代理池(多个池实例);取决于您的应用程序的要求。

我希望我已经回答了这个问题。

+0

后两句对我来说已经够用了。 TNKS。 – 2014-08-31 18:38:39

+0

非常感谢SO,如果它有帮助upvote对我来说! – Abhin 2014-09-01 06:05:34

+0

当多个线程使用相同的存根实例时,每个线程都可以打开不同的连接,请查看我上面更新的问题 – 2014-09-01 12:08:57