在分布式應用中,單個業務應用的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作為同步消息的傳輸和發現方式效率是最高的。
具體方法如下:
- 配置一個擁有3個jvm的oc4j 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 factory和topic

具體每個配置參數什么意思,可參見Oracle Containers for J2EE Services Guide
具體每個配置參數代表什么意思,可參見Oracle Containers for J2EE Services Guide
創建完畢后,在instance level的config目錄下面打開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"/>
|
Opmn的url格式為:opmn:ormi://主機名:opmn request端口:OC4J Instance Name /Application Name
5.配置toplink會話緩存同步策略
6.權限設置
我們登錄console的server的全局用戶,并不一定有instance level的rmi等權限,所以不能實現jndi的lookup. Oc4j默認采用的是基于文件的認證和授權管理策略,用的是JAAS,通常稱為:jazn,Oracle'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 level的system-jazn-data.xml發現jazn.com/ascontrol_admin和jazn.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-application和applciation level的jazn-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 jvm1的toplink有如下的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 jvm2的toplink有如下的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
