paulwong

          #

          項目管理資源

          http://www.cnblogs.com/ldcsaa/category/353927.html

          posted @ 2012-04-16 00:57 paulwong 閱讀(255) | 評論 (0)編輯 收藏

          解釋TOMCAT框架

          1. Tomcat的整體框架結構

          Tomcat的基本框架, 分為4個層次。
          Top Level Elements:
          Server
          Service
          Connector
          HTTP
          AJP
          Container
          Engine
          Host
          Context
          Component
          manager
          logger
          loader
          pipeline
          valve
          ...
          站在框架的頂層的是Server和Service

          Server: 其實就是BackGroud程序, 在Tomcat里面的Server的用處是啟動和監聽服務端事件(諸如重啟、關閉等命令。

          在tomcat的標準配置文件:server.xml里面, 我們可以看到“<Server port="8005" shutdown="SHUTDOWN" debug="0">”這里的"SHUTDOWN"就是server在監聽服務端事件的時候所使用的命令字)

          Service: 在tomcat里面, service是指一類問題的解決方案。 通常我們會默認使用tomcat提供的:Tomcat-Standalone 模式的service。 在這種方式下的service既給我們提供解析jsp和servlet的服務, 同時也提供給我們解析靜態文本的服務。

          Connector: Tomcat都是在容器里面處理問題的, 而容器又到哪里去取得輸入信息呢?

          Connector就是專干這個的。 他會把從socket傳遞過來的數據, 封裝成Request, 傳遞給容器來處理。

          通常我們會用到兩種Connector,一種叫http connectoer, 用來傳遞http需求的。 另一種叫AJP, 在我們整合apache與tomcat工作的時候, apache與tomcat之間就是通過這個協議來互動的。 (說到apache與tomcat的整合工作, 通常我們的目的是為了讓apache 獲取靜態資源, 而讓tomcat來解析動態的jsp或者servlet。)

          Container: 當http connector把需求傳遞給頂級的container: Engin的時候, 我們的視線就應該移動到Container這個層面來了。

          在Container這個層, 我們包含了3種容器: Engin, Host, Context.

          Engin: 收到service傳遞過來的需求, 處理后, 將結果返回給service( service 是通過 connector 這個媒介來和Engin互動的 ).

          Host: Engin收到service傳遞過來的需求后,不會自己處理, 而是交給合適的Host來處理。

          Host在這里就是虛擬主機的意思, 通常我們都只會使用一個主機,既“localhost”本地機來處理。

          Context: Host接到了從Host傳過來的需求后, 也不會自己處理, 而是交給合適的Context來處理。
          比如:
          <http://127.0.0.1:8080/foo/index.jsp>
          <http://127.0.1:8080/bar/index.jsp>
          前者交給foo這個Context來處理, 后者交給bar這個Context來處理。

          很明顯吧! context的意思其實就是一個web app的意思。

          我們通常都會在server.xml里面做這樣的配置
          <Context path="/foo" docBase="D:/project/foo/web" />
          這個context容器,就是用來干我們該干的事兒的地方的。

          畢竟TOMCAT的框架還是比較復雜的, 單是從文字上理解, 是不那么容易掌握TOMCAT的框架的。 所以得實踐、實踐、再實踐。 建議下載一份TOMCAT的源碼, 調試通過, 然后單步跟蹤其啟動過程。 如果有不明白的地方, 再來查閱本文, 看是否能得到幫助。 我相信這樣效果以及學習速度都會好很多!

          posted @ 2012-04-15 23:47 paulwong 閱讀(454) | 評論 (0)編輯 收藏

          alfresco集群負載均衡配置

          機器兩臺:
          A機器:172.16.48.26:用于Alfresco服務器(集群節點1)
          用于數據庫服務器、文件服務器(共享)、

          B機器:172.16.48.27:用于Alfresco服務器(集群節點2)
          負載均衡服務器


          第一步:創建共用數據庫
          在A機器:172.16.48.26 上安裝MySQL,建立名為alfresco的數據庫;
          #create database alfresco
          #grant all privileges on alfresco.* to root@'%' identified by 'alfresco'

          第二步:創建共享目錄
          在A機器:172.16.48.26上建立可寫的共享目錄 /alfresco;
          在/下創建目錄 alfresco
          #mkdir /alfresco

          第三步:設置共享目錄
          在A機器:172.16.48.26 上安裝Samba,修改/etc/samba/smb.conf,增加以下內容
          security = user
          [alfresco]
          comment = alfresco data & log
          path = /alfresco
          public = yes
          writable = yes
          write list = @root

          第四步:建立Samba用戶
          在A機器:172.16.48.26建立Samba用戶root
          #smbpasswd -a root

          第五步:建立共享
          在B機器:172.16.48.27上創建/alfresco目錄并掛載A機器的 共享目錄//172.16.48.26/alfresco
          # mount -t smbfs -o username=root,password=alfresco //172.16.48.26/alfresco /alfresco

          第六步:安裝tomcat并修改配置
          A機器:172.16.48.26 上安裝tomcat,并修改conf/server.xml
          maxThreads="20000"
          emptySessionPath="true"
          protocol="org.apache.coyote.http11.Http11NioProtocol"
          enableLookups="false"
          redirectPort="8443"
          connectionTimeout="20000"
          disableUploadTimeout="true" />


          在B機器:172.16.48.27 上安裝tomcat,并修改conf/server.xml,內容同上,然后將jvmRoute改為tomcat2;

          第七步:部署alfersco
          將alfresco.war分別拷貝到A機器:172.16.48.26和B機器:172.16.48.27的webapps目錄下,并解壓縮到alfresco目錄
          #jar -xf alfresco.war

          第八步:修改alfresco配置
          分別對兩臺機器的alfresco的配置做修改

          1、修改WEB-INF/classes/alfresco/repository.properties文件
          dir.root=./alfresco_data
          db.name=alfresco
          db.url=jdbc:mysql://172.16.48.26:3306/${db.name}
          db.username=root
          db.password=alfresco

          2、拷貝extension目錄(在repository項目的config中)下的內容分別到172.16.48.26和172.16.48.27的WEB-INF/classes/alfresco/extension目錄下,
          包括:
          custom-hibernate-dialect.properties
          custom-repository-context.xml
          custom-repository.properties
          ehcache-custom.xml
          replicating-content-services-context.xml
          以及自己定義的content的配置

          3、修改custom-hibernate-dialect.properties文件
          hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect

          4、修改custom-repository.properties文件
          dir.root=./alfresco_data
          index.recovery.mode=AUTO
          index.tracking.cronExpression=0/5 * * * * ?
          index.tracking.reindexLagMs=10000
          db.driver=org.gjt.mm.mysql.Driver
          db.name=alfresco
          db.url=jdbc:mysql://172.16.48.26:3306/${db.name}
          db.username=root
          db.password=alfresco

          5、修改ehcache-custom.xml文件
          properties="port=40001, socketTimeoutMillis=300000"/>

          6、修改replicating-content-services-context.xml文件


          ./alfresco_data/contentstore




          /alfresco/contentstore



          第九步:啟動tomcat

          修改172.16.48.26的bin/catalina.sh文件,啟動tomcat
          export JAVA_OPTS='-Xms512m -Xmx2048m -XX:MaxPermSize=512m -server'
          #./bin/startup.sh

          修改172.16.48.27的bin/catalina.sh文件,內容同上,啟動tomcat;

          第十步:安裝文件服務器

          在172.16.48.26上安裝apache httpd server到目錄/usr/local/apache目錄下,
          拷貝從apache網站找到的 mod_jk.so到modules目錄下

          修改conf/httpd.conf
          LoadModule jk_module modules/mod_jk.so
          JkWorkersFile conf/workers.properties
          JkLogFile logs/mod_jk.log
          JkLogLevel info
          JkMount /* loadBalancer
          JkMount /jkstatus status
          Include conf/extra/httpd-mpm.conf
          Include conf/extra/httpd-default.conf

          添加文件conf/workers.properties
          worker.list=tomcat1, tomcat2, loadBalancer, status
          worker.tomcat1.port=8009
          worker.tomcat1.host=172.16.48.26
          worker.tomcat1.type=ajp13
          worker.tomcat2.port=8009
          worker.tomcat2.host=172.16.48.27
          worker.tomcat2.type=ajp13
          worker.loadBalancer.type=lb
          worker.loadBalancer.balance_workers=tomcat1, tomcat2
          worker.loadbalancer.sticky_session=true
          worker.loadbalancer.sticky_session_force=false
          worker.status.type=status

          修改conf/extra/httpd-default.conf文件
          Timeout 300
          KeepAlive On
          MaxKeepAliveRequests 0
          KeepAliveTimeout 300

          修改conf/extra/httpd-mpm.conf文件

          StartServers 5
          MinSpareServers 5
          MaxSpareServers 10
          ServerLimit 4096
          MaxClients 2048
          MaxRequestsPerChild 0


          ThreadsPerChild 1024
          MaxRequestsPerChild 0


          啟動apache httpd server

          第十一步:測試

          在A機器創建用戶test
          使用test用戶創建文件 file1.txt
          在B機器使用test用戶搜索 file1;

          在B機器使用test用戶創建文件 file2.txt
          在A機器使用test用戶搜索 file2;



          原文鏈接:http://blog.csdn.net/wangxiaojing123/article/details/6682706

          posted @ 2012-04-15 20:41 paulwong 閱讀(759) | 評論 (0)編輯 收藏

          給開發維護大型項目開發者的建議

          假設你是正在開發和維護一個包含2000個類并使用了很多框架的Java開發人員。你要如何理解這些代碼?在一個典型的Java企業項目小組中,大 部分能夠幫你的高級工程師看起來都很忙。文檔也很少。你需要盡快交付成果,并向項目組證明自己的能力。你會如何處理這種狀況?這篇文字為開始一個新項目的 Java開發者提供了一些建議。

          0. 不要試圖一下子搞懂整個項目
          好好考慮一下,為什么理解項目代碼是第一位的?大部分情況是你被要求修復一個bug或者加強系統已有功能。你要做的第一件事情不是理解整個項目的架構。當對項目進行維護時,這樣(理解整個項目架構)可能會對你造成巨大的壓力。

          即便是有著10年可靠編程經驗的Java開發者可能也沒有理解項目的核心工作機制,盡管他們可能已經在這個項目工作超過一年(假設他們并非原始開發人員)。比如,對于認證機制或事務管理機制。

          他們是怎么做的?他們對于自己負責的部分非常了解,并且能夠交付價值給小組。每天的交付價值遠比了解一些以后還不確定有沒有的東西重要的多。

          1. 關注于盡快交付價值
          那我是否定了你對于項目架構理解的熱情了么?完全不。我只是要求你盡早的交付價值,一旦你開始一個項目,搭建了開發環境,你就不應該花一兩周時間才交付什么,無論他的規模大小。假如你是一個有經驗的程序員卻兩周都沒有任何交付,你的經理怎么會知道你是真的在工作還是在看新聞。

          所以交付可以使大家都輕松起來。不要認為你能夠做有價值的交付前必須理解整個項目。這是完全錯誤的。加一段javascript的驗證代碼對業務就很有價值,經理能夠通過你的交付達到對你的信任。這樣能夠向上級領導證明你的貢獻以及員工價值。

          日復一日,在你不斷修復bug及增強功能之后,就能夠慢慢開始理解項目架構。不要低估對系統方方面面理解時需要花費的時間。花3-4天理解認證機 制,2-3天理解事物管理。這些都是依靠之前的相似項目的經歷,但關鍵還是要花時間才能透徹的理解。要在日常工作中擠出時間,不要向經理要求特定的時間來做這些。

          找找項目是否有一些不斷維護的單元測試用例。有效的單元測試用例是理解大型項目代碼的很好途徑。單元測試能夠幫助理解代碼片段,包括一個單元的外部接口(單元如何被調用以及返回內容)及其內部實現(調試單元測試比調試整個實際用例簡單許多)。

          你如果能夠很好的理解一些內容,寫一些筆記,或者畫一些類圖、時序圖、數據模型圖,以便你或日后其他的開發者維護。

          2. 維護大型項目所必須的技能
          你能從事當前的工作,必然已經具有良好的java技術。我們來談談能夠讓你在新項目中良好表現的其他技能。大部分時間,你在項目中的任務是修復bug和增強功能。

          有兩項很重要的技能能夠協助你維護大型項目代碼。

          2.1 能夠迅速發現需要的類
          在任何維護活動中,無論是修復bug或增強功能,第一個動作就是識別出當前修復或增強的用例中調用的類。當你定位到需要修復或增強的類/方法,就已經完工了一半。

          2.2 能夠分析變更的影響
          當你在完成必要的修改或增強工作后,最重要的就是要確認你的修改沒有破壞代碼的其他部分。你要用你的java技術及對其他框架的理解找出變更可能影響的部分。下面有兩個簡單的例子詳細描述了最后提及的情況:

          a)當類A的equals()方法變更后,調用一個保護A實例的List的contains()方法時就會被影響到。若Java知識不夠,很難考慮到這樣的影響。

          b)在一個web項目中,我們假設“user id”保存在session中。一個新入程序員可能在“user id”中加入一些信息作為bug修復的方法,但是卻不知道會影響到那些關聯“user id”的用例。

          當你提高了如上兩個技能,盡管你對項目不是非常了解,但大部分的維護任務會變得簡單很多。若你修復一個bug,你會定位并修復這個bug,并且保證變更不會破壞項目的其他部分。若你增強或加入一個特性,基本上你只需要模仿現有的特性使用相似的設計。

          在一個在線銀行項目中,為什么“查看賬戶摘要”和“查看交易歷史”的設計需要巨大的差別呢?如果你理解了“查看賬戶摘要”的設計,完全可以模仿開發出“查看交易歷史”的功能。

          就修復bug和增強來說,你不必完全理解所有2000個類的工作內容和代碼如何運行來推動系統。你若有上面的技能,就能很快定位需要修改的代碼的部分,使用良好的java和框架技能修復,保證變更不會破壞項目的其他部分并交付,盡管你可能只知道一小部分項目的設計。

          3. 使用工具找到需要的變更內容以及變更產生的影響
          繼續我們盡快交付的主題,你應當尋找那些能夠通過盡量少的了解項目但能幫助你盡快實施交付的工具作為輔助。

          3.1 迅速發現需要變更內容的工具
          無論是修復bug還是系統增強,首先都要找到該用例調用的你需要修改的類及方法。基本有兩種方式理解一個用例的工作方式,靜態代碼分析和運行時分析。

          源碼分析統計掃描所有代碼并且展示類之間的關系。市場上有很多設備與工具。比如:Architexa, AgileJ, UModel, Poseidon等。

          所有的靜態代碼分析工具缺點在于無法確切展示用例中類或方法的運行時調用情況。因此Java新加入了特性,如回調機制(callback patterns)。如靜態分析工具無法推斷出當頁面提交按鈕被點擊時哪個Servlet被調用了。

          運行時分析工具能夠展示類和方法在用例運行時的狀態。工具包括:MaintainJ, Diver,jSonde,Java Call Tracer等。這些工具可以捕獲運行時的堆棧狀態,并以此為一個用例生成序列圖和類圖。

          序列圖展示了該用例在運行時所有調用的方法。若你在修復一個bug,那這個bug很可能就是這些被調用的方法之一。
          若你在增強已有功能,利用序列圖理解調用流程然后再修改。可能是新增一個驗證,修改DAO等。

          若你在新增功能,找到一些相似的特性,利用序列圖理解調用流程然后模仿開發新功能。

          要小心挑選運行時分析工具。信息過多是這類工具的主要問題。選擇一些提供簡單過濾無效信息并能夠方便的查看各種視圖的工具。

          3.2 迅速發現需要變更內容的工具
          若單元測試有效,可以通過運行單元測試發現變更有沒有破壞其他測試用例。有效維護并且覆蓋大型企業應用的單元測試還是比較少的。下面有一些針對該情況的工具。

          仍然是有兩種技術靜態代碼分析和運行時分析可以使用。市場中有很多靜態代碼分析工具可用。如:Lattix, Structure101, Coverity, nWire and IntelliJ’s DSM。

          給定一個變更后的類,上述工具均可識別對該類存在依賴的類的集合。開發者需要根據這些信息“猜測”可能產生影響的用例,因為這些工具無法展示運行時類之間的調用關系。

          市場上的可以用于運行時影響分析的工具并不多,除了MaintainJ。MaintainJ先捕獲在一個用例中調用的所有類和方法。當所有用例的上 述信息都被捕獲之后,就很容易發現類的變更對用例的影響。MaintainJ能夠有效工作的前置條件就是項目的所有用例都應當先運行一遍,以便能夠獲得運 行時的依賴關系。

          總之,目前你在迅速準確分析變更影響方面,還是可以從工具中獲得有限的幫助。首先根據需要實施一些影響分析,然后根據自己或小組其他高級成員評審來判斷變更的影響。你可能需要上面提到的工具對你的判斷進行反復確認。

          4. 對上述內容的兩個忠告
          4.1 不要降低代碼質量
          為了快速交付,所以沒有全盤理解架構,但絕不能以降低代碼質量為條件。下面是一些你可能因為只考慮快速交付而引發的代碼質量問題。

          因為修改代碼涉及到很多的依賴,所以新增代碼相對而言風險較小。例如,有5個用例都調用了某個方法。為了改進某個用例,你需要修改這個方法的實現。 最簡單的做法就是復制這個方法,重命名,然后在改進的用例中調用新方法。千萬不要這么做。代碼冗余絕對是非常有害的。嘗試對方法進行包裝或者重寫,甚至是 直接修改,然后重新測試所有用例,通常停下來想一想,然后親手去實施,是一個比較好的方式。
          code quality 
          ( 伯樂在線配圖)

          另一個例子是將“private”方法改為“public”,使得別的類也可以調用。盡量不要將非必須的部分暴露出來。假如為了更好的設計需要重構,就應當著手去做。

          大部分應用都有確定的結構和模式來實施。修復或增強程序時,確認你沒有偏離這樣的模式。若對約定不確定,請其他的高級開發者來審核你的變更。若你必須做一些違背約定的實施,盡量放置于一個規模較小的類中(一個200行代碼的類中的私有函數應當不會影響應用的整體設計)

          4.2 不要停止深入理解項目架構
          按照文章列出的方式,假設你能夠在對項目了解較少的情況下進行交付并以此持續下去,可能你會停止對項目架構的深入了解。這樣從長遠角度來說對你的職 業生涯沒有幫助。當你的經驗增加時,你應當承擔比較大的模塊任務。如構建一個完整的新特性或者修改項目的一些基礎設計等較大的改進。當你能夠做這些改進 時,你對項目的整體架構應該相當了解。文中列舉的方法是讓你在最短的時間內提升自己,而不是阻止你完整理解整個項目。

          5. 結論
          整篇文章集中在對項目進行必要了解的前提下進行快速交付。你可以在不降低代碼質量的前提下這么做。
          若修復一個bug,迅速定位并修復。有必要可以使用運行時分析工具。若新增一個特寫,可以尋找相似特寫,理解流程(有必要使用工具)并編寫。

          或許這些聽起來很簡單,但是實用嗎?當然。但前提是你有良好的java技術以及對框架足夠了解才能先修改代碼,然后對變更影響進行分析。對變更影響的分析比實施變更需要更多的技巧。你可能需要高級開發人員協助你分析變更影響。

          大約有50%的IT可操作預算用于簡單的bug修復和功能增強。根據文中的建議,對于維護活動中的經費的節省應當還是很有幫助的。

          作者 Choudary Kothapalli 也是 MaintainJ 項目的建立者。

          posted @ 2012-04-15 20:37 paulwong 閱讀(243) | 評論 (0)編輯 收藏

          轉一個J2EE開發時的包命名規則,養成良好的開發習慣

          代碼編寫規范目的:能夠在編碼過程中實現規范化,為以后的程序開發中養成良好的行為習慣。
          代碼編寫規范使用范圍:J2EE項目開發。
          包命名規范:
          目的:包的命名規范應當體現出項目資源良好的劃分

          servlet類所在包命名規范:公司名稱.開發組名稱.項目名稱.web.servlet
          例如:net.linkcn.web.servlet

          自定義標簽類所在包命名規范:公司名稱.開發組名稱.項目名稱.web.tags
          例如:net.linkcn.web.tags

          過濾器類所在包命名規范:公司名稱.開發組名稱.項目名稱.web.filter
          例如:net.linkcn.web.filter

          Action類所在包命名規范:公司名稱.開發組名稱.項目名稱.web.struts.action
          例如:net.linkcn.web.struts.action

          ActionForm類所在包命名規范:公司名稱.開發組名稱.項目名稱.web.struts.form
          例如:net.linkcn.web.struts.form

          Javabean所在包命名規范:公司名稱.開發組名稱.項目名稱.web.struts.service.impl
          例如:net.linkcn.web.service.impl

          Javabean實現接口命名規范:公司名稱.開發組名稱.項目名稱.web.service
          例如:net.linkcn.web.service

          DAO類所在包命名規范:公司名稱.開發組名稱.項目名稱.dao.impl
          例如:net.linkcn.dao.impl

          DAO類所實現的接口在包中命名規范:公司名稱.開發組名稱.項目名稱.dao
          例如:net.linkcn.dao

          POJO類與hbm文件所在包命名規范:公司名稱.開發組名稱.項目名稱.dao.hbm
          例如:net.linkcn.dao.hbm

          全局公共類、接口類所在包命名規范:公司名稱.開發組名稱.項目名稱.global
          例如:net.linkcn.global

          全局工具類所在包命名規范:公司名稱.開發組名稱.項目名稱.util
          例如:net.linkcn.util

          類命名規范
          基本命名規范:

          類、接口命名

          命名規范:以大寫字母開頭,如果有多個單詞,每個單詞頭字母大寫
          例如:StudentInfo
          接口命名

          命名規范:以大寫字母"I"開頭,如果有多個單詞,每個單詞頭字母大寫
          例如:IStudentInfo

          接口實現類命名:
          命名規范:將實現的接口名稱的首字母"I"去掉,以"Impl作為結尾",如果有多個單詞,每個單詞頭字母大寫。
          例如:StudentInfoImpl

          J2EE+SSH框架命名規范
          servlet類命名:
          命名規范:以Servlet單詞結尾
          例如:LoginServlet

          POJO命名:
          使用hibernate自動生成的類即可

          DAO類命名:
          使用hibernate自動生成的類即可

          Action類命名:
          命名規范:Action的命名以POJO名稱來制定,POJO名稱Action
          例如:
          一個POJO名稱為Diary,其對應的action為DiaryAction

          ActionForm類命名:
          命名規范:ActionForm的命名以POJO名稱來制定,POJO名稱Form
          例如:
          一個POJO名稱為Diary,其對應的actioForm為DiaryForm

          業務邏輯接口命名:
          命名規范:業務邏輯接口的命名以POJO名稱來制定,IPOJO名稱Service
          例如:
          一個POJO名稱為Diary,其對應的業務邏輯接口為IDiaryService

          業務邏輯實現類命名:
          命名規范:業務邏輯接口實現類的命名以POJO名稱來制定
          例如:
          一個POJO名稱為Diary,對應的業務邏輯接口實現類名為DiaryServiceImpl

          類變量命名:
          命名規范:變量名首字母必須小寫,如果該變量名有多個單詞組成,后面的單 詞首字母大寫,單詞與單詞之間不要使用"_"做連接,變量名訪問控制必須為私有, 可以對其增加setter與getter方法。
          例如:
          private int studentAge;
          public int getStudentAge(){
          return studentAge;
          }
          public void setStudentAge(int studentAge) {
          this.studentAge=studentAge;
          }

          常量命名:
          命名規范:所有字母大寫,如果有多個單詞組成,單詞與單詞之間以” _“隔開。而 且該變量必須是公共、靜態、final類型
          例如:public static final String USER_NAME=”userName“;

          方法命名
          命名規范:首字母必須小寫,如果該變量名有多個單詞組成,后面的單詞首字母 大寫,單詞與單詞之間不要使用"_"做連接。單詞不要使用名詞。
          例如:public int checkLogin(String name,String pwd){}

          注釋規范:注釋規范是整個開發規范中最為重要的組成部分,必須嚴格執行。

          類的注釋:
          作用:注釋整個類,簡單概述該類作用。
          書寫規范:類的注釋必須寫在該類的聲明語法之前。在注釋中要描述該類的基 本作用,作者,日期,版本,公司名稱,版權聲明。
          格式:

          類的聲明語法

          例如:

          public class AdminDAO

          變量、常量注釋:
          作用:簡單描述該變量的意義。
          書寫規范:變量注釋必須寫在變量定義之前,簡單描述其代表的意義。
          格式:


          例如:


          public int age;
          方法注釋:
          作用:對該方法功能簡單描述,其參數、返回值意義的注解。
          書寫規范:方法注釋必須寫在方法定義之前。該注釋包括:方法其功能的簡單 描述,方法的參數、返回值類型、返回值意義簡單的描述。
          格式:


          例如:

          public booleaneditAdminPassword(int adminId,String oldPassword,
          String password) throws UserException,ServiceException;

          Jsp頁面命名:
          命名規范:jsp頁面名稱要以小寫字母開頭,如果有多個單詞組成,后面的單詞以 大寫字母開頭。名稱要體現出該頁面的意義,最好能夠與模塊名稱聯系在一起。
          例如:
          login.jsp --登錄頁面
          register.jsp --注冊頁面
          message.jsp --客戶留言頁面

          J2EE項目工程文件夾組織規范:
          目的:規范學員web應用程序的資源組織形式,形成良好的文件組織習慣。文件的組織形式應當體現模塊的劃分。

          根據eclipse工具的特征,項目的目錄結構為:
          src
          ----存放java文件
          WebRoot
          |--images --存放web程序所需的公共圖片
          |--css --存放web程序所需的公共樣式表
          |--js --存放web程序所需的公共js文件
          |--commons --存放web程序所需的公共文件
          |--功能模塊文件夾(存放與某個功能模塊相關的資源)
          |--images --存放與該功能模塊相關的圖片
          |--css --存放與該模塊相關的樣式表文件
          |--js --存放與該模塊相關的js文件
          |--jsp、html頁面
          |--WEB-INF
          |--classes
          |--lib
          |--tld文件

          J2EE項目提交規范
          項目完成時要將項目作為一個產品交付用戶,良好的項目組織規范可以使用戶可以方便的找尋項目中需要的資源,同時也是一個公司專業性的體現。項目提交時,要按照下列文件格式進行提交。

          項目主文件夾:
          作用:存放項目其他資源文件。
          命名規范:時間_班級編號_第X小組。
          例如:070706_GS2T18_第四小組。
          項目主文件夾下面包括以下文件夾和文件:
          |--src:保存.java文件。
          |--database:保存數據庫的腳本文件或者數據庫備份文件。
          |--source:保存eclipse工程中WebRoot目錄下的所有文件。
          |--depend:保存編譯該程序必須依賴的其他jar文件。
          |--javadoc:保存所有類生成的javadoc api文檔。
          |--war:保存程序的歸檔文件
          |--xx.war:已經打包好的工程文件,可以直接運行。
          |--project:保存開發項目原工程代碼及文件。
          |--產品說明書.doc:圖文方式展現該產品使用方法。
          |--build.xml:ant腳本,用于生成運行的war文件。
          |--項目解說.ppt:進行項目講解的ppt(ppt僅供在校模擬項目使用,不用于其他商業用途)
          注:一個完整的項目中,數據庫必須有一定量的有效的測試數據來支持該程序的運行

          包的命名 
          Java包的名字都是由小寫單詞組成。但是由于Java面向對象編程的特性,每一名Java程序員都可以編寫屬于自己的Java包,為了保障每個 Java包命名的唯一性,在最新的Java編程規范中,要求程序員在自己定義的包的名稱之前加上唯一的前綴。由于互聯網上的域名稱是不會重復的,所以程序 員一般采用自己在互聯網上的域名稱作為自己程序包的唯一前綴。
          例如: net.frontfree.javagroup

          類的命名
          類的名字必須由大寫字母開頭而單詞中的其他字母均為小寫;如果類名稱由多個單詞組成,則每個單詞的首字母均應為大寫例如TestPage;如果類名 稱中包含單詞縮寫,則這個所寫詞的每個字母均應大寫,如:XMLExample,還有一點命名技巧就是由于類是設計用來代表對象的,所以在命名類時應盡量 選擇名詞。   
          例如: Circle

          方法的命名
          方法的名字的第一個單詞應以小寫字母作為開頭,后面的單詞則用大寫字母開頭。
          例如: sendMessge

          常量的命名
          常量的名字應該都使用大寫字母,并且指出該常量完整含義。如果一個常量名稱由多個單詞組成,則應該用下劃線來分割這些單詞。
          例如: MAX_VALUE

          參數的命名
          參數的命名規范和方法的命名規范相同,而且為了避免閱讀程序時造成迷惑,請在盡量保證參數名稱為一個單詞的情況下使參數的命名盡可能明確。

          Javadoc注釋
          Java除了可以采用我們常見的注釋方式之外,Java語言規范還定義了一種特殊的注釋,也就是我們所說的Javadoc注釋,它是用來記錄我們代 碼中的API的。Javadoc注釋是一種多行注釋,以結束,注釋可以包含一些HTML標記符和專門的關鍵詞。使用Javadoc 注釋的好處是編寫的注釋可以被自動轉為在線文檔,省去了單獨編寫程序文檔的麻煩。
          例如:

          在每個程序的最開始部分,一般都用Javadoc注釋對程序的總體描述以及版權信息,之后在主程序中可以為每個類、接口、方法、字段添加 Javadoc注釋,每個注釋的開頭部分先用一句話概括該類、接口、方法、字段所完成的功能,這句話應單獨占據一行以突出其概括作用,在這句話后面可以跟 隨更加詳細的描述段落。在描述性段落之后還可以跟隨一些以Javadoc注釋標簽開頭的特殊段落,例如上面例子中的@auther和@version,這 些段落將在生成文檔中以特定方式顯示。

          變量和常量命名
          變量命名的方法采用匈牙利命名法,基本結構為scope_typeVariableName,它使用3字符前綴來表示數據類型,3個字符的前綴必須 小寫,前綴后面是由表意性強的一個單詞或多個單詞組成的名字,而且每個單詞的首寫字母大寫,其它字母小寫,這樣保證了對變量名能夠進行正確的斷句。例如, 定義一個整形變量,用來記錄文檔數量:intDocCount,其中int表明數據類型,后面為表意的英文名,每個單詞首字母大寫。這樣,在一個變量名就 可以反映出變量類型和變量所存儲的值的意義兩方面內容,這使得代碼語句可讀性強、更加容易理解。byte、int、char、long、float、 double、boolean和short。
          變量類型和首字母對照關系如下表:
          數據類型/對象類型 / 變量前綴 / 備注
          byte bye
          char chr
          float flt
          boolean bln 做布爾變量時,使用bln
          Integer/int int
          String str
          Single sng
          short sht
          Long/long lng
          Double/double dbl
          Currency cur
          Variant bln astr obj vnt 做布爾變量用時,用bln,做字符串數組用時,用astr,做為對象使用時,用obj,不確定時,用vnt。
          對于數組,在數據類型的前綴前再增加一個a,例如字符串數組為astr。對于在多個函數內都要使用的全局變量,在前面再增加“g_”。例如一個全局的字符串變量:g_strUserInfo。

          在變量命名時要注意以下幾點:
          · 選擇有意義的名字,注意每個單詞首字母要大寫。

          · 在一段函數中不使用同一個變量表示前后意義不同的兩個數值。

          · i、j、k等只作為小型循環的循環索引變量。

          · 避免用Flag來命名狀態變量。

          · 用Is來命名邏輯變量,如:blnFileIsFound。通過這種給布爾變量肯定形式的命名方式,使得其它開發人員能夠更為清楚
          的理解布爾變量所代表的意義。

          · 如果需要的話,在變量最后附加計算限定詞,如:curSalesSum。

          · 命名不相包含,curSales和curSalesSum。

          · Static Final 變量的名字應該都大寫,并且指出完整含義。

          · 如果需要對變量名進行縮寫時,一定要注意整個代碼中縮寫規則的一致性。例如,如果在代碼的某些區域中使用intCnt,而在另一些區域中又使用intCount,就會給代碼增加不必要的復雜性。建議變量名中盡量不要出現縮寫。

          · 通過在結尾處放置一個量詞,就可創建更加統一的變量,它們更容易理解,也更容易搜索。例如,請使用 strCustomerFirst和strCustomerLast,而不要使用strFirstCustomer和strLastCustomer。常 用的量詞后綴有:First(一組變量中的第一個)、Last(一組變量中的最后一個)、Next(一組變量中的下一個變量)、Prev(一組變量中的上 一個)、Cur(一組變量中的當前變量)。

          · 為每個變量選擇最佳的數據類型,這樣即能減少對內存的需求量,加快代碼的執行速度,又會降低出錯的可能性。用于變量的數據類型可能會影響該變量進行計算所產生的結果。在這種情況下,編譯器不會產生運行期錯誤,它只是迫使該值符合數據類型的要求。這類問題極難查找。

          · 盡量縮小變量的作用域。如果變量的作用域大于它應有的范圍,變量可繼續存在,并且在不再需要該變量后的很長時間內仍然占用資源。它們的主要問題是,任何類 中的任何方法都能對它們進行修改,并且很難跟蹤究竟是何處進行修改的。占用資源是作用域涉及的一個重要問題。對變量來說,盡量縮小作用域將會對應用程序的 可靠性產生巨大的影響。
          關于常量的命名方法,在JAVA代碼中,無論什么時候,均提倡應用常量取代數字、固定字符串。也就是說,程序中除0,1以外,盡量不應該出現其他數 字。常量可以集中在程序開始部分定義或者更寬的作用域內,名字應該都使用大寫字母,并且指出該常量完整含義。如果一個常量名稱由多個單詞組成,則應該用下 劃線“_”來分割這些單詞如:NUM_DAYS_IN_WEEK、MAX_VALUE。

          posted @ 2012-04-15 18:53 paulwong 閱讀(4550) | 評論 (0)編輯 收藏

          工作流引擎Activiti使用總結

          http://www.kafeitu.me/activiti/2012/03/22/workflow-activiti-action.html


          源碼來了:
          https://github.com/henryyan/kft-activiti-demo

          posted @ 2012-04-09 16:39 paulwong 閱讀(2070) | 評論 (0)編輯 收藏

          調優思路

          1、使用剖析器,如jvisualvm等工具抓快照,分析調用次數最多,和耗時最多的Java代碼;

          2、如果數據庫是Oracle,可以把數據庫遷移到11G進行測試,11G里面也有一個剖析工具抓快照,可以分析出哪條SQL語句執行最頻繁,哪條SQL執行最耗時;

          3、如果是WebApp,可以自己去修改clickstream的filter抓取和記錄所有的用戶請求,統計記錄結果中的訪問次數和耗時;

          posted @ 2012-04-09 00:37 paulwong 閱讀(257) | 評論 (0)編輯 收藏

          基于ZooKeeper的分布式Session實現

          http://my.oschina.net/jsan/blog/52151

          posted @ 2012-04-02 00:14 paulwong 閱讀(359) | 評論 (0)編輯 收藏

          ACTIVITI KICK START

          https://github.com/jbarrez/Activiti-KickStart

          一個基于ACTIVITI的內容管理系統:
          http://code.google.com/p/echoice/source/browse

          ACTIVITI中文使用手冊:
          http://www.georgeinfo.com/file/activiti-doc.pdf

          posted @ 2012-04-01 00:43 paulwong 閱讀(288) | 評論 (0)編輯 收藏

          使用 WS-AtomicTransaction 和 JTA 的分布式事務

          http://wenku.baidu.com/view/f3126425ccbff121dd3683b3.html

          在現在的企業應用程序的開發中,Web 服務已經越來越普遍。然而,從傳統意義上來說,它們還沒有達到和所支持的服務相同的水平。當構建 J2EE 應用程序,特別是事務服務的時候,企業依賴于這些服務。本文概述了事務服務是如何在一個使用 Java Transaction API 的 J2EE 環境中的 Web 服務事務的幫助下,與 Web 服務實現無縫連接的。

          本文簡要地概述了這項新的 Web 服務技術和已被證實的傳統的事務技術,解釋了它們是如何能夠跨分布式的 J2EE 環境甚至跨不同的事務體系結構來實現互操作的。

          本文假設您已經對事務服務的概念(例如,ACID properties、提交/回滾、事務劃分,等等)的理解達到中級水平。要想了解事務服務的進一步信息,特別是 JTS,請參考文章 Java theory and practice:Understanding JTS —— An introduction to transactions。這篇文章可以在 developerWorks 上找到(請參閱 參考資料)。同樣,我也想要推薦一本關于事務的更全面信息的好書,它就是由 Philip Bernstein 和 Eric Newcomer 合著的 Principles of Transaction Processing(請參閱 參考資料


          什么是 Java Transaction API(JTA)?

          JTA 是事務服務的 J2EE 解決方案。本質上,它是描述事務接口(比如 UserTransaction 接口,開發人員直接使用該接口或者通過 J2EE 容器使用該接口來確保業務邏輯能夠可靠地運行)的 J2EE 模型的一部分。

          JTA 具有的三個主要的接口分別是 UserTransaction 接口、 TransactionManager 接口和 Transaction 接口。這些接口共享公共的事務操作,例如 commit()rollback() , 但是也包含特殊的事務操作,例如 suspend()resume()enlist() ,它們只出現在特定的接口上,以便在實現中允許一定程度的訪問控制。例如, UserTransaction 能夠執行事務劃分和基本的事務操作,而 TransactionManager 能夠執行上下文管理。本文僅僅需要您對 JTA 有一個基本的了解。


          JTA 的好處?

          JTA 是一個定義明確的事務服務,向 J2EE 應用程序開發人員提供一種可以直接使用的服務。作為選擇,一個應用程序也可能這樣部署,容器將代替開發人員來管理事務行為。在后一種情況下,開發人員能夠全神貫注于他們的應用程序的業務邏輯,同時由 J2EE 容器來負責事務邏輯。

          模型明確的事務服務的好處是對于每個單獨的事務總是維持四個 ACID 特性。盡管這是一個實現相關的問題,WebSphere Application Server 提供為每個導入的或者導出的事務保護這些 ACID 特性的能力,而不管并發的事務數目是多少。


          JTA 的限制?

          經歷過所有的事務體系結構,想要有效地將一組事務傳送給其他并不共享同樣模型的事務服務,同時保持原子的工作單元,是非常困難的。在我們的案例中,建模的 JTA 運行在 Java Transaction Service(JTS) 之上,JTS 處理輸入和輸出事務傳送的請求。

          因為 JTS 是一種由 CORBA 定義的對象事務服務(OTS)的 Java 實現,它只能夠與另一個 OTS 模型連接。因此, 一個事務只能傳送給另一個 OTS-兼容的目標,典型地即另一個 J2EE 實現。因為 JTA 和 JTS 規范沒有對這些接口的底層實現加以限制 (只要它們符合模型),事務可以安全地在兩個 J2EE-兼容的應用程序服務器之間傳送,而沒有丟失它們的 ACID 特性的風險。然而,J2EE 服務器并不必須處理非 J2EE 調用。

          某些 J2EE 服務器可能是例外;例如,WebSphere Application Server 將正確地處理一個與 CORBA 兼容事務相關聯的輸入的 CORBA 請求,將這個事務傳送給線程,然后在它的上下文里執行事務工作。然而,在大多數情況下,當您試圖在事務模型之間移動的時候,您不得不超越 JTA 和 JTS,把目光投得更遠,在這里 Web 服務出現了。


          什么是 Web 服務?

          Web 服務是一種能夠作為應用程序一部分部署在可訪問的服務器上供內部和外部客戶使用的對象。Web 服務由它的 Web 服務描述語言(WSDL)來描述。它定義了一個使用基于 XML 調用(典型地使用 SOAP 協議)的 Web 服務的輸入和輸出參數的用法。例如,客戶端可以查看已經由服務器發布的 WSDL,然后構造客戶端代碼來調用 Web 服務。一旦完成,它就能夠通過將 SOAP 消息傳遞給 Web 服務的一個方法來調用它。在這條 SOAP 消息中包括諸如方法 名稱的信息以及任何它所需要的參數。返回值將在另一條 SOAP 消息里被傳送回來,再由客戶提取出來。


          使用 Web 服務的好處?

          Web 服務由哪種語言編寫而成并不重要,因為 WSDL 沒有定義語言或者編程的模型相關的細節(例如,Java 和 J2EE 技術)。這就給了 Web 服務的作者和客戶端的作者選擇他首選的解決方案 的靈活性。

          讓我們來比較一下 Web 服務和 Enterprise JavaBean(EJB)組件。EJB 組件要求 RMI-編譯的代碼,以便使客戶端能夠訪問,所以 它能夠像它的代理一樣創造本地的存根(stub)對象。因此,這將需要在每一次它們改變的時候,向所有的客戶端重新分配存根(stub)。 無論如何,和 Web 服務一起您將使用 WSDL,所以客戶端能夠構造它們自己的客戶端調用代碼,在本地類路徑上不需要服務器的類來執行調用。這個模型提供了一個非常巧妙的方法調用過程。 EJB,作為 J2EE 模型的一部分,必須使用 Java 客戶來調用,最好是一個 J2EE 管理的客戶端。另一方面,Web 服務可以被任何客戶端代碼所調用,這個代碼能夠構造一個結構良好的 SOAP 請求。因而,舉例來說,一個部署在 J2EE 服務 器上的 Web 服務能夠使用 C++ 客戶來調用。


          Web 服務的限制?

          因為 Web 服務請求(通過 HTTP 的 SOAP)的性質與其他的方法調用(例如,一個使用通過 IIOP 的 RMI 的 EJB 調用)差別很大,支持執行分布式事務的代碼直到最近才可獲得。這已經成為在 使用 Web 服務作為分布式事務企業應用程序一部分時,主要的問題。本質上,Web 服務不能運行在 Web 服務調用之前開始的事務上下文 中,也不能將一個事務上下文傳送給另一個組件。


          那么,問題是什么呢?

          如果 Web 服務被用于工業,必須確保它們在事務環境 中運行的時候,以可靠的和可預知的方式工作。直到現在,Web 服務只能夠使用獨立于其他組件的事務——在 Web 服務的方法范圍里劃分的 和服從它的底層的事務實現的規則——并且物理上不能離開 Web 服務或者進入另一個 Web 服務。企業應用程序具有始終在企業組件間流動 的事務。這需要成為 Web 服務的標準來確保它們能夠被正確地使用,通過利用 Web 服務的功能僅僅忽略在我們的所有嚴格的企業應用 程序中依賴的和使用的事務支持來避免改變您的編程風格。


          那么,解決方案是什么呢?

          解決方案就是一種稱為 Web 服務事務(WS-Transaction) 的新技術。它能夠調整事務的上下文。這個上下文可以被 Web 服務、其他的諸如 EJB 的 J2EE 組件、甚至其他支持 WS-Transaction 的 非 J2EE 事務服務使用。

          WS-Transaction 是一個規范。它擴展了 Web 服務協調(WS-Coordination)規范來定義一種支持原子事務的協調。


          什么是 WS-Coordination

          WS-Coordination 是一個協調框架來使分布的參與者 能夠在他們個體行動之上就一個通用的結果達成協議。

          本質上,這意味著分布式的參與者(例如,在不同機器上的兩個應用程序服務器)將能夠使用 WS-Coordination 把每個參與者 的行為集在合一起,進一步地,并且通過確保它們完全同意對于在這個協調上下文里它們各自執行的所有行為均產生單一的結果,來 進一步管理這些行為。否則,則不能以一個受控的方式來完成這些功能。

          協調上下文可以被看作是一個標識符,行為執行在這個標識符之下。作一比較,這個概念非常類似于事務上下文。當事務工作完成, 在事務上下文里管理它,當調用這個上下文去確定或會滾時這個工作完成。協調上下文包含的附加信息是一個協調標識符、關于協調類型的 詳細資料以及包括端口信息以便協調服務能夠被訪問的協調協議。在下面定義了這些術語。

           

          協調服務,或者 協調器(Coordinator), 進一步由三個服務組成: 激活服務(activation service)注冊服務(registration service)協調協議(coordination protocol) 服務。激活服務支持 CreateCoodinationContext 操作來允許新的協調上下文存在。注冊服務支持 Register 操作來允許參與者 在協調上下文中執行工作。協調協議服務支持協調協議的使用,這個協議定義了協調器(Coordinator)和參與者之間的行為和通信。

          協調類型是一個協調行為的固定的集合,這個集合詳細說明了協調協議的集合以及協調器(Coordinator)應該如何驅動完成。 WS-Transaction 規范描述了兩個協調類型—— 原子事務(Atomic Transaction)(AT)和 業務協定(Business Agreement)(BA)。 這些協調類型中的每一個都包括協調協議。例如,原子事務(Atomic Transaction)協調類型包括像 two-phase commit protocol(Durable2PC)和 phaseZero protocol(Volatile2PC)這樣的協調協議。 您可以希望在支持原子事務的環境中使用這兩個協議。

          業務協定(Business Agreement)協調類型提供了一種不同的功能類型。它被設計成用于更長的時幀。而不像原子事務,正常地您 與它聯系一個非常短的生命期。業務協定協議(Business Agreement protocol)的一個例子就是它自己,被稱作業務協定(Business Agreement) 它是一個補償協議。


          WS-Coordination 和 WS-Transaction 之間是什么關系?

          WS-Coordination 是基本的框架,使參與者之間活動的分布式結果成為可能。WS-Transaction 定義了協調類型,例如原子事務(Atomic Transaction),協調類型使用 WS-Coordination 框架來定義規則。在協調器(Coordinator)和參與者通信時,它們必須遵循這些規則。兩者之間的這個區別很重要。

          兩個應用程序和一個協調器(Coordinator)之間主要的協調流程如下面的 圖 1所示。


          圖 1. 基本協調流程
          1. App1 向在協調器上的激活服務提出一個請求。
          2. 協調器開始一個新的活動,使用它的 CoordinationContext (協調器的 XML 消息)來對 App1 做出響應。
          3. App1向注冊服務提出請求來注冊使用協調協議X。
          4. App1 以它期望的方式調用 App2,傳遞 CoordinationContext 給協調器。
          5. App2 向注冊服務提出請求(使用諸如端口信息的參數,它們 可以在 App1 傳遞的 CoordinationContext 中找到)來注冊使用協調協議Y。
          6. App2結束它的工作,將控制返還給 App1,活動結束。
          7. 協調器使用協議 X 類型消息響應 App1
          8. 協調器使用協議 Y 類型消息響應 App2


          協調器調解

          在一個現實世界的情況中,Web 服務可能是事務的和分布式的,協調器的發起者( App1)將 CoordinationContext 傳遞給任何它所期望的活動中的參與者( App2)。這個上下文的接收者有兩種選擇:它們可以使用已經創建好了的協調器( Ca),或者如果它們愿意,也可以在初始的 CoordinationContext 中傳遞創建的新的協調器。然后,第二種選擇將新的協調器( Cb) 作為 App2的代理協調器。它將包括與協調器 Ca相同的活動標識符,但是當 App2向它的協調器 Cb注冊 Durable2PC 協議的時候,它的請求直接傳送給了協調器 Ca。 類似地,在結束時,準備和提交消息在最終到達 App2(它已經注冊過 Durable2PC 協議)之前將從協調器 Ca傳遞給協調器 Cb

          請參閱 WS-Transaction 規范的 4.1 節 AT3.1 Example Atomic Transaction Message Flow,在那里您將看到一個應用程序和調解的協調器之間的 WS-Coordination 流程的非常好的示例(請參閱 參考資料)。


          Web 服務事務:原子事務(WS-AtomicTransaction)

          WS-AtomicTransaction 是一種對于原子事務的特殊的協調類型,它提供了一組協調協議。這些協調協議是:

          • Completion
          • CompletionWithAck
          • Volatile2PC
          • Durable2PC
          • OutcomeNotification

          當協調上下文創建以后,協調類型被指定,但是協調協議直到注冊時才被指定。任何參與者可以注冊任意數目的協調協議,應該發送和接收 由協議定義的恰當的消息。例如,如果一個參與者在協調器中注冊了 Durable2PC 協議,當完成時一條準備消息將被發送給這個參與者,它們將被認為以與正常的事務資源相似的方式投票。想要了解這里每個協議的信息和它們的狀態圖,請查閱 WS-Transaction 規范, 第 4 節 AT3 Coordination protocols(請參閱 參考資料)。


          如何能將 JTA 事務和 WS-AtomicTransaction 一起使用?

          因為 JTA 和 JTS 是實現相關的,我將使用的這個示例是 WebSphere Application Server V5.0.2 和 WS-Transaction Tech Preview。這個場景將有兩臺機器,每個上都運行有應用程序服務器,如 圖 2 所示。 應用程序服務器A部署并運行一個 Bean Managed Transaction(BMT)EJB 組件。應用程序服務器B部署并運行一個 Web 服務。 EJB 組件通過使用 JTA 提供的接口 UserTransaction 開始一個事務。它對 XA-compliant database 執行事務工作(步驟 1),然后使用 SOAP/HTTP 向在應用程序服務器B上的 Web 服務發送一個請求(步驟 2)。Web 服務對 XA-compliant database 執行工作(步驟 3),然后返回到 EJB 組件(步驟 4),由它再次使用 UserTransaction 接口來提交事務。所有由 EJB 和 Web 服務對數據庫執行的事務都已經被包含在一個活動的范圍里,這個活動是由協調器恰好在調用 Web 服務(步驟 2)之前創建的,它已經被提交,同時保存著所有的 ACID 特性,它就好像是單一的工作單元。

          讓我們來看看下面的兩個領域——J2EE 領域和 Web 服務領域。在 J2EE 領域里,使用的事務模型是 JTA。在 Web 服務領域里, 使用的事務模型是 WS-AtomicTransaction。WebSphere Application Server 把一個 Java Web 服務看作是一個 J2EE 對象,因此也就 意味著,Web 服務的實現屬于 J2EE 領域,而調用屬于 Web 服務領域。在 WebSphere 領域,正確地驅動協議總是正在被使用的模型 (JTA 或者 WS-AtomicTransaction)的責任。

          圖 2 展示了 在一個事務企業應用程序中包含 Web 服務是多么的容易,同時也展示了對于沒有費一行代碼麻煩就在導入的事務上下文中運行這個 Web 服務的用戶來說,它又是多么的無縫。


          圖 2. 使用 JTA 事務和 WS-AtomicTransaction 事務

          請注意:The EJB 組件正運行在一個受管理的環境中(EJB 容器)并且 Web 服務是符合 JSR 109。

          它只能和 JTA 一起工作嗎?

          WS-Coordination 依靠它的基于XML的調用來 利用它本身是 Web 服務的優勢。因為用來調用 WS-Coordination 操作的協議是 SOAP,消息內容是 XML 格式的純文本。這意味著,當使用 HTTP 傳遞給 Web 服務時,將不能僅僅通過 SOAP 包本身來確定客戶的詳細資料,例如編程語言。因此,WS-AtomicTransaction 將能夠與任何其他的使用任何支持 WS-AtomicTransaction 的編程語言編碼的事務服務相連接。

          在近來的一個由 IBM 和 Microsoft 主辦的 Web 服務演示上,展示了 WS-AtomicTransaction 的這個跨事務服務和編程語言的互操作性。 圖 3 展示了一個示范這項技術的場景。

          圖 3 中有一個.NET 服務器開始一個非 JTA 事務,向兩個 WebSphere 應用程序服務器和另外一個.NET 服務器提出了 Web 服務調用請求。每個應用程序服務器都使用它們的底層事務服務來執行事務工作。每次您能夠使用 WS-Transaction 調用一個您將轉到的 Web 服務。當發起者完成事務,您使用 WS-Transaction 技術來協調每個參與者,確保它們都已完成,就好像它們是單一的工作單元似的。


          圖 3. 在 Steve Mills 和 Bill Gates 的 Web 服務演示中的一個 WS-AtomicTransaction 場景的示例拓撲。

          總結

          在本文中,您已經了解到 WS-Coordination 和 WS-Transaction 的基本概念。到現在為止,Web 服務還不能在分布式環境里使用事務。WS-Transaction 允許 Web 服務執行事務工作,這個事務工作作為更廣泛的活動生成組件、應用程序服務器、甚至實現的一部分,正如在 IBM 和 Microsoft Web 服務演示中所展示的。

          在 WS-Transaction 的支持下,我們能夠可靠地使用 Web 服務作為我們的企業應用程序的一部分,因為它已經為事務支持嵌入到其他的企業組件里。

          posted @ 2012-03-30 00:21 paulwong 閱讀(939) | 評論 (0)編輯 收藏

          僅列出標題
          共115頁: First 上一頁 84 85 86 87 88 89 90 91 92 下一頁 Last 
          主站蜘蛛池模板: 鄂州市| 平遥县| 仁怀市| 永胜县| 当阳市| 博湖县| 保山市| 大余县| 思茅市| 阜平县| 固阳县| 南通市| 怀宁县| 醴陵市| 陆川县| 刚察县| 华亭县| 泸西县| 凌云县| 响水县| 吉林省| 遵义市| 枣庄市| 马公市| 莱州市| 行唐县| 河南省| 公主岭市| 泾川县| 嘉善县| 基隆市| 衡东县| 贡觉县| 遂昌县| 长葛市| 桂林市| 壤塘县| 南郑县| 石泉县| 个旧市| 北碚区|