从WildFly 9(子系统)中运行OkHttpClient
幾天前, WildFly 9發(fā)布了,可以肯定的重點之一是Undertow Web子系統(tǒng)中對HTTP / 2.0的支持。 由于Hawkular最近已開始使用WildFly 9(從8.2開始)作為其基礎(chǔ)服務(wù)器,因此嘗試將http2用于從Hawkular-Wildfly-Monitor客戶端到服務(wù)器的連接是很自然的。
這里的一個特點是,在我的情況下,監(jiān)視器客戶端在Hawkular服務(wù)器內(nèi)部運行,但是最后它是在獨立的WildFly服務(wù)器內(nèi)部還是Hawkular服務(wù)器內(nèi)部運行都沒有關(guān)系。
設(shè)置
Greg Autric寫了一篇博客文章,展示了如何使用脫機CLI在WildFly中設(shè)置Http2 ,這在Hawkular情況下也能很好地工作。
帖子中唯一有問題的是,在啟動服務(wù)器之前設(shè)置JAVA_OPTS將忽略來自standalone.conf的所有設(shè)置,這在當(dāng)前的Hawkular版本中將阻止總線代理的正確啟動(因為IPv4Only標志為丟失)。
因此,我認為最好修改standalone.conf以將這些選項“添加”到已經(jīng)存在的其他選項中:
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"現(xiàn)在,當(dāng)我啟動Hawkular服務(wù)器并嘗試在https端口上與FireFox連接時,我會收到有關(guān)自簽名證書的警告,但是可以按照Greg的帖子中的說明通過Http2連接進行連接并獲取UI。
運行OkHttpClient
如前所述,WildFly監(jiān)視客戶端是WildFly服務(wù)器內(nèi)部的子系統(tǒng)。 我寫了一些客戶端代碼,該代碼正在子系統(tǒng)中運行(縮短):
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類中才能更好地進行隔離調(diào)試。
我編寫了該類,設(shè)置了bootclasspath,然后運行它,它運行良好:
Response{protocol=h2, code=204, message=....}那么區(qū)別是什么呢? 我刪除了ALPN的bootclasspath設(shè)置,然后重新運行,連接恢復(fù)為http / 1.1。
這有點奇怪,因為我的客戶端子系統(tǒng)在同一臺WilFly服務(wù)器中運行,該服務(wù)器運行Undertow,并且能夠處理http2請求,并且在較早的時候通過JAVA_OPTS添加了ALPN類。
現(xiàn)在請記住,WildFly正在使用他們自己的類加載器系統(tǒng)(jboss-modules),該系統(tǒng)在隔離部署和類并限制其可見性和/或泄漏到不應(yīng)該看到它們的區(qū)域時非常強大。
實際上,這也是這里發(fā)生的事情。
成功!
因此,我必須將ALPN類顯式添加到監(jiān)視客戶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 jar打包在模塊中,并且也可用于我的客戶端代碼。
現(xiàn)在,已經(jīng)對module.xml進行了調(diào)整,并且我的子系統(tǒng)正在使用Http2 :-)
翻譯自: https://www.javacodegeeks.com/2015/07/running-okhttpclient-from-within-wildfly-9-subsystem.html
總結(jié)
以上是生活随笔為你收集整理的从WildFly 9(子系统)中运行OkHttpClient的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华为ws路由器怎样恢复出厂设置华为ws8
- 下一篇: Clean Sheet – Window