OracleApplication Server Containers for J2EE
——OC4J 詳解
作 者:蘇震雲
創建日期:2010-12-02
更新日期:2015-07-21
文檔版本:1.5v
一、文檔控制
文檔描述
主要了解OC4J概念、作用、安裝、啓動及配置和部署應用程序。
二、OC4J概念和作用
1、OC4J概念
OC4J全稱爲Oracle Application ServerContainers for J2EE, 是EJB(enterpriseJavaBean)、servlet 及JSP的Web容器。
oracle產品家族系列爲我們的大規模的企業級應用提供了高可靠性, 穩定性.
OC4J的優點:
OC4J免費的,能適應大中小級的企業級應用. 而不必購買昂貴的服務器套裝.
oc4j存在獨立版本和包含在Oracle Application Server套件中組件的版本。
OC4J獨立版本的下載:
http://www.oracle.com/technetwork/cn/middleware/ias/downloads/utilsoft-100681-zhs.html
穩定版本101350
OC4J整個請求響應信息交換流程
2、OC4J作用
Oracle Application Server的核心,屬於j2ee容器。
EJB,Servlet及JSP的web容器。可以部署J2EE的應用程序。
Oracle數據庫的OEM
BIP報表平臺
EBS
其他應用產品
三、OC4J獨立版安裝、配置及開發
3.1、OC4J安裝
3.1.1、下載安裝包
要安裝獨立的OC4J服務器,下載相應的OC4J安裝程序:
http://download.oracle.com/otn/java/oc4j/1012/oc4j_extended.zip
oc4j安裝包:oc4j_extended_101350.zip
支持的jdk 1.5或1.6
3.1.2、環境變量設置
1、JAVA_HOME
JDK本地路徑,這個變量設置用來啓動OC4J服務
JAVA_HOME=/u02/jdk1.6.0_20
並且把JAVA_HOME 加到PATH
2、ORACLE_HOME
OC4J安裝目錄,也是用來啓動OC4J服務
ORACLE_HOME=/u02/oracle
3、J2EE_HOME
ORACLE_HOME/j2ee/home目錄,用於安裝admin_client.jar, oc4j.jar, and admin.jar工具
J2EE_HOME=/u02/oracle/j2ee/home
更好調用admin_client.jar, oc4j.jar, and admin.jar
3.1.3、linux-安裝
1、新建用戶applprd用戶組 applprd
2、在applprd用戶下,新增目錄
/u01/oracle
3、上傳jdk1.6 和oc4j_extended_101350.zip
4、解壓:
將oc4j解壓到 /u01/oracle目錄
5、設置管理員密碼
在第一次啓動OC4J時,必須要設置一個管理員賬戶
默認已經有一個oc4jadmin賬號
需要設置密碼:
在ORACLE_HOME /j2ee/home目錄下
# jazn.jar -activateadmin password
輸入密碼:
6、啓動服務命令
/u01/jdk1.6.0_20/bin/java-Xms1024m -Xmx2048m -XX:MaxPermSize=256m -jar /u01/oracle/j2ee/home/oc4j.jar-config /u01/oracle/j2ee/home/config/server.xml
3.2、OC4J服務
環境變量:ORACLE_HOME=/u02/oracle
3.2.1、使用OC4J腳本啓動停止
在ORACLE_HOME/bin 目錄執行
#oc4j –start
#oc4j-shutdown -port 23791 -password daphne
必須先設置ORACLE_HOME 和JAVA_HOME 環境變量 (參考OC4J安裝文檔)
3.2.2、使用OC4J.JAR啓動停止
在ORACLE_HOME/j2ee/home目錄下
啓動
#java -jar oc4j.jar [args]
例如:
#java -Xms1024m -Xmx2048m -XX:MaxPermSize=256m
-jar/u02/oracle/j2ee/home/oc4j.jar -config /u02/oracle/j2ee/home/config/server.xml
默認使用ORACLE_HOME/j2ee/home/config/server.xml 你也可以使用自己指定server.xml文件
#java -jar oc4j.jar -config /yourpath/server.xml [args]
停止
在ORACLE_HOME/j2ee/home目錄下
#java-jar admin_client.jar deployer:oc4j:localhost oc4jadmin password -shutdown
#java-jar admin.jar ormi://oc4jHost:oc4jOrmiPort adminId adminPassword -shutdown[ordinary|force] [reason]
參數說明:關閉默認參數爲ordinary, 表示每一個線程都正常關閉
Force表示所有線程立即關閉
reason會記錄到ORACLE_HOME/j2ee/home/config/server.log文件中
#java -jar admin.jar ormi://localhost:23791 oc4jadmin password -shutdown force
need_to_reboot_host_machine
重啓
在ORACLE_HOME/j2ee/home目錄下
#java -jar admin_client.jar deployer:oc4j:localhost oc4jadmin password -restart
#java -jar admin.jar ormi://oc4jHost:oc4jOrmiPort adminId adminPassword -restart[reason]
3.2.3、使用OPMN啓動停止
StartingOC4J in an Oracle Application Server Environment
在ORACLE_HOME/opmn/bin目錄下
啓動
#opmnctl startall
#opmnctl startproc ias-component=default_group
停止
#opmnctl stopall
#opmnctlstopproc ias-component=default_group
3.2.4、達芙妮OC4J項目
下面以POS實時在線項目爲例說明:
開發環境oc4j_dev(92.168.184.47)root用戶
直接啓動
#/u02/jdk1.6.0_20/bin/java -Xms1024m –Xmx2048m-XX:MaxPermSize=256m -jar /u02/oracle/j2ee/home/oc4j.jar -config/u02/oracle/j2ee/home/config/server.xml
或後臺啓動:
#nohup /u02/jdk1.6.0_20/bin/java -Xms1024m –Xmx2048m-XX:MaxPermSize=256m -jar /u02/oracle/j2ee/home/oc4j.jar -config/u02/oracle/j2ee/home/config/server.xml &
或帶性能監控啓動
nohup/u02/jdk1.6.0_20/bin/java -Xms1024m –Xmx2048m-XX:MaxPermSize=256m -Djava.rmi.server.hostname=192.168.184.47-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8080-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false -jar /u02/oracle/j2ee/home/oc4j.jar-config /u02/oracle/j2ee/home/config/server.xml &
正式環境oc4j_prd(192.168.188.58) applprd 用戶
nohup/u02/jdk1.6.0_20/bin/java -Xms1024m –Xmx2048m-XX:MaxPermSize=256m -Djava.rmi.server.hostname=192.168.188.58 -Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=8080-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.management.jmxremote.ssl=false -jar /u02/oracle/j2ee/home/oc4j.jar-config /u02/oracle/j2ee/home/config/server.xml &
查看日誌:
#Tail –f nohup.out
提示
10/12/02 12:02:49 Auto-deployingfile:/E:/OC4J/j2ee/home/default-web-app/ (New s
erver version detected)...
10/12/02 12:02:49 Auto-deployingfile:/E:/OC4J/j2ee/home/applications/dms0/ (New
server version detected)...
10/12/02 12:02:50 Oracle ApplicationServer Containers for J2EE 10g(10.1.2.0.2)
initialized
啓動成功,若想返回命令界面 按Ctrl+C
驗證是否啓動成功
開啓OC4J控制檯:http://localhost:8888
停止服務:
/u02/jdk1.6.0_20/bin/java-jar /u02/oracle/j2ee/home/admin.jar ormi://localhost:23791 oc4jadmin daphne-shutdown force need_to_stop_oc4j
重啓服務
/u02/jdk1.6.0_20/bin/java-jar /u02/oracle/j2ee/home/admin.jar ormi://localhost:23791 oc4jadmin daphne-shutdown force need_to_stop_oc4j
3.3、OC4J目錄結構
3.1.4、OC4J目錄結構及配置文件設置
j2ee 目錄下默認爲一個home的OC4J實例,可創建多個
Config 配置文件server.xml
Applications 部署的應用程序
Default-web-app 默認的web應用程序訪問
Demo 系統提供Demo程序
Oc4j.jar 應用oc4j安裝、啓動、停止及等操作
Lib 類包
Log 存放日誌文件
E:\OC4J\j2ee\home\config目錄下
http-web-site.xml
提供:監聽端口設置及應用程序設置,默認爲8888
principals.xml
安全機制、用戶名和密碼設置
server.xml
設置各種配置文件的使用
application.xml
提供各種類包的使用
rmi.xml
遠程服務端口設置,默認爲23971 , 若同一個服務器,安裝兩個OC4J,則另外一個要修改爲23972
3.4、OC4J配置文件
OC4J配置文件如下:
所有配置文件放在:/u02/oracle/j2ee/home/config 下
根據啓動命令, 可知啓動oc4j入口爲server.xml 文件。
/u02/jdk1.6.0_20/bin/java-Xms1024m -Xmx4096m -XX:MaxPermSize=256m
-jar/u02/oracle/j2ee/home/oc4j.jar
-config/u02/oracle/j2ee/home/config/server.xml
打開配置文件如下:
通過server.xml加載所有其他的配置文件。下面通過不同文件設置來實現不同的功能。
3.4.1、配置啓動端口
打開rmi.xml 文件
修改23791端口,就可以實現一臺PC上運行多個oc4j。
3.4.2、配置監聽端口
打開defaut-web-site.xml 文件
如果8888端口已經被佔用,則修改默認端口8888爲8844端口。
3.4.3、配置應用程序
配置 server.xml , applicaton.xml 及default-web-site.xml文件
可以詳細看6.1.1或6.1.3
五、OC4J控制檯配置
進入:OC4J控制檯
輸入oc4j管理員的用戶名和密碼:oc4jadmin / *****
3.4.1、數據源配置
提示:如果應用程序使用OC4J的內部數據源和連接池,那就可以在控制檯配置。
OC4J每個應用app,的數據庫鏈接都是可以修改的。
Oc4j:home實例目錄下
進入管理
下面有一個JDBC的配置
點擊“編輯”
根據應用程序找到,需要配置的數據庫連接池
修改配置後,點擊應用。
最後重新啓動對用的應用程序。
3.4.2、連接池配置
提示:如果應用程序使用OC4J的內部數據源和連接池,那就可以在控制檯配置。
進入控制檯後,選擇‘管理’標籤進入管理任務界面,在界面中找到‘JDBC 資源’一欄,點擊後面的連接進入配置界面。
JDBC 資源配置界面分爲兩部分,數據源配置和連接池配置
首先配置連接池信息:根據‘JDBC URL’或‘從連接信息生成 URL’創建連接都可以,配置‘身份證明’信息,配置完成後可點擊‘測試連接’按鈕進行連接池測試。根據需要可對連接池屬性進行配置(如連接數、高速緩存、重試間隔等)
其次配置數據源信息:採用‘受管數據源’模式進行配置,選擇上一步配置的連接池信息,設置‘JNDI 位置’(此命名在java中的lookup使用),例如我們設置‘JNDI 位置’的值爲jdbc/MyPool,配置完成後也可進行連接測試。
2.通過修改配置文件進行配置
修改{ORACLE_HOME}\j2ee\home\config\目錄下的data-sources.xml文件,相對來說比較麻煩,技術高操者可嘗試。
查找到對應應用程序連接詞,點擊進入屬性配置
可修改強制超時限制時間間隔
3.4.3、線程池配置
參考官網文檔:
http://docs.oracle.com/cd/B31017_01/web.1013/b28950/threadpool.htm#BHBBDFEC
1、瞭解線程池
點擊管理
點擊線程池配置
線程池名稱
默認線程池:http、jca、system
線程池必須是下面一個
System:爲OC4J運行時使用的線程池
Jca:工作管理線程池,爲j2ca工作管理服務資源適配器要求
http:處理HTTP請求,AJP請求,RMI 請求(如果沒有配置rmi request線程池),RMI 連接(如果沒有配置rmi connection線程池)
rmi request:爲遠程方法調用RMI請求線程池
rmi connection:爲遠程方法連接RMI連接請求線程池
線程名字:爲線程池名稱+計數
例如:SystemThreadGroup_+1 , HTTPThreadGroup_+1
監控POS實時在線的截圖:
最小線程數
OC4J服務器啓動這個線程池可創建的最少線程數,默認爲值0;線程數設置越大,初始系統開銷越大。
Jca線程池默認爲1表示,啓動時就要使用線程。
最大線程數
OC4J服務器啓動這個線程池可創建的最多線程數,默認值爲1024;如果線程池中的線程數沒有達到最大值且沒有空閒線程可以使用,則自動創建線程;如果有空閒線程,優先使用線程。
保持活動
OC4J服務器啓動這個線程池中線程在不管在活動還是空閒狀態,等候新的請求的時間,如果超過時間,則自動銷燬。默認值爲(600秒)10分鐘
若值爲-1 表示永遠都不會銷燬線程,佔用內存大。
若值爲0 表示線程處理完就自動銷燬,佔用CPU高。
根據每秒請求數及每個請求處理時間。及CPU和內存情況,重新設置活動保持時間。
隊列
OC4J服務器這個線程池中可以保存在隊列中最大請求數,默認值爲0;表示可以存放OC4J使用整數(Integer)最大值
隊列中請求數至少是最大線程數的兩倍。
堆大小
線程池的堆大小,默認爲0;目前在OC4J的控制檯是不可以設置的。
2、線程池分析
根據POS系統實時在線項目來分析。
項目實現功能:從總部實時在線下載調撥單,鋪貨單,及上傳門店銷售數據到總部。
後臺環境:一臺AP(4 cpu, 8G 內存) 單獨數據庫(數據庫性能不在這裏分析)
前臺門店請求規模:190家門店每隔3秒訪問後臺服務。
後臺監控數據:
每秒請求數:64.53個
請求處理時間:0.15秒
活動請求數:156
活動會話數:39,164個
(上面的數據可以用OC4J控制檯,性能頁籤中看到)
服務器資源使用情況
分析後臺配置可知
每秒有大約64.53個請求,而活動持續時間10分鐘(600秒),那麼當前存在(包含正在處理的活動和結束的活動)線程數65*600=39000個,約等於前面我們統計活動會話數。
這樣導致內存佔用高,而CPU佔用低,查看服務器資源截圖可知。
將活動時間設置到5秒後
後臺資源情況如下:
CPU佔用明顯變多。
內存還在持續觀察中。
在實際使用中,應用程序停止了。
修改配置,在持續觀察
整個請求處理速度比原來要快,內存還是慢慢增加,但是運行多天後,應用程序並沒有停止,這個比原來要好很多。
改到200後可以,運行一週
修改1000 個線程後,再觀察
同時,會話超時設置爲0秒
重新調整最小線程到200。在繼續觀察中
通過server.xml 配置
添加線程配置
更改爲如下:
<thread-pool name="system" min="0"max="1024" queue="0" keepAlive="600000"stackSize="0"/>
<thread-pool name="http" min="100"max="2048" queue="0" keepAlive="1200000"stackSize="0"/>
<thread-pool name="jca" min="2"max="1025" queue="0" keepAlive="600000" />
若修改了server.xml配置文件後,必須重新啓動OC4J進程。
3.4.4、會話配置
點擊 模塊名稱-DwebHub
點擊配置屬性
默認會話超時1200秒,“經驗證這個沒有起到效果“
四、OPMN使用
4.1、OPMN概念
OPMN全稱Oracle Process Manage AndNotifization Server
OPMN是Oracle Application Server 進程管理器及操作進程的命令的實用工具。
4.2、OPMN操作
目前是在root用戶下啓用,部署在oc4j_apps的OC4J實例的目錄下
路徑:u01/oracle/product/10.1.3.1/OracleAS_1/opmn/bin/
啓動: ./opmnctl startall -- 啓動 opmn allprocess instance for oracle application server
./opmnctl start --啓動 opmn process manage
查看狀態: ./opmnctl status
重載配置文件:./opmnctl reload
關閉: ./opmnctl stopall
單個實例啓動: ./opmnctlstartproc 'process-type=HTTP-Server'
./opmnctl startproc 'process-type=oc4j_apps' -- oc4j_apps 爲OC4J 實例名
重啓 ./opmnctl restartproc 'process-type=HTTP-Server'
六、應用程序管理
6.1、部署應用程序
6.1.1、後臺拷貝War部署程序
1、打包
POS實時項目爲webdpos.war 包
2、上傳文件
將webdpos上傳到將oracle/j2ee/home/applications目錄下
3、配置application.xml
在home/config 目錄,打開application.xml
添加web-module節點
<web-module id="webdpos"path="../../home/applications/webdpos.war" />
<web-module id="controller"path="../../home/applications/controller.war" />
default-web-site.xml文件下增加下列代碼:
<web-appapplication="default" name=" WebReport_web" root="/WebReport" load-on-startup="true" />
4、配置defualt-web-site.xml
新增web-app 節點
<web-appapplication="webdpos" name="DWebHub"load-on-startup="true" root="/webdpos" />
<web-appapplication="controller" name="DWebHub"load-on-startup="true" root="/controller" />
配置data-sources.xml
打開data-sources.xml文件
新增connection-pool 節點
重啓OC4J服務。
6.1.2、控制檯部署代碼
在OC4J home下
點擊“部署”
前提必須將文件DBMDL.war文件拷貝到服務器/u04目錄下。
修改擁有者和權限。
點擊下一步
點擊下一步
查看j2ee/home/目錄下文件有什麼變動
出現如上畫面,說明部署成功。
後臺文件和目錄變動如下:
1、applications 目錄下,新增webdpos和webdpos.ear 文件
2、server.xml 文件新增webdpos的web-app節點
3、default-web-site.xml 文件新增 webdpos的application節點
可以參考:6.1.3、配置文件的描述。
6.1.3、從其他OC4J遷移到另外OC4J
以POS在線實時爲例說明 webdpos來說
拷貝代碼文件
從u01拷貝到u02目錄
進入源目錄:
#cd/u01/oracle/j2ee/home/applications
將 webdpos目錄和webdpos.ear文件拷貝到目標目錄
# cp -R webdpos/u02/oracle/j2ee/home/applcations
配置server.xml文件
新增如下節點:
<applicationname="webdpos" path="../applications/webdpos.ear"parent="default" start="true" />
<application name="controller"path="../applications/controller.ear" parent="default"start="true" />
配置default-web-site.xml
新增如下節點:
<web-app application="webdpos"name="DWebHub" load-on-startup="true"root="/webdpos" />
<web-appapplication="controller" name="DWebHub"load-on-startup="true" root="/controller" />
重啓服務即可完成
6.2、卸載應用程序
6.2.1、控制檯卸載代碼
登錄控制檯:http://192.168.188.58:8888
勾選 controller
點擊停止服務
點擊取消部署
6.2.1、後臺手工卸載代碼
1、配置server.xml
刪除webdpos 的application節點
2、配置default-web-site.xml
刪除webdpos的web-app節點
3、配置application.xml
刪除webdpos的web-module 節點
4、刪除源代碼文件
刪除applications目錄下,webdpos文件和webdpos.ear及webdpos.war
九、變更記錄&常見問題&參考資料
9.1、變更記錄
9.2、常見問題
Oc4j服務啓動不起來,
應該是磁盤空間不足
果然是磁盤空間不足問題,刪除文件重新啓動
還是報錯,
INFO: Legacy datasource detected...attempting to convert to new syntax.
2015-07-09 18:36:31.895 NOTIFICATION JMSServer[]: OC4J JMS serverrecovering transactions (commit 0) (rollback 0) (prepared 0).
2015-07-09 18:36:31.907 NOTIFICATION JMSServer[]: OC4J JMS serverrecovering local transactions Queue[jms/Oc4jJmsExceptionQueue].
2015-07-09 18:36:31.918 NOTIFICATION JMSServer[]: OC4J JMS serverrecovering local transactions Queue[OracleASRouter_store].
2015-07-09 18:36:31.924 ERROR Failed to set the internal configuration ofthe OC4J JMS Server with:XMLJMSServerConfig[file:/u01/oracle/j2ee/home/config/jms.xml]
15/07/09 18:36:31 *** (SEVERE) Failed to set the internal configuration ofthe OC4J JMS Server with:XMLJMSServerConfig[file:/u01/oracle/j2ee/home/config/jms.xml]
2015-07-09 18:36:31.926 ERROR J2EE OJR-00011 Exception starting JMSserver: Failed to set the internal configuration of the OC4J JMS Server with:XMLJMSServerConfig[file:/u01/oracle/j2ee/home/config/jms.xml]
15/07/09 18:36:33 WARNING:ApplicationStateRunning.loadConnectors Exception loading connector OracleASjms: Error parsing oc4j-ra.xml at/u01/oracle/j2ee/home/application-deployments/default/OracleASjms: Fatalerror at line 1 offset 1 infile:/u01/oracle/j2ee/home/connectors/OracleASjms/OracleASjms/: .<Line 1,Column 1>: XML-20108: (Fatal Error) Start of root element expected.
2015-07-09 18:36:33.388 WARNING J2EE JNDI-00002 Resource referencejms/routerCF not found. AllowingJ2EEContext creation to continue anyway.
2015-07-09 18:36:33.389 ERROR J2EE EJB-03027 [default] An error occureddeploying EJB module: java.lang.NullPointerException
15/07/09 18:36:33 WARNING: Application.setConfig Application: default isin failed state as initialization failed.
java.lang.InstantiationException: Error initializing ejb-modules: null
15/07/09 18:36:33 Error initializing server: Application: default is infailed state as initialization failed
15/07/09 18:36:34 Fatal error: server exiting
根據紅色的提示:
檢查這個節點後發現:oc4j-ra.xml 文件爲空了。對比其他環境發現是有xml的數據。
因此解決方法:從其他環境吧這個文件覆蓋,重新啓動 OK了
回到問題:由於我kill 進程oc4j,導致這個文件被寫空了,平常到超做也是這樣的。爲什麼會出現這個問題(一個特別地方是,我電腦使用jconsole進程遠程監控,應該先關閉)
這個還需要後續的觀察。
9.3、參考資料
在我們安裝OC4J後,
例如:
使用如下URL
http://192.168.188.58:8888/em/console/help/zh_CN/
或登錄OC4J控制檯後
點擊“幫助”
就可以查看官方幫助文檔。
官方資料:
http://docs.oracle.com/cd/B31017_01/web.1013/b28950/toc.htm