使用NoSQL实现实体服务–第4部分:Java EE
值得注意的是,對于他的那種R&D工作,我完全不需要使用Java EE。 我不需要像Glassfish這樣的JEE服務(wù)器所提供的安全性或交易功能,我可能可以使用比Tomcat或Jetty輕一些的東西。 但是,我喜歡JEE的便利性和功能,許多在像Tomcat這樣的標(biāo)準(zhǔn)Java應(yīng)用程序服務(wù)器上開始使用的應(yīng)用程序最終都會將JEE功能移植到Tomcat中(例如JAX-WS)或遷移到完整的JEE服務(wù)器(例如玻璃魚。
Tomcat的用戶經(jīng)常需要JEE功能-這是在Apache上啟動TomEE項(xiàng)目的主要理由。 該項(xiàng)目將JEE Web Profile功能添加到普通的Tomcat堆棧中,因此它可以處理EJB和JAX-WS之類的事情。
將業(yè)務(wù)邏輯分為Bean。
我的應(yīng)用程序已經(jīng)有2個不同的層。 第一個(從消費(fèi)者的角度來看)是Web服務(wù)層,其任務(wù)是提供所有Web服務(wù)操作以及其他服務(wù)特定任務(wù),例如處理定制SOAP標(biāo)頭和消息傳遞元數(shù)據(jù) ,這些問題有助于解決冪等問題。 最后一層是數(shù)據(jù)庫訪問層 ,負(fù)責(zé)與數(shù)據(jù)庫通信以及處理我的Product實(shí)體的持久性和檢索。
我現(xiàn)在要添加的第三層也是最后一層是連接前兩層的中間層-業(yè)務(wù)邏輯層。 該層將負(fù)責(zé)實(shí)施產(chǎn)品實(shí)體服務(wù)的規(guī)則和決策,例如確保在執(zhí)行持久性操作之前,存在,添加或驗(yàn)證任何語義上重要的信息。
這種語義上重要的信息的一個例子是產(chǎn)品的“狀態(tài)”。 在我的模型中,我允許產(chǎn)品在多個狀態(tài)之間轉(zhuǎn)換,以維持嚴(yán)格的產(chǎn)品生命周期。 這些階段如下,并且本質(zhì)上是線性的(每個狀態(tài)都跟隨最后一個狀態(tài))…
- 臨時(shí)
- 有貨
- 可售
- 已停產(chǎn)
- 已刪除
在我的業(yè)務(wù)邏輯層中,我的Product Manager bean確保每個實(shí)體的狀態(tài)對于每個服務(wù)操作都有意義。 例如,如果您對Product調(diào)用createProduct()操作,則給定的Product必須具有“臨時(shí)”狀態(tài)。 如果沒有,我的邏輯將對其進(jìn)行更改。
這些規(guī)則對于每個企業(yè)都是唯一的,因此它不是一個適合所有解決方案的規(guī)模。 在現(xiàn)實(shí)世界中,規(guī)則引擎或類似的工具將是理想的選擇,因?yàn)樗鼘⒃诙x和管理這些規(guī)則時(shí)提供更多的靈活性。 但是,對于我的基本R&D需求,此硬編碼解決方案很好,并且充分展示了提供業(yè)務(wù)邏輯層的好處,因?yàn)槟梢詫I(yè)務(wù)邏輯“關(guān)注點(diǎn)”與消息和數(shù)據(jù)庫處理邏輯分開 。
一種數(shù)據(jù)模型可以全部統(tǒng)治。
所有這些層都有一個共同點(diǎn),那就是它們管理的數(shù)據(jù)(aka Entity)對象。 產(chǎn)品實(shí)體由XML表示,由XSD描述并由WSDL引用。 這些定義被JAX-WS轉(zhuǎn)換為Java對象,并且這些相同的Java對象在整個代碼中本機(jī)使用,從而避免了任何數(shù)據(jù)模型轉(zhuǎn)換 。
這種技術(shù)被稱為“避免轉(zhuǎn)換”,是這種基于NoSQL的實(shí)體服務(wù)開發(fā)技術(shù)的特殊樣式的主要優(yōu)點(diǎn)之一。
避免轉(zhuǎn)換是一種最佳實(shí)踐,可以提高服務(wù)的可重用性和可組合性– soapatterns.org。
實(shí)質(zhì)上,通過此服務(wù)開發(fā),我設(shè)法在每個層中使用了這些相同的Java數(shù)據(jù)對象,但仍保持了真正的合同優(yōu)先的開發(fā)方法。 對于開發(fā)人員而言,這確實(shí)是個好消息。 我還避免了對數(shù)據(jù)模型轉(zhuǎn)換層的需求,當(dāng)消息和數(shù)據(jù)庫之間的數(shù)據(jù)模型不兼容時(shí)(對于ESB銷售人員而言,這是個壞消息),這常常就變得很必要。
使用NoSQL還使我完全避免了對表和數(shù)據(jù)關(guān)系使用任何SQL DDL,并且不需要任何復(fù)雜的對象映射,例如處理傳統(tǒng)ORM所需的那些映射。 我什至可以隨時(shí)間推移變形我的數(shù)據(jù)模型,而不會經(jīng)常破壞東西(非常適合服務(wù)版本控制)。
關(guān)于保持JEE簡單的注意事項(xiàng)。
為了減少與JEE相關(guān)的部署和配置麻煩,我使用了新的部署和打包機(jī)制,該機(jī)制使您可以在同一應(yīng)用程序WAR文件中定位EJB和Web應(yīng)用程序。 這使使用JEE功能變得輕而易舉,并大大簡化了Maven的構(gòu)建,因?yàn)槲覂H使用一個項(xiàng)目和零個部署描述符(甚至缺少web.xml!)。
使用EJB 3.1的JEE從未如此簡單,因?yàn)樗F(xiàn)在基于使用一些非常簡單的Java注釋。 例如,指定無狀態(tài)EJB可以是那么簡單,因?yàn)樘砑?#64;Stateless注釋的一類。 這樣做是在告訴應(yīng)用程序服務(wù)器將類部署到池中,以使其具有高可用性,并將對方法的調(diào)用包裝在事務(wù)中。 作為無狀態(tài)Bean,它將沒有會話的概念,并且不會在調(diào)用之間保持任何狀態(tài)(對于無狀態(tài)服務(wù)而言是理想的)。
@Stateless public class ProductsManager為了從應(yīng)用程序的另一部分(例如,從@WebService類)使用此bean,您只需添加正確類類型的引用變量,然后使用@EJB注釋對該變量進(jìn)行注釋。 這告訴應(yīng)用程序服務(wù)器在運(yùn)行時(shí)使用一種稱為依賴項(xiàng)注入的機(jī)制從預(yù)填充的bean池中“注入”正確類型的實(shí)例。
@WebService(...) public class ProductsEntityService implements Products {@EJBprivate ProductsManager bean;...其他有用的JEE功能。
消息驅(qū)動的Bean非常適用于實(shí)現(xiàn)事件驅(qū)動的消息傳遞 ,其中消息生產(chǎn)者和使用者之間需要持久和異步通信。 但是,我可能不會將它們用于特定的R&D工作,因?yàn)槲业男枨笫怯美醵鵁o法證明工作的合理性(我將向誰通知新產(chǎn)品?)。 此外, @ MessageDriven bean批注使此功能非常易于使用,并且它是基于JMS的完善且高度可靠的功能。
EJB 3.1還允許使用許多新的有用的bean類型。 單例bean是由服務(wù)器管理的單例類,并使用@Singleton批注指定(如果需要為群集單例之類的事情,這很方便)。 @Schedule批注可用于根據(jù)日程安排(例如,每個星期五中午)生成常規(guī)事件,這些時(shí)間可以方便地進(jìn)行報(bào)告等。
摘要
因此,我現(xiàn)在擁有一個可以正常工作的n層Web服務(wù),該服務(wù)能夠使用NoSQL數(shù)據(jù)庫來持久化,管理和檢索Product實(shí)體。 下次,我將介紹使用這些技術(shù)實(shí)現(xiàn)更多SOA模式的方法。 訂閱我的博客以在發(fā)生這種情況時(shí)得到通知。
繼續(xù)第5部分 。
參考: 使用NoSQL實(shí)施實(shí)體服務(wù)–第4部分:我們的JCG合作伙伴 Ben Wilcock的Java EE ,位于SOA,BPM,Agile和Java博客上。
翻譯自: https://www.javacodegeeks.com/2012/09/implementing-entity-services-using_389.html
總結(jié)
以上是生活随笔為你收集整理的使用NoSQL实现实体服务–第4部分:Java EE的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑usb接口接线(电脑USB接口线)
- 下一篇: Spring配置文件和Java配置