OracleApplication Server Containers for J2EE
——OC4J 详解
作 者:苏震云
创建日期:2010-12-02
更新日期:2015-07-21
文档版本:1.5v
文档描述
主要了解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整个请求响应信息交换流程
Oracle Application Server的核心,属于j2ee容器。
EJB,Servlet及JSP的web容器。可以部署J2EE的应用程序。
Oracle数据库的OEM
BIP报表平台
EBS
其他应用产品
要安装独立的OC4J服务器,下载相应的OC4J安装程序:
http://download.oracle.com/otn/java/oc4j/1012/oc4j_extended.zip
oc4j安装包:oc4j_extended_101350.zip
支持的jdk 1.5或1.6
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
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
环境变量:ORACLE_HOME=/u02/oracle
在ORACLE_HOME/bin 目录执行
#oc4j –start
#oc4j-shutdown -port 23791 -password daphne
必须先设置ORACLE_HOME 和JAVA_HOME 环境变量 (参考OC4J安装文档)
在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]
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
下面以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
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
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加载所有其他的配置文件。下面通过不同文件设置来实现不同的功能。
打开rmi.xml 文件
修改23791端口,就可以实现一台PC上运行多个oc4j。
打开defaut-web-site.xml 文件
如果8888端口已经被占用,则修改默认端口8888为8844端口。
配置 server.xml , applicaton.xml 及default-web-site.xml文件
可以详细看6.1.1或6.1.3
进入:OC4J控制台
http://192.168.58.*:7777
输入oc4j管理员的用户名和密码:oc4jadmin / *****
提示:如果应用程序使用OC4J的内部数据源和连接池,那就可以在控制台配置。
OC4J每个应用app,的数据库链接都是可以修改的。
Oc4j:home实例目录下
进入管理
下面有一个JDBC的配置
点击“编辑”
根据应用程序找到,需要配置的数据库连接池
修改配置后,点击应用。
最后重新启动对用的应用程序。
提示:如果应用程序使用OC4J的内部数据源和连接池,那就可以在控制台配置。
进入控制台后,选择‘管理’标签进入管理任务界面,在界面中找到‘JDBC 资源’一栏,点击后面的连接进入配置界面。
JDBC 资源配置界面分为两部分,数据源配置和连接池配置
首先配置连接池信息:根据‘JDBC URL’或‘从连接信息生成 URL’创建连接都可以,配置‘身份证明’信息,配置完成后可点击‘测试连接’按钮进行连接池测试。根据需要可对连接池属性进行配置(如连接数、高速缓存、重试间隔等)
其次配置数据源信息:采用‘受管数据源’模式进行配置,选择上一步配置的连接池信息,设置‘JNDI 位置’(此命名在java中的lookup使用),例如我们设置‘JNDI 位置’的值为jdbc/MyPool,配置完成后也可进行连接测试。
2.通过修改配置文件进行配置
修改{ORACLE_HOME}\j2ee\home\config\目录下的data-sources.xml文件,相对来说比较麻烦,技术高操者可尝试。
查找到对应应用程序连接词,点击进入属性配置
可修改强制超时限制时间间隔
参考官网文档:
http://docs.oracle.com/cd/B31017_01/web.1013/b28950/threadpool.htm#BHBBDFEC
点击管理
点击线程池配置
线程池名称
默认线程池: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的控制台是不可以设置的。
根据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 配置
添加线程配置
更改为如下:
若修改了server.xml配置文件后,必须重新启动OC4J进程。
点击 模块名称-DwebHub
点击配置属性
默认会话超时1200秒,“经验证这个没有起到效果“
OPMN全称Oracle Process Manage AndNotifization Server
OPMN是Oracle Application Server 进程管理器及操作进程的命令的实用工具。
目前是在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'
1、打包
POS实时项目为webdpos.war 包
2、上传文件
将webdpos上传到将oracle/j2ee/home/applications目录下
3、配置application.xml
在home/config 目录,打开application.xml
添加web-module节点
default-web-site.xml文件下增加下列代码:
4、配置defualt-web-site.xml
新增web-app 节点
配置data-sources.xml
打开data-sources.xml文件
新增connection-pool 节点
重启OC4J服务。
在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、配置文件的描述。
以POS在线实时为例说明 webdpos来说
拷贝代码文件
从u01拷贝到u02目录
进入源目录:
#cd/u01/oracle/j2ee/home/applications
将 webdpos目录和webdpos.ear文件拷贝到目标目录
# cp -R webdpos/u02/oracle/j2ee/home/applcations
配置server.xml文件
新增如下节点:
配置default-web-site.xml
新增如下节点:
重启服务即可完成
登录控制台:http://192.168.188.58:8888
勾选 controller
点击停止服务
点击取消部署
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
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/: .
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进程远程监控,应该先关闭)
这个还需要后续的观察。
在我们安装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