1

我非常坚持使用 Axis2 框架从服务器 WSDL 生成客户端存根的基于 SOAP 的集成。场景如下:

  1. 首先总是有一个登录 API 调用,它在 SOAP 正文中给出成功响应,在 HTTP 标头中给出临时重定向。还提供了一个 URL,其中包含 HTTP 标头的 Location 字段中的会话 ID。
  2. 需要在此重定向位置进行下一次 API 调用。在相同的 TCP 连接中,以获得正确的响应。
    1. 现在,问题是,作为使用 Axis2 生成的存根的 Web 服务实现的一部分,我需要重新加载此重定向 URL 并将其重新实例化为 --- "stub=new Stub(newurl)"
    2. 一旦完成,它就会创建一个新的 TCP 连接,因此,下一个请求会给出“会话 ID 无效”的响应,因为它与登录 API 不同步。

我已经尝试了该论坛中提到的所有解决方案,但没有任何效果。例如——


MultiThreadedHttpConnectionManager httpConnectionManager = new MultiThreadedHttpConnectionManager();
            HttpClient httpClient = new HttpClient(httpConnectionManager);


            ServiceClient serviceClient = stub._getServiceClient();
            Options opts = stub._getServiceClient().getOptions();

            opts.setTo(new EndpointReference(prop.getProperty("target_end_point_url")));
            opts.setProperty(HTTPConstants.REUSE_HTTP_CLIENT, Constants.VALUE_TRUE);
            opts.setProperty(HTTPConstants.CACHED_HTTP_CLIENT, httpClient);

            serviceClient.setOptions(opts);

            stub._setServiceClient(serviceClient);

同样,我也尝试了许多其他选择。但这根本没有帮助。

4

1 回答 1

0

面临完全相同的问题。以下步骤解决了该问题。1.使用HttpClient,进行登录。不要使用存根对象来执行登录。2. 使用 Location Header URL,创建新的存根对象,即 stub = new Stub(locationURL)。(您现有的选项设置应保留。) 3. 有一个默认超时,服务器断开 TCP 连接。就我而言,它是 50 秒。因此,一旦我在步骤 1 中执行登录,我就会每 40 秒执行一次计时器,以使用相同 HttpClient 对象的 HeadMethod 向新位置 URL 发送一个空请求。

于 2013-06-01T06:14:18.053 回答