从WildFly 9(子系统)中运行OkHttpClient

姚煜
2023-12-01

几天前, WildFly 9发布了,可以肯定的重点之一是Undertow Web子系统中对HTTP / 2.0的支持。 由于Hawkular最近已开始使用WildFly 9(从8.2开始)作为其基础服务器,因此尝试将http2用于从Hawkular-Wildfly-Monitor客户端到服务器的连接是很自然的。

这里的一个特点是,在我的情况下,监视器客户端在Hawkular服务器内部运行,但是最后它是在独立的WildFly服务器内部还是Hawkular服务器内部运行都没有关系。

设置

Greg Autric写了一篇博客文章,展示了如何使用脱机CLI在WildFly中设置Http2 ,这在Hawkular情况下也能很好地工作。

帖子中唯一有问题的是,在启动服务器之前设置JAVA_OPTS将忽略来自standalone.conf的所有设置,这在当前的Hawkular版本中将阻止总线代理的正确启动(因为IPv4Only标志为丢失)。

因此,我认为最好修改standalone.conf以将这些选项“添加”到已经存在的其他选项中:

JAVA_OPTS="-Xms64m -Xmx512m -XX:MaxPermSize=256m -Djava.net.preferIPv4Stack=true"
  JAVA_OPTS="$JAVA_OPTS -Xbootclasspath/p:/opt/hawkular-1.0.0.Alpha3-SNAPSHOT/alpn-boot-8.1.3.v20150130.jar"
  JAVA_OPTS="$JAVA_OPTS -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS -Djava.awt.headless=true"

现在,当我启动Hawkular服务器并尝试在https端口上与FireFox连接时,我会收到有关自签名证书的警告,但是可以按照Greg的帖子中的说明通过Http2连接进行连接并获取UI。

运行OkHttpClient

如前所述,WildFly监视客户端是WildFly服务器内部的子系统。 我写了一些客户端代码,该代码正在子系统中运行(缩短):

OkHttpClient httpClient;
   httpClient = new OkHttpClient();

   // DO NOT USE IN PRODUCTION, allow all hostnames
   httpClient.setHostnameVerifier(new NullHostNameVerifier());

   setKeystore(httpClient); // Use custom ssl factory

   String uri = "https://...:8443/";

   Request request = new Request.Builder()
            .url(uri)
            .addHeader("Accept", "application/json")
            .get()
            .build();

   // sync execution just for the post
   Response resp = httpClient.newCall(request).execute();
   System.out.println(resp.toString());

失败?

除了总是使用Http(s)/1.1且从不使用Http2的事实(从最后一个println语句的输出中可以看到)之外,这段代码行之有效:

Response{protocol=http/1.1, code=204, message=....}

我一直在尝试各种选择,直到我认为必须将代码提取到独立的Java SE类中才能更好地进行隔离调试。

我编写了该类,设置了bootclasspath,然后运行它,它运行良好:

Response{protocol=h2, code=204, message=....}

那么区别是什么呢? 我删除了ALPN的bootclasspath设置,然后重新运行,连接恢复为http / 1.1。

这有点奇怪,因为我的客户端子系统在同一台WilFly服务器中运行,该服务器运行Undertow,并且能够处理http2请求,并且在较早的时候通过JAVA_OPTS添加了ALPN类。

现在请记住,WildFly正在使用他们自己的类加载器系统(jboss-modules),该系统在隔离部署和类并限制其可见性和/或泄漏到不应该看到它们的区域时非常强大。

实际上,这也是这里发生的事情。

成功!

因此,我必须将ALPN类显式添加到监视客户module.xml文件中:

<module xmlns="urn:jboss:module:1.3" name="${moduleName}">
    <resources>
      <resource-root path="clients-common.jar"/>
      [...]
      <resource-root path="okhttp.jar"/>
      <resource-root path="okio.jar"/>
    </resources>
    <dependencies>
      <!-- modules required by any subsystem -->
      <module name="javax.api"/>
      [...]
      <system export="true">
        <paths>
          <!-- Needed for HTTP2 and SPDY support-->
          <path name="org/eclipse/jetty/alpn"/>
        </paths>
      </system>
    </dependencies>
  </module>

从上面的代码片段中,您可以看到okhttpokio jar打包在模块中,并且也可用于我的客户端代码。

现在,已经对module.xml进行了调整,并且我的子系统正在使用Http2 :-)

翻译自: https://www.javacodegeeks.com/2015/07/running-okhttpclient-from-within-wildfly-9-subsystem.html

 类似资料: