走自己的路

          路漫漫其修遠兮,吾將上下而求索

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            50 隨筆 :: 4 文章 :: 118 評論 :: 0 Trackbacks
          在分布式應用中,單個業務應用的toplink運行在多個jvm上,同時開啟了會話緩存,而這些在多個jvm上會話緩存中的domain對象就需要同步,這樣可以及時拿到最新的信息而不需要每次都查詢database,這大大減少了樂觀鎖沖突。在Oracle Application Server上Ormi端口是動態分配的,如果一個應用跑在多個jvm上,這些jvm的ormi服務端口也是不同的,所以在開發階段無法確定這些信息,也不好采用多套toplink session的配置。慶幸的是opmn的request端口是固定的,我們可以使用opmn request端口來進行jndi的look up,然后用oc4j jms實現多jvm或者多OC4J instance之間toplink session緩存的同步, 因為經過測試OC4J in memory jms作為同步消息的傳輸和發現方式效率是最高的。
          具體方法如下:
           
          1. 配置一個擁有3jvmoc4j instance



           

              2  toplink session cache 策略的配置


                   <toplink:caching>
                      
          <toplink:cache-invalidation-policy xsi:type="toplink:time-to-live-cache-invalidation-policy">
                         
          <toplink:time-to-live>36000000</toplink:time-to-live>
                      
          </toplink:cache-invalidation-policy>
                   
          </toplink:caching>

           

          3.配置JMS topic connection factorytopic


           

          具體每個配置參數什么意思,可參見Oracle Containers for J2EE Services Guide



           

          具體每個配置參數代表什么意思,可參見Oracle Containers for J2EE Services Guide


           

          創建完畢后,在instance levelconfig目錄下面打開jms.xml可看見所作的配置更改:

                 <topic
                      
          name="cachesyn"
                      location
          ="jms/cachesyn"
                  
          >
                  
          </topic>


                  
          <!-- unified connection factories -->


                  
          <!-- queue   connection factories -->


                  
          <!-- topic   connection factories -->
                  
          <topic-connection-factory
                      
          location="TopicConnectionFactory"
                  
          />


           

          4 opmn配置

           

          查看opmn.xml,獲得request端口

          <port local="6101" remote="6201" request="6004"/>

           

          Opmnurl格式為:opmn:ormi://主機名:opmn request端口:OC4J Instance Name /Application Name


          5.配置toplink會話緩存同步策略


           

          6.權限設置

          我們登錄consoleserver的全局用戶,并不一定有instance levelrmi等權限,所以不能實現jndilookup. Oc4j默認采用的是基于文件的認證和授權管理策略,用的是JAAS,通常稱為:jaznOracle's authorization/policy provider for JAAS

          打開全局的j2ee/config/ system-jazn-data.xml文件,元素<jazn-policy>有下面這一段,policy主要就是為角色和用戶分配具體權限的

          <grantee>
                      
          <principals>
                          
          <principal>
                              
          <realm-name>jazn.com</realm-name>
                              
          <type>role</type>
                              
          <class>oracle.security.jazn.spi.xml.XMLRealmRole</class>
                              
          <name>jazn.com/oc4j-administrators</name>
                          
          </principal>
                      
          </principals>
                  
          </grantee>

           

          只有oc4j-administrators角色才有這些權限。而system team分配給我們的用戶并不擁有該角色,在console界面上也沒找到為server level的用戶也不能進行oc4j-administrators角色的交易,所以也沒jndi lookup的權限,會報javax.naming.AuthenticationException: Not authorized.

          需要在instance level 創建一個用戶,用戶名和密碼和server level的相同或者也可以不同,然后為該用戶分配權限,查看了一下instance levelsystem-jazn-data.xml發現jazn.com/ascontrol_adminjazn.com/oc4j-administrators角色有完整rmi權限,內容如下:

              <permission>
                          
          <class>com.evermind.server.rmi.RMIPermission</class>
                          
          <name>login</name>
                      
          </permission>
                      
          <permission>
                          
          <class>com.evermind.server.rmi.RMIPermission</class>
                          
          <name>subject.propagation</name>
                      
          </permission>

           

          最簡單的方法就是為該用戶分配jazn.com/ascontrol_admin角色,jazn.com可以省略因為jazn.com是默認域,oc4j采用的是域,用戶,角色,權限的層次授權策略。





           

          當然我們也可以在applciation level做到最小權限控制,在orion-applicationapplciation leveljazn-data.xml中進行設置和分配。具體方法可參見

          Oracle® Containers for J2EE Security Guide

          http://download-east.oracle.com/docs/cd/B25221_04/web.1013/b14429/toc.htm


           

          7.Deploy 應用到application server

          這下可以享受toplink cluster帶來的高性能的樂趣了。

          如果成功的話:我們可以看到oc4j_instance jvm1toplink有如下的log

          [TopLink Finest]2008.12.03 06:58:30.961--ServerSession(24138346)--Thread(Thread[RMICallHandler-5,5,HTTPThreadGroup])--Retreived remote message from JMS topic: cachesyn
          [TopLink Finest]2008.12.03 06:58:31.020--ServerSession(24138346)--Thread(Thread[RMICallHandler-5,5,HTTPThreadGroup])--Received remote command oracle.toplink.remotecommand.MergeChangeSetCommand from Service[TopLinkCommandChannel, 3673206, opmn:ormi://localhost:6004:OC4J_TTS/tts]
          [TopLink Finest]2008.12.03 06:58:31.023--ServerSession(24138346)--Thread(Thread[RMICallHandler-5,5,HTTPThreadGroup])--Executing command oracle.toplink.remotecommand.MergeChangeSetCommand from Service[TopLinkCommandChannel, 3673206, opmn:ormi://localhost:6004:OC4J_TTS/tts]
          [TopLink Finer]2008.12.03 06:58:31.098--ServerSession(24138346)--Thread(Thread[RMICallHandler-5,5,HTTPThreadGroup])--Received updates from Remote Server
          [TopLink Finest]2008.12.03 06:58:31.110--ServerSession(24138346)--Thread(Thread[RMICallHandler-5,5,HTTPThreadGroup])--Merging com.ldd600.isdc.sha.frm.tts.model.Employee: [22] from remote server


           

          Oc4j_instance jvm2toplink有如下的log


          ndler-5,5,HTTPThreadGroup])--Retreived remote message from JMS topic: cachesyn
          [TopLink Finest]2008.12.03 06:58:30.721--ServerSession(8762565)--Thread(Thread[RMICallHandler-5,5,HTTPThreadGroup])--Received remote command oracle.toplink.remotecommand.MergeChangeSetCommand from Service[TopLinkCommandChannel, 3673206, opmn:ormi://localhost:6004:OC4J_TTS/tts]
          [TopLink Finest]2008.12.03 06:58:30.724--ServerSession(8762565)--Thread(Thread[RMICallHandler-5,5,HTTPThreadGroup])--Executing command oracle.toplink.remotecommand.MergeChangeSetCommand from Service[TopLinkCommandChannel, 3673206, opmn:ormi://localhost:6004:OC4J_TTS/tts]
          [TopLink Finer]2008.12.03 06:58:30.734--ServerSession(8762565)--Thread(Thread[RMICallHandler-5,5,HTTPThreadGroup])--Received updates from Remote Server
          [TopLink Finest]2008.12.03 06:58:30.736--ServerSession(8762565)--Thread(Thread[RMICallHandler-5,5,HTTPThreadGroup])--Merging com.ldd600.isdc.sha.frm.tts.model.Employee: [22] from remote server


          posted on 2008-12-04 07:00 叱咤紅人 閱讀(1233) 評論(0)  編輯  收藏 所屬分類: Java Persistence, Transaction and ORM Oracle
          主站蜘蛛池模板: 思茅市| 广平县| 佳木斯市| 旌德县| 辰溪县| 彭州市| 平南县| 保康县| 鞍山市| 兴安县| 宁都县| 凤城市| 独山县| 叶城县| 台中市| 两当县| 贺州市| 景东| 巴东县| 福海县| 汨罗市| 沿河| 庄河市| 周口市| 达日县| 新营市| 肥东县| 泰宁县| 枣阳市| 虞城县| 崇阳县| 福鼎市| 福州市| 铁岭市| 阿拉善盟| 宁蒗| 纳雍县| 浦城县| 扬州市| 巴马| 磐安县|