通过 HTTPS 连接使用 Web 服务

Consuming a web service over a HTTPS connection

我正在尝试使用 Apache CXF 在 Java 中构建 Web 服务使用者。我已经使用 WSDLToJava 工具生成了所需的 classes。在那之后,我通过 HTTP 使用本地 Web 服务发出了一些测试请求,它们成功了。

由于一切正常,我为使用 HTTPS 进行通信的远程 Web 服务端点生成了 classes。使用服务时,我需要创建服务的新实例 class 以及一个端口(可用 Web 方法的代理)。

这是我在 classes 中遇到的两个问题:

  1. 服务 class 总是需要大约 20 秒的时间来实例化,而本地 Web 服务不会发生这种情况
  2. 当尝试从服务检索端口(代理)class 时,它没有超时,而是挂起,而处理器已使用 70%,最终 JVM 内存不足。

下面是我讲过的两行代码。我什至使用该实用程序生成了一个测试 class,结果是一样的。

TestService ss = new TestService(wsdlURL, SERVICE_NAME); TestSoap port = ss.getTestSoap();

您知道为什么会出现这种行为吗?

我已经设法解决了这个问题。我会告诉你,因为也许有人会觉得这很有用。

我做了一些测试,似乎过了一段时间后,测试方法开始挂起 java.lang.ClassLoader.defineClass1()

出现问题是因为我是 运行 Ant 目标,它使用 WSDL2Java 生成 classes 并且 JAVA_HOME 变量指向 Java 8. 测试是在使用 Java 的 IDEA 中进行的 7. 我将 IDEA 切换为使用 Java 8 ant 现在它们可以正常工作了。

经过进一步调查,我发现了真正的问题。 PermGen 在加载代理 class 时填充了很多 classes (~7.5k)。由于 Java 8 没有任何 PermGen,所以问题没有出现。我添加了 JVM 标志 -XX:PermSize-XX:MaxPermSize 并增加了它的大小 Java 7.