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