gae代码_GAE中的Java EE
gae代碼
云計(jì)算是一個(gè)快速增長(zhǎng)的領(lǐng)域,正在為未來的IT基礎(chǔ)架構(gòu)定義路線圖。 如果您想生活在不斷發(fā)展的邊緣,則不應(yīng)該只是從旁觀望,而應(yīng)該嘗試一下! 另一方面,企業(yè)Java已經(jīng)存在了很長(zhǎng)一段時(shí)間,目前已經(jīng)處于第六步。 隨著時(shí)間的流逝,各個(gè)專家組不斷完善規(guī)范,修正了先前版本的錯(cuò)誤,盡管存在復(fù)雜性,但簡(jiǎn)化了用法,當(dāng)然還增加了有趣的新技術(shù)。
公司以及開發(fā)人員本身已經(jīng)投入了大量資源,工作和知識(shí)來掌握他們的Java企業(yè)技術(shù),而云計(jì)算主要是由于其邏輯限制,其工作方式與我們?cè)谥亓考?jí)Java中所使用的完全不同。企業(yè)世界。 潛在的問題很明顯–為了遷移到云端,我們真的必須忘記并丟棄過去幾年Java企業(yè)編程中學(xué)到的很多知識(shí)嗎?
Google必須根據(jù)自己的需要開發(fā)云基礎(chǔ)架構(gòu),并且處于向公眾提供云服務(wù)的理想位置,因此它是最早提供免費(fèi)PaaS服務(wù)的公司之一。 該服務(wù)名為GoogleAppEngine (GAE),并且在最初的產(chǎn)品中服務(wù)于Python應(yīng)用程序。 由于這項(xiàng)初始服務(wù)取得了可喜的成功,并且Java作為一種開放源代碼的企業(yè)就緒語言而廣受歡迎,因此他們將GAE服務(wù)也擴(kuò)展為可以托管Java應(yīng)用程序。
使用Java,通常的做法是將良好且成功的自定義框架或項(xiàng)目轉(zhuǎn)換為規(guī)范。 最后兩個(gè)Java EE規(guī)范是其JPA,JSF,EJB3以及最新的CDI和BeanValidation的很好示例。 同時(shí),提到的前三個(gè)進(jìn)行了升級(jí),這恰好證實(shí)了它們的廣泛采用和良好的用戶反饋。 CDI是一種新的企業(yè)規(guī)范,它基于流行的自定義應(yīng)用程序框架(例如JBoss Seam,Google Guice和Spring框架)中的最佳品種。 它允許簡(jiǎn)單的類型安全的配置,這對(duì)于大型項(xiàng)目而言非常有用,并且可以與當(dāng)今功能強(qiáng)大的IDE工具完美地結(jié)合使用。
由于Google絕對(duì)了解最佳做法,因此他們會(huì)盡量支持現(xiàn)有標(biāo)準(zhǔn)。 但是由于云處理有其特定的限制,所以并非所有的事情都那么簡(jiǎn)單。 這就是本文的重點(diǎn)。 如何保持標(biāo)準(zhǔn)技術(shù)的存在,同時(shí)仍然遵守云的限制。 我們將更詳細(xì)地研究如何引入CDI,以及如何將其與JPA,JSF和BeanValidation透明有效地集成,同時(shí)還將替換缺少的EJB3功能。 我們還將介紹所有主要的GAE限制以及如何在Java企業(yè)環(huán)境中正確解決這些限制。
由于當(dāng)今的解決方案需要經(jīng)過全面測(cè)試,因此還將介紹一種新的測(cè)試方法。 這項(xiàng)新的測(cè)試允許透明的環(huán)境切換,使測(cè)試真正適用于Java。 運(yùn)行一次,到處測(cè)試。 這也適用于“我們的” GAE環(huán)境。
CDI簡(jiǎn)介
我們不會(huì)過多地介紹什么是CDI及其工作原理。 這是另一篇文章的主題。 在這一篇中,我們將展示如何在GAE中最好地使用它。
GAE的一個(gè)主要限制(如果實(shí)際上不是“那個(gè)”)是30秒的請(qǐng)求/響應(yīng)時(shí)間限制。 這意味著,如果應(yīng)用程序在不到30秒內(nèi)沒有響應(yīng),則GAE本身將終止該線程并引發(fā)適當(dāng)?shù)漠惓!?另一方面,如果一段時(shí)間未使用該應(yīng)用程序,則GAE只會(huì)關(guān)閉所有應(yīng)用程序?qū)嵗?#xff0c;這意味著下一個(gè)請(qǐng)求將承受啟動(dòng)新實(shí)例的開銷。 最近,此功能有了一些改變,增加了“ Always On”功能,但不幸的是它并非免費(fèi)提供。
為了使CDI能夠正常工作,CDI運(yùn)行時(shí)需要在初始化時(shí)檢查所有可能的bean,從而花費(fèi)大量時(shí)間確定和驗(yàn)證應(yīng)用程序的bean配置。 考慮到在第一個(gè)請(qǐng)求上,您可能不僅會(huì)處理請(qǐng)求,還會(huì)引導(dǎo)整個(gè)應(yīng)用程序,因此必須努力地嘗試盡可能延遲地初始化Bean,這意味著將初始化處理時(shí)間減至最少。 要考慮的另一件事是過濾掉所有在應(yīng)用程序中實(shí)際上不用作Bean的類。 在Joss的CDI和RI實(shí)施Weld中,我們有幾種不同的方法來限制潛在bean類的列表。 一種方法是在beans.xml中定義一個(gè)過濾元素,另一種方法是提供具有列出的bean類名的確切bean-classes.txt文件。
與每個(gè)框架一樣,CDI需要在您的應(yīng)用程序中有一個(gè)切入點(diǎn)。 在Web應(yīng)用程序中,引導(dǎo)自定義框架的最簡(jiǎn)單方法通常是通過Servlet偵聽器。 CDI或?qū)S糜赪eld也不例外。 但是,但重要的是,這只是一個(gè)初始引導(dǎo)程序,它僅設(shè)置了CDI BeanManager和應(yīng)用程序的Bean。 由于我們?cè)赪eb應(yīng)用程序中,因此我們的邏輯可能通過servlet和過濾器進(jìn)行訪問。 要將CDI與這些組件一起實(shí)際使用,必須引入其他集成機(jī)制。
對(duì)于“標(biāo)準(zhǔn)” Web容器,例如Tomcat和Jetty,Weld已經(jīng)提供了完整的現(xiàn)成的CDI集成。 但是,由于GAE并不是純粹的Jetty,而是沒有所有功能的基于Jetty的派生工具-主要是出于安全原因,我們需要找到與CDI集成的另一種方式。
這并不像乍看起來那樣困難。 所有的CDI實(shí)現(xiàn)都為自定義擴(kuò)展留出了一定的空間,這些擴(kuò)展可以輕松地用于獲取應(yīng)用程序的BeanManager實(shí)例。 這確實(shí)使您的應(yīng)用程序在不同的CDI實(shí)現(xiàn)之間有點(diǎn)不可移植,但是如果您確實(shí)需要它,可以輕松地對(duì)其進(jìn)行抽象。 在Weld的情況下,我們使用BeanManager在引導(dǎo)時(shí)也作為servlet上下文屬性添加的事實(shí)。 這樣,我們可以輕松地創(chuàng)建初始Servlet的CDI感知委托。 這種工作方式是非CDI感知的servlet接收請(qǐng)求,然后將其委托給CDI感知的類似于servlet的委托。 好的,現(xiàn)在我們可以啟動(dòng)并運(yùn)行我們的超級(jí)惰性CDI bean,以準(zhǔn)備滿足某些請(qǐng)求。 讓我們看一下這些bean如何真正做一些嚴(yán)肅的事情,例如與您的數(shù)據(jù)庫進(jìn)行交互。 繼續(xù)參加JPA!
JPA用法
盡管GAE擁有自己的低級(jí)持久性API(一個(gè)簡(jiǎn)單的類型化DataStore),但JavaEE開發(fā)人員更習(xí)慣于JPA API,因此GAE也提供了這種功能。 但不足為奇的是,有很多合理的限制必須要意識(shí)到。
實(shí)際數(shù)據(jù)庫不是眾所周知的關(guān)系數(shù)據(jù)庫,而是高度可伸縮的非關(guān)系BigTable。 雖然我們通常只有一個(gè)關(guān)系數(shù)據(jù)庫實(shí)例,但GAE實(shí)際上有一個(gè)未知數(shù)量的BigTable實(shí)例(或節(jié)點(diǎn)),從用戶的角度來看,它在寫入數(shù)據(jù)時(shí)會(huì)隨機(jī)選擇。 為了進(jìn)行此類ACID寫入,任何“相關(guān)”數(shù)據(jù)都必須位于同一節(jié)點(diǎn)上,這意味著需要精心設(shè)計(jì)JPA關(guān)系。 已經(jīng)存在現(xiàn)有的OSS框架,可以最大程度地幫助您解決此關(guān)系問題。 在我們的案例中,我們?cè)跇?biāo)準(zhǔn)化JPA的基礎(chǔ)上開發(fā)了自己的簡(jiǎn)單解決方案,該解決方案在代理實(shí)體的幫助下隱藏了變通方法的實(shí)現(xiàn)細(xì)節(jié)。 實(shí)際上,每個(gè)使用的實(shí)體實(shí)例都是一個(gè)代理實(shí)例,該代理實(shí)例攔截對(duì)潛在關(guān)系的調(diào)用并將其轉(zhuǎn)換為適當(dāng)?shù)牟檎摇?
眾所周知,JPA的一部分也是其二級(jí)緩存,在我們的案例中,它非常方便。 無需進(jìn)行昂貴的查詢查找,我們可以輕松地緩存許多以前查找的數(shù)據(jù),尤其是考慮到緩存在GAE中“便宜”。 借助此功能,以一種非常懶惰的方式實(shí)現(xiàn)初始JPA EntityManagerFactory初始化也很有意義。 如果可以使用以前緩存的數(shù)據(jù)來處理查找,則不必實(shí)際實(shí)例化EntityManagerFactory。
JSF,BeanValidation和緩存
為了使用JSF2,必須正確設(shè)置初始上下文參數(shù),不幸的是,甚至要使用一些技巧。 這些參數(shù)需要禁用任何多線程JSF行為,而我們使用的這種破解方法使我們過去無法使用類。 不允許使用InitialContext。 要注意的另一件事是,GAE的類路徑中已經(jīng)帶有EL 1.0(統(tǒng)一表達(dá)式語言庫),由于使用了一些奇怪的規(guī)則而不是應(yīng)用程序附帶的EL庫,因此使用了它-這意味著我們被EL 1.0功能所困擾,需要一些解決方法來調(diào)用參數(shù)化的bean方法。
實(shí)際的實(shí)現(xiàn)用法取決于我們要從BeanValidation中獲得多少驗(yàn)證功能。 在我們的案例中,事實(shí)證明,我們實(shí)際上只需要一個(gè)簡(jiǎn)單的bean屬性驗(yàn)證,這使我們自己實(shí)現(xiàn)并使用幾個(gè)BeanValidation SPI變得更加容易和輕巧。 由于所有實(shí)際用法都隱藏在適當(dāng)?shù)腂eanValidation API后面,因此,如果需要,可以用更復(fù)雜的實(shí)現(xiàn)替換它。
正如我們已經(jīng)提到的,在GAE中進(jìn)行緩存是“便宜的”,而您有很多。 這應(yīng)該鼓勵(lì)您嘗試并緩存盡可能多的內(nèi)容。 當(dāng)然,您應(yīng)該高度注意緩存逐出策略,以及如何在所有層上正確應(yīng)用它,以免遺留任何陳舊的數(shù)據(jù)。 要記住的另一件事是,隨著應(yīng)用程序版本的更新,緩存數(shù)據(jù)的結(jié)構(gòu)可以更改,從而破壞了序列化協(xié)定。 同樣,GAE UI管理界面允許管理員更改數(shù)據(jù)。 因此,應(yīng)該通過應(yīng)用程序的管理界面公開“清除所有緩存”操作。
測(cè)試中
GAE的另一個(gè)優(yōu)點(diǎn)是,即使在本地環(huán)境中,它也易于使用。 設(shè)置對(duì)應(yīng)用程序的測(cè)試應(yīng)該不太困難。 與我們使用的其他技術(shù)一樣,我們的測(cè)試框架也應(yīng)該能夠支持運(yùn)行時(shí)環(huán)境更改。 在JBoss,我們開發(fā)了兩個(gè)真正的最新測(cè)試框架來幫助您輕松實(shí)現(xiàn)這一目標(biāo)-Arquillian和ShrinkWrap 。 ShrinkWrap項(xiàng)目抽象了實(shí)際的部署位,而Arquillian抽象了實(shí)際的運(yùn)行時(shí)容器(又稱環(huán)境)。 為了在GAE中測(cè)試您的應(yīng)用程序,我們只需要編寫一個(gè)能夠在嵌入式模式下運(yùn)行GAE的適當(dāng)?shù)腁rquillian容器實(shí)現(xiàn)即可。 這樣,測(cè)試代碼與環(huán)境無關(guān),其中實(shí)際環(huán)境由測(cè)試類路徑上的實(shí)際單個(gè)Arquillian容器實(shí)現(xiàn)確定。
結(jié)論
我們可以看到為GAE開發(fā)應(yīng)用程序并不意味著我們需要放棄先前學(xué)習(xí)的JavaEE技術(shù)。 但是,在使用這些技術(shù)時(shí),我們確實(shí)需要更加謹(jǐn)慎,根據(jù)現(xiàn)有和潛在的GAE限制評(píng)估每個(gè)用例。 我們還可以看到使用標(biāo)準(zhǔn)化API和良好框架隱藏環(huán)境依賴性的好處。
在JBoss Weld項(xiàng)目中,我們鼓勵(lì)用戶提供任何關(guān)于現(xiàn)有GAE體驗(yàn)的反饋,同時(shí)考慮到所有建議,錯(cuò)誤修復(fù),補(bǔ)丁或批評(píng),同時(shí)使CDI成為與GAE一起使用的愉快平臺(tái)。
Ales Justin將發(fā)表他的“ Google App Engine上的JavaEE:CDI進(jìn)行救援!” 通過在JAXconf上的會(huì)議獲得更多有關(guān)在GAE限制性沙箱中使用Java EE規(guī)范的信息,同時(shí)仍然受益于它提供的可伸縮環(huán)境并保持對(duì)其他Java EE容器的可移植性。 JAXconf將從6月20日- 23 日 ,2011年,在加利福尼亞州圣何塞市 運(yùn)行 。 有關(guān)會(huì)議的更多信息,請(qǐng)?jiān)L問JAXconf網(wǎng)站 。
翻譯自: https://jaxenter.com/java-ee-inside-gae-103153.html
gae代碼
總結(jié)
以上是生活随笔為你收集整理的gae代码_GAE中的Java EE的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一步一步搭建前端监控系统:如何记录用户行
- 下一篇: java服务器限速下载_Java文件下载