您真的了解@WebService吗?
SOAP Web服務(wù)無論如何都不是最先進(jìn)的技術(shù)-盡管它仍然存在,但是基于REST的Web服務(wù)卻提供了激烈的競(jìng)爭(zhēng)。 無論如何–這絕對(duì)不是REST vs SOAP帖子!
我觀察到了一些實(shí)例,至少可以說,使用基于Java的SOAP Web服務(wù)的方式不太理想。 我認(rèn)為,這是由于對(duì)一般的JAX-WS (基于SOAP的Web服務(wù)的Java EE規(guī)范)的一些基本知識(shí)缺乏了解而引起的。
這篇文章中提到的是與使用JAX-WS構(gòu)建的基于SOAP的Web服務(wù)相關(guān)的基本知識(shí)。 討論的一些要點(diǎn)是:
- @WebService批注的POJO的生命周期是多少?
- 線程安全嗎? 如果在您的Web服務(wù)上觸發(fā)并發(fā)客戶端請(qǐng)求會(huì)怎樣?
@WebService批注
從技術(shù)上講,@ WebService批注是將POJO轉(zhuǎn)換為SOAP端點(diǎn)所需的全部。 不足為奇的是,這就是我們通常要做的全部工作–用@WebService和其他輔助注釋(例如@ WebMethod,@ WebParam等)注釋類,部署WAR,啟動(dòng)SoapUI ,運(yùn)行一些測(cè)試并榮耀一下!
您應(yīng)該了解有關(guān)用@WebService注釋的POJO的事情
- 由Web容器提供在WAR中部署的帶有@WebService批注的POJO(這很重要)
- 生命周期 – POJO的單個(gè)實(shí)例服務(wù)于客戶端的請(qǐng)求。 非常類似于Servlet。
- 并發(fā)方面 (線程安全)–它們不是線程安全的 。 多個(gè)線程可以同時(shí)訪問 Bean的同一實(shí)例。 盡管如果您的服務(wù)是無狀態(tài)的,即不使用實(shí)例變量來存儲(chǔ)狀態(tài),這不是問題,盡管您可能仍然會(huì)遇到可伸縮性問題(畢竟,它只是一個(gè)實(shí)例!)。 如果您的POJO使用實(shí)例變量存儲(chǔ)狀態(tài),那么您將陷入困境,并且肯定會(huì)遇到由于并發(fā)線程訪問Web服務(wù)類的單個(gè)實(shí)例而導(dǎo)致行為不一致的問題。
。
- 人們應(yīng)該使Web服務(wù)成為無狀態(tài)的 –忘卻風(fēng)格。 不要最終將狀態(tài)存儲(chǔ)在實(shí)例變量中
- 如果您確實(shí)選擇使用實(shí)例變量,請(qǐng)確保您是開發(fā)人員,以線程安全的方式對(duì)Web服務(wù)進(jìn)行編碼。 這里有多個(gè)選項(xiàng),其中一些選項(xiàng)包括使用良好的舊同步 (雖然還不理想!), 線程安全集合 (ConcurrentHashMap)等。
- 最佳解決方案IMO –如果使用的是與Java EE兼容的應(yīng)用服務(wù)器(例如Weblogic),則應(yīng)始終將Web服務(wù)部署為EJB (在這里我不會(huì)深入探討EJB的詳細(xì)信息!您可以參考我以前的文章)如果有興趣)。
- 你會(huì)從中得到什么? (1)EJB 默認(rèn)是線程安全的 。 您無需擔(dān)心將并發(fā)和線程安全作為業(yè)務(wù)邏輯的一部分–您可以免費(fèi)獲得它! (2) EJB是池化組件 –容器將實(shí)例緩存在內(nèi)存中,并根據(jù)請(qǐng)求將其分配給客戶端。 免費(fèi)的可伸縮性 ( 注意 – EJB池配置是特定于容器的,并且每個(gè)服務(wù)器都定義了實(shí)現(xiàn)此目標(biāo)的特定方式)(3) EJB默認(rèn)是跨國(guó)的 –如果您將后端數(shù)據(jù)庫(kù)作為Web服務(wù)邏輯的一部分進(jìn)行訪問,EJB是理想的(事務(wù)的細(xì)節(jié)最好由真正了解它們的人來處理!我不會(huì)試圖表現(xiàn)得好像我知道它們是端到端一樣讓自己感到尷尬)
- 如何“啟動(dòng)”我的Web服務(wù)? (1) 僅使用@Stateless批注 –這將使您純粹的POJO變成一個(gè)成熟的EJB ,它現(xiàn)在可以享受所有容器服務(wù)(2) 將您的Web服務(wù)部署為不是作為WAR,而是作為打包在EAR中的EJB-JAR 。 這將確保EJB容器抓住您的POJO,并編織出我一直吹牛的所有魔力!
測(cè)試中
我不是測(cè)試專家,但是JMeter這樣的工具可以讓我看起來更聰明! 為自己和用戶JMeter提供一個(gè)方便,以簡(jiǎn)化SOAP Web服務(wù)測(cè)試過程。 沒那么難。 下面的瑣碎示例
客戶角度
- 至于從現(xiàn)有的WSDL生成存根,我肯定會(huì)選擇Java SE本身內(nèi)的標(biāo)準(zhǔn)功能 。 我只是在說明這一點(diǎn),因?yàn)檫^去它對(duì)我來說是完美無缺的,而不是嘗試使用其他實(shí)現(xiàn)(例如Axis 2或Apache CXF)
- 我并不是要破壞它們,但是當(dāng)JDK本身有一個(gè)有據(jù)可查的標(biāo)準(zhǔn)工具時(shí),我看不到浪費(fèi)時(shí)間研究其他東西的價(jià)值! 只需跳到JAVA_HOME / bin ,尋找wsimport命令并進(jìn)行破解即可。
- 提供存根生成功能的大多數(shù)IDE都利用此工具
這只是種快速的咆哮。 希望有道理
干杯!
翻譯自: https://www.javacodegeeks.com/2015/02/do-you-really-understand-webservice.html
總結(jié)
以上是生活随笔為你收集整理的您真的了解@WebService吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑密码忘记了怎么办忘记电脑密码了如何进
- 下一篇: 台式电脑怎么连接蓝牙无线耳机的方法台式电