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