wildfly_从WildFly 9(子系统)中运行OkHttpClient
wildfly
幾天前, 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連接時,我收到有關自簽名證書的警告,但是可以按照Httpreg的說明通過Http2連接進行連接并獲取UI。
運行OkHttpClient
如前所述,WildFly監視客戶端是WildFly服務器內部的子系統。 我寫了一些客戶端代碼,該代碼正在子系統中運行(縮短):
OkHttpClient httpClient;httpClient = new OkHttpClient();// DO NOT USE IN PRODUCTION, allow all hostnameshttpClient.setHostnameVerifier(new NullHostNameVerifier());setKeystore(httpClient); // Use custom ssl factoryString uri = "https://...:8443/";Request request = new Request.Builder().url(uri).addHeader("Accept", "application/json").get().build();// sync execution just for the postResponse 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>從上面的代碼片段中,您可以看到okhttp和okio jars打包在模塊中,并且也可用于我的客戶端代碼。
現在,已經對module.xml進行了調整,并且我的子系統正在使用Http2 :-)
翻譯自: https://www.javacodegeeks.com/2015/07/running-okhttpclient-from-within-wildfly-9-subsystem.html
wildfly
總結
以上是生活随笔為你收集整理的wildfly_从WildFly 9(子系统)中运行OkHttpClient的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我为什么会买一款2300元的鼠标我为什么
- 下一篇: 内存 增量数据持久_内存中数据模型和大数