【问题标题】:Webservice client creation approachWebservice客户端创建方法
【发布时间】:2014-10-24 11:49:26
【问题描述】:

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

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

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

在了解了上述问题后,我将决定何时创建存根实例?我的意思是有两种方法:

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

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

如果我只使用一个带有多线程应用程序的存根实例,每个线程在调用 stub.xxMethod() 时同时打开不同的套接字会怎样

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

【问题讨论】:

    标签: java web-services jax-ws rpc


    【解决方案1】:

    首先,您提到的在客户端使用 Web 服务的所有方法并不取决于 Web 服务样式是 RPC 还是 Document Literal。两种样式的客户端都是相同的。这些样式仅仅决定了客户端和服务器之间交换的 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 来设置数据(而不仅仅是只读调用);是的;您需要在客户端代码中进行一些同步化(使用单个实例)或创建客户端代理池(多个池化实例);取决于您的应用程序的要求。

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

    【讨论】:

    • 最后两句话对我来说已经足够了。坦克。
    • 如果多个线程使用同一个存根实例,每个线程可以打开不同的连接,请看我上面更新的问题
    • 我认为使用一个存根可能会产生问题,因为它不是线程安全的。 stackoverflow.com/questions/4385204/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 2011-04-05
    • 2011-11-19
    • 1970-01-01
    • 2014-12-12
    相关资源
    最近更新 更多