【问题标题】:Consuming a web service over a HTTPS connection通过 HTTPS 连接使用 Web 服务
【发布时间】:2015-02-19 10:13:25
【问题描述】:

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

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

这是我对这个类的两个问题:

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

下面是我谈到的两行代码。我什至用这个工具生成了一个测试类,结果是一样的。

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

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

【问题讨论】:

  • 分析应该是一个好的开始。

标签: java web-services cxf


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多