使用NoSQL實現實體服務–第4部分:Java EE

現在,我已經準備好了框架式的合同優先型Web服務,并使用Ektorp和CouchDB創建了數據訪問層 ,是時候將它們連接到一個可以正常工作的實體服務中了 。 為此,我將使用Java EE和Glassfish 3.1。

值得注意的是,對于他的那種R&D工作,我完全不需要使用Java EE。 我不需要像Glassfish這樣的JEE服務器所提供的安全性或交易功能,我可能可以使用比Tomcat或Jetty輕一些的東西。 但是,我喜歡JEE的便利性和功能,許多在像Tomcat這樣的標準Java應用程序服務器上開始使用的應用程序最終都會將JEE功能移植到Tomcat中(例如JAX-WS)或遷移到完整的JEE服務器(例如玻璃魚。

Tomcat的用戶經常需要JEE功能-這是在Apache上啟動TomEE項目的主要理由。 該項目將JEE Web Profile功能添加到普通的Tomcat堆棧中,因此它可以處理EJB和JAX-WS之類的事情。

將業務邏輯分為Bean。

我的應用程序已經有2個不同的層。 第一個(從消費者的角度來看)是Web服務層,其任務是提供所有Web服務操作以及其他服務特定任務,例如處理定制SOAP標頭和消息傳遞元數據 ,這些問題有助于解決冪等問題。 最后一層是數據庫訪問層 ,負責與數據庫通信以及處理我的Product實體的持久性和檢索。

我現在要添加的第三層也是最后一層是連接前兩層的中間層-業務邏輯層。 該層將負責實施產品實體服務的規則和決策,例如確保在執行持久性操作之前,存在,添加或驗證任何語義上重要的信息。

這種語義上重要的信息的一個例子是產品的“狀態”。 在我的模型中,我允許產品在多個狀態之間轉換,以維持嚴格的產品生命周期。 這些階段如下,并且本質上是線性的(每個狀態都跟隨最后一個狀態)…

  • 臨時
  • 有貨
  • 可售
  • 已停產
  • 已刪除

在我的業務邏輯層中,我的Product Manager bean確保每個實體的狀態對于每個服務操作都有意義。 例如,如果您對Product調用createProduct()操作,則給定的Product必須具有“臨時”狀態。 如果沒有,我的邏輯將對其進行更改。

這些規則對于每個企業都是唯一的,因此它不是一個適合所有解決方案的規模。 在現實世界中,規則引擎或類似的工具將是理想的選擇,因為它將在定義和管理這些規則時提供更多的靈活性。 但是,對于我的基本R&D需求,此硬編碼解決方案很好,并且充分展示了提供業務邏輯層的好處,因為您可以將業務邏輯“關注點”與消息和數據庫處理邏輯分開 。

一種數據模型可以全部統治。

所有這些層都有一個共同點,那就是它們管理的數據(aka Entity)對象。 產品實體由XML表示,由XSD描述并由WSDL引用。 這些定義被JAX-WS轉換為Java對象,并且這些相同的Java對象在整個代碼中本機使用,從而避免了任何數據模型轉換 。

這種技術被稱為“避免轉換”,是這種基于NoSQL的實體服務開發技術的特殊樣式的主要優點之一。

避免轉換是一種最佳實踐,可以提高服務的可重用性和可組合性– soapatterns.org。

實質上,通過此服務開發,我設法在每個層中使用了這些相同的Java數據對象,但仍保持了真正的合同優先的開發方法。 對于開發人員而言,這確實是個好消息。 我還避免了對數據模型轉換層的需求,當消息和數據庫之間的數據模型不兼容時(對于ESB銷售人員而言,這是個壞消息),這常常就變得很必要。

使用NoSQL還使我完全避免了對表和數據關系使用任何SQL DDL,并且不需要任何復雜的對象映射,例如處理傳統ORM所需的那些映射。 我什至可以隨時間推移變形我的數據模型,而不會經常破壞東西(非常適合服務版本控制)。

關于保持JEE簡單的注意事項。

為了減少與JEE相關的部署和配置麻煩,我使用了新的部署和打包機制,該機制使您可以在同一應用程序WAR文件中定位EJB和Web應用程序。 這使使用JEE功能變得輕而易舉,并大大簡化了Maven的構建,因為我僅使用一個項目和零個部署描述符(甚至缺少web.xml!)。

使用EJB 3.1的JEE從未如此簡單,因為它現在基于使用一些非常簡單的Java注釋。 例如,指定無狀態EJB可以是那么簡單,因為添加@Stateless注釋的一類。 這樣做是在告訴應用程序服務器將類部署到池中,以使其具有高可用性,并將對方法的調用包裝在事務中。 作為無狀態Bean,它將沒有會話的概念,并且不會在調用之間保持任何狀態(對于無狀態服務而言是理想的)。

@Stateless
public class ProductsManager

為了從應用程序的另一部分(例如,從@WebService類)使用此bean,您只需添加正確類類型的引用變量,然后使用@EJB注釋對該變量進行注釋。 這告訴應用程序服務器在運行時使用一種稱為依賴項注入的機制從預填充的bean池中“注入”正確類型的實例。

@WebService(...)
public class ProductsEntityService implements Products {@EJBprivate ProductsManager bean;...

其他有用的JEE功能。

消息驅動的Bean非常適用于實現事件驅動的消息傳遞 ,其中消息生產者和使用者之間需要持久和異步通信。 但是,我可能不會將它們用于特定的R&D工作,因為我的需求是用例太弱而無法證明工作的合理性(我將向誰通知新產品?)。 此外, @ MessageDriven bean批注使此功能非常易于使用,并且它是基于JMS的完善且高度可靠的功能。

EJB 3.1還允許使用許多新的有用的bean類型。 單例bean是由服務器管理的單例類,并使用@Singleton批注指定(如果需要為群集單例之類的事情,這很方便)。 @Schedule批注可用于根據日程安排(例如,每個星期五中午)生成常規事件,這些時間可以方便地進行報告等。

摘要

因此,我現在擁有一個可以正常工作的n層Web服務,該服務能夠使用NoSQL數據庫來持久化,管理和檢索Product實體。 下次,我將介紹使用這些技術實現更多SOA模式的方法。 訂閱我的博客以在發生這種情況時得到通知。

繼續第5部分 。

參考: 使用NoSQL實施實體服務–第4部分:我們的JCG合作伙伴 Ben Wilcock的Java EE ,位于SOA,BPM,Agile和Java博客上。


翻譯自: https://www.javacodegeeks.com/2012/09/implementing-entity-services-using_389.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/371578.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/371578.shtml
英文地址,請注明出處:http://en.pswp.cn/news/371578.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

yii2之DetailView小部件

DetailView小部件用于展示單條數據記錄&#xff0c;可配置屬性很少&#xff0c;使用也很簡單&#xff0c;直接貼代碼&#xff0c;一看就懂&#xff01; yii小部件數據小部件DetailView的使用示例&#xff1a; <? DetailView::widget([model > $user,//模型對象&#xff…

克隆安裝oracle,Oracle 之 Cloning $oracle_home (克隆安裝oracle軟件)

用途&#xff1a;Cloning an Oracle Home &#xff0c; 可以免去多臺機器重復安裝oracle軟件1、停止相關進程[rootnode1 bin]# ./crsctl stop cluster -all2、打包 dbhome_1 目錄[rootnode1 11.2.0]# cd /u01/app/oracle/product/11.2.0/[rootnode1 11.2.0]# tar -zcvpf db_1.b…

gitlab的安裝和基本維護

基本介紹 GitLab是一個自托管的Git項目倉庫&#xff0c;可以自己搭建個人代碼管理的倉庫&#xff0c;功能與github類似。 安裝 操作系統&#xff1a;CentOS6.5 gitlab官網下載安裝地址&#xff1a;https://about.gitlab.com/downloads/#centos6 1.安裝依賴的包 yum install cur…

Spring配置文件和Java配置

我的上一個博客介紹了Spring 3.1的配置文件&#xff0c;并解釋了使用它們的業務案例&#xff0c;并演示了它們在Spring XML配置文件中的用法。 但是&#xff0c;似乎很多開發人員更喜歡使用Spring的基于Java的應用程序配置&#xff0c;因此Spring設計了一種使用帶有現有Configu…

php 刪除單個文件大小,php刪除指定大小的jpg文件

function actionZmdel(){//set_time_limit(0);$dir dirname(dirname(dirname(dirname(__FILE__))))./2012jxgwyimg;$dirarr scandir($dir);echo 正在刪除...;foreach($dirarr as $subdir){if($subdir ! . && $subdir ! ..){$path $dir./.$subdir;$files glob($path…

2017寒假零基礎學習Python系列之函數之 函數之定義可變參數

若想讓函數接受任意個參數&#xff0c;就可以定義一個可變的參數&#xff1a; def fn(*args): print args fn() >>>() fn(1,2,5,6) >>>(1,2,5,6) 原理是Python解釋器把傳入的一組參數封裝在一個tuple傳遞給可變參數&#xff0c;因此在函數內部&#xff0c;直…

在Windows上構建OpenJDK

通過做一些實驗&#xff0c;我發現手頭提供JDK源代碼來進行一些更改&#xff0c;使用它等等通常很有用。因此&#xff0c;我決定下載并編譯該野獸。 顯然&#xff0c;這花了我一些時間&#xff0c;盡管我最初的想法是&#xff0c;它應該和運行make命令一樣簡單&#xff1a;&…

unity中怎么在InspectorI面板加LOGO

轉載于:https://www.cnblogs.com/unitySPK/p/7278925.html

oracle stream 主鍵,oracle stream配置向導

1. Stream 的工作原理Stream 是Oracle Advanced Queue技術的一種擴展應用&#xff0c;這種技術最基本的原理就是收集事件&#xff0c;把時間保存在隊列中&#xff0c;然后把這些事件發布給不同的訂閱者。從DBA的角度來說&#xff0c;就是把捕獲Oracle數據庫產生的Redo日志&…

JavaScriptDOM 十四. Event DOM的屬性

1 <!DOCTYPE html>2 <html>3 <head>4 <title></title>5 <script type"text/javascript">6 7 /*8 1. --------------- Event DOM 事件DOM 用戶交互 ------------------9 當事件發生時, 執行JS功能代碼10 11 常用…

五、創建Bean的三種方式

五、創建Bean的三種方式轉載于:https://www.cnblogs.com/ljiwej/p/7280614.html

重寫到邊緣–充分利用它! 在GlassFish上!

現代應用程序開發的一個重要主題是重寫。 自從Java Server Faces引入和Java EE 6中新的輕量級編程模型以來&#xff0c;您一直在努力使用漂亮&#xff0c;簡單&#xff0c;可添加書簽的URL。 PrettyFaces很久以來就一直存在&#xff0c;即使它在3.3.3版本中可以說是成熟的&…

php yii框架路由,yii框架路由配置

首先要在服務器配置(httpd.conf)中開啟重寫模塊#開啟重寫模塊&#xff0c;將其前面的#去掉LoadModule rewrite_module modules/mod_rewrite.so#Directory中允許覆蓋開啟## Possible values for the Options directive are "None", "All",# or any combinat…

前端面試總結二

一、響應式和自適應的區別&#xff1a; 聯系(相同點)&#xff1a; 響應式設計(responsive design)和自適應設計(adaptive design)都是用來解決網頁在不同分辨率的屏幕和設備上展示的一項技術(或者說一種方法)。 區別&#xff1a; 響應式設計&#xff1a;通過CSS Media Queries(…

“Spring入門”教程系列

大家好&#xff0c; 我很高興向您介紹“Spring入門”教程系列&#xff01; 這是一系列文章&#xff0c;最初由我們的JCG合作伙伴 Michal Vrtiak在vrtoonjava博客上撰寫 。 本系列中將逐步創建一個時間表管理應用程序&#xff0c;并且每個教程都在前一個教程的基礎上構建。 處…

【看番雜感】Clannad系列觀后感(劇透慎入)

前言 之前看第一季時&#xff0c;彈幕里總有人在刷“寫作cl&#xff0c;讀作人生”。當時我想&#xff0c;盲目把一部催淚番上升到人生的高度&#xff0c;這未免有些武斷&#xff0c;也是對作品本身的不尊重。當看完第二季的我驀然回首&#xff0c;發現這才是最最貼切的評價&am…

oracle+tns+01106,TNS-01106:Listener using listener name already been started

最近在做HACMP雙機互備切換測試的時候&#xff0c;發現一個問題&#xff1a;A節點的listener端口為1521 &#xff0c;B節點的listener端口為1522&#xff0c;為什么兩個節點的監聽要用不同的端口號&#xff1f;當時AB機使用不同端口是基于如下考慮&#xff1a;HACMP的切換數據庫…

Centos7 開機顯示 ERST: Failed to get Error Log Address Range” 導致無法開機解決方法

開機顯示 ERST: Failed to get Error Log Address Range” 導致無法開機&#xff0c;也無法重新安裝系統&#xff0c;解決方法&#xff1a;開機進入BIOS &#xff0c; 關閉ACPI選項即可正常開機 轉載于:https://www.cnblogs.com/zhangjianghua/p/6376811.html

Spring MVC 3模板和Apache Tiles

對于任何Web應用程序而言&#xff0c;有效的設計考慮因素是使用模板引擎&#xff08;或工具&#xff09;&#xff0c;并且由于具有Spring的“可插拔”特性&#xff0c;因此集成模板機制&#xff08;例如Apache Tiles&#xff09;的確要容易得多。 在這篇簡單的文章中&#xff0…

hihocoder1543 SCI表示法

題意&#xff1a;任何一個數可以表示為連續整數相加&#xff0c;問這些連續整數的最大長度 題解&#xff1a;假設左右是l,r,那么(lr)*(l-r1)/2就是這段序列的和&#xff0c;枚舉2n的所有因子&#xff0c;找到最大的就可以了 我的做法是預處理前綴和&#xff0c;二分找到答案位置…