显示标签为“Weblogic”的博文。显示所有博文
显示标签为“Weblogic”的博文。显示所有博文

2009年4月20日星期一

Weblogic开启关闭


概述
近日由于项目需要,花了些时间部署了我们开发的demo环境到客户公司,客户公司使用的是IBM的AIX操作系统,由于是ADF应用,应用服务器也就毫无疑问地选择了Weblogic。而在应用部署过程中,总结了一些比较有用的Weblogic启动和关闭的脚本。

实现
1、使用相关Telnet工具登录到远程服务器,创建将要发布应用的domain,这里名为demo_domain。
2、正常启动Weblogic:
cd到/bea/user_projects/domains/demo_domain/bin
使用命令./startWebLogic.sh启动Weblogic
此时,Weblogic可以正常启动,但是当使用ctrl+c或关闭当前窗口后,Weblogic即立刻停止,显然在正式应用中这样的方式一般来说是不符合要求的。
3、后台启动(以服务方式启动)Weblogic:
为解决上面描述的问题,需要在后台启动Weblogic,也就是经常提到的以服务的方式启动Weblogic,将信息输出到文件中,这里输出到demo.log。
#nohup ./startWebLogic.sh >demo.log 2>&1 &
在执行上面的命令后,将返回一个进程号,可以记录该进程号,当Weblogic无法正常关闭时,可以通过命令行结束进程。
4、一般来说,启动Weblogic时一般需要输入用户名和密码,在这里假定用户名和密码都是weblogic。当后台启动Weblogic时,输出信息到提示输入用户名时即停止,无法继续正常开启。为解决这样的问题,可以通过修改相应的启动脚本。在这里,我修改了bin目录下的setDomainEnv.sh,添加了如下代码:
WLS_USER=weblogic
WLS_PW=weblogic
JAVA_OPTIONS=-Dfile.encoding=UTF-8
5、停止Weblogic:
./stopWebLogic.sh
有时使用此命令无法正常停止Weblogic,经测试,这种现象还是经常发生的,在出现该状况时需要强行停止该进程。
首先使用ps –ef|grep java查看当前进程,找到该进程,当然,如果刚才已经记录了进程编号,这里就无需再进行查询。
查到后使用 kill -9 进程编号 停止该进程。
有的操作系统用线程模拟进程,部分操作系统下面,Weblogic进程变现为多线程,需要用脚本杀死Weblogic多线程。
ps –ef|grep java |awk ‘{printf “kill -9 ”$2}’>killjava
sh killjava 就可以停掉Weblogic的java进程,但是需要注意该机器是否还有其他java进程,切记小心停错!

参考:http://cyr1974.itpub.net/post/2066/247321
http://liwp_stephen.itpub.net/post/3553/24829
http://www.lupaworld.com/bbs/thread-14112-1-1.html

2009年4月18日星期六

将ADF应用部署到Weblogic


概述
在Jdeveloper 11g中,Oracle已经将Weblogic集成到了IDE中,在使用Jdeveloper 11g进行ADF的开发时,Weblogic也是其默认的部署和运行服务器。同时,在实际应用中,有很多情况下,也需要将ADF部署到Weblogic上,本文主要描述在ADF开发中如何将ADF应用部署到Weblogc。
约定:
1、 Weblogic的域已经存在或使用Jdeveloper默认的Weblogic的域
2、 Weblogic的域在创建时,在“选择域源”步骤中,在“生成一个自动部署的域以支持下列产品”项中勾选了“Application Development Framework”。
3、 将要发布到Weblogic上的应用已经成功创建并完成。
下面我们将部署howtodeploytoweblogic应用到weblogic,这里使用Jdeveloper默认的域。这里仅为部署步骤简介,详细的说明参见文档(Page963 b31974.pdf 第32章 )。

实现
1、 启动Weblogic。如果是通过Jdeveloper打开,可以点击Run-Start Server Instance,若不是通过Jdeveloper打开,可以通过运行脚本。
2、 选择Model项目,双击打开Application Module,点击Configurations,继续选中Local的Configuration,将Connection Type设置成为JDBC DataSource,选择后Datasource Name为java:comp/env/jdbc/howtoDS。



3、 选择ViewController项目,双击点开Project Setting,选择Deployment,删除已经存在的Deployment Profiles,点击New,选择Archive Type为War File,Name为test。



4、 创建WAR后,在Edit War Deployment Profile Properties页面中,选择Web Application’s Context Root为Specify Java EE Context Root,设置为test,点击OK完成。



5、 在应用上点击右键,选择New,在Deployment Profiles的Items中,可以看到只有EAR可用,选择EAR,命名为howtodeploytoweblogic。



6、 在Edit Ear Deployment Profile Properties页面中,选择Application Assembly,选中ViewController.jpr下的test,点击OK完成。



7、 删除原有的Ear,确保此时Deployment Profiles中只有howtodeploytoweblogic,点击OK完成。



8、 在应用上点击右键,点击Deploy,选择howtodeploytoweblogic,进一步选择to EAR file。



9、 发布完成以后记录此时EAR包所在路径,同时登陆Weblogic的管理页面,这里使用Jdeveloper默认域,用户名和密码均为weblogic,url为http://127.0.0.1:7101/console/
10、登录成功后,首先为应用创建数据源,在域结构中点击 服务-JDBC-数据源,选择新建,进入数据源向导。
10.1、点击新建,名称为howtodeploytoweblogic,JNDI的设置需要和步骤2中的Datasource保持一致,这里为jdbc/howtoDS,数据库类型选择Oracle,驱动使用Oracle’s Driver(Thin) Versions:9.0.1,9.2.0,10,11。
10.2、点击下一步到连接属性设置,完成数据库连接属性,点击下一步显示所有的连接属性,点击测试配置,确定连接测试成功。
10.3、继续点击下一步到选择目标,勾选将要应用该数据源的服务器,然后点击完成,消息提示“已激活更改,不需要重新启动”。



10.4、选中刚创建成功的数据源,点击 配置-连接缓冲池,选择高级,勾选保留时测试连接项,继续选择监视,测试数据源,若测试成功,说明数据源配置成功。至此,数据源配置完成。



11、登录成功后在域结构中点击部署,此时在右边可以看到所有已部署在服务器上的应用和库。点击安装,进入安装向导。
11.1、输入刚才EAR包的路径,选中该EAR。



11.2、点击下一步,Weblogic会自动判断将要部署的内容为应用还是库,这里为应用。
11.3、继续点击下一步,根据需要进行设置,这里使用默认设置,直接点击完成。提示部署成功,即可通过浏览器进行访问。url为http://127.0.0.1:7101/test/faces/Main.jspx需要注意的是,这里url地址中的test,对应的是在设置war profiles中的Web Context Root。


最终运行结果:


相关代码请查看:
howtodeploytoweblogic.rar

2009年2月3日星期二

暂时解决Perm Space异常

概述

本文主要描述在ADF开发中如何暂时解决Perm Space异常。

场景:

J2EE应用开发过程中,相信很多开发人员都遇到过Perm SpaceOut of Memory异常,在使用Jdeveloper 11gWeblogic进行ADF开发时,也遇到了该问题,该问题的原因是由于SUN JVM把内存分了不同的区,其中一个就是permenter区用来存放用得非常多的类和类描述。本来SUN设计的时候认为这个区域在JVM启动的时候就固定了,但其没有想到现在动态会用得这么广泛。而且这个区域有特殊的垃圾收回机制,现在的问题是动态加载类到这个区域后,却无法回收。

解决方法:

1、不使用SUNJDK,而改用JRokit

2、适当加大Perm Space

3、其他

这里,我们通过配置文件的修改,适度增大Perm Space,以避免该异常的发生。

实现

1、找到Weblogic启动脚本。如果不知道该脚本的存放路径,可以在Jdeveloper 11g中运行某一应用,在控制台的第一行中会打印出该路径。

E:\Hand\Oracle\Middleware\jdeveloper\jdev\system11.1.1.0.31.51.88\

DefaultDomain\bin\startWebLogic.cmd

[waiting for the server to complete its initialization...]

.

.

JAVA Memory arguments: -Xms512m -Xmx512m -XX:CompileThreshold=8000 -XX:PermSize=96m -XX:MaxPermSize=256m.

WLS Start Mode=Development

2、根据步骤1中的路径找到startWeblogic.cmd文件,使用文本编辑器打开,而在startWeblogic.cmd中是通过调用setDomainEnv.cmd来设置的这些参数,因此,需要继续设置setDomainEnv.cmd

3、修改该文件中的如下内容:

set MEM_ARGS=-Xms512m -Xmx512m

set MEM_PERM_SIZE=-XX:PermSize=96m

set MEM_MAX_PERM_SIZE=-XX:MaxPermSize=256m

4、保存该文件,重新启动服务器

2009年1月26日星期一

应用ADF Logger

本文主要描述在ADF开发中如何应用ADF Logger帮助开发人员调试和诊断错误。

场景:

ADF开发过程中,经常会遇到各种各样的错误,其中有些错误比较容易排查,但是有一些则相对比较难以发现错误根源,此时,经常会使用到日志来显示诊断信息以帮助发现错误。在Java应用中,可以通过创建Java Logger显示Java的诊断信息,在ADF中,即应用ADF Logger进行显示。

Java.util.logging JDK的说明文档中,描述了关于使用日志的四个目标:

1、由最终用户和系统管理员进行问题诊断,这由简单的常见问题日志组成,可在本地解决或跟踪这些问题,如资源不足、安全失败和简单的配置错误。

2、 由现场服务工程师进行问题诊断,现场服务工程师使用的日志信息可以相当复杂和冗长,远超过系统管理员的要求。通常,这样的信息需要特定子系统中的额外日志记录。

3、由开发组织进行问题诊断,在现场出现问题时,必须将捕获的日志信息返回到原开发团队以供诊断。此日志信息可能非常详细,并且相当费解。这样的信息可能包括对特定子系统进行内部执行的详细跟踪。

4、由开发人员进行问题诊断,Logging API 还可以用来帮助调试正在开发的应用程序。这可能包括由目标应用程序产生的日志信息,以及由低级别的库产生的日志信息。但是要注意,虽然这样使用非常合理,但是 Logging API 并不用于代替开发环境中已经存在的调试和解析工具

java.util.logging.level类中定义了一组可以用来控制日志输出的标准日志级别,按照严重程度由高到低依次为:

1SERVER

2WARNING

3INFO

4CONFIG

5FINE

6FINER

7FINEST

具体说明参见文档(P892 b31973.pdf

下面我们将为应用howtoapplyadflogger应用Adflogger,该应用完成了简单的浏览公司职位信息(Jobs)功能。

实现:

1、开启诊断日志,需要设置Java系统参数jbo.debugoutput值为console,在Jdeveloper中可以进行设置:双击打开Model项目,选择“Run/Debug/Profile”项,在“Run Configurations”中选中Default,点击“Edit”按钮,在Java Options中填入-Djbo.debugoutput=console,用于开启诊断日志,这个也是最简单的开启诊断日志的方法。


2、此时运行AppModuleAM),可以看到诊断日志已经在Jdeveloper中打印出来。

[322] *** Using bean introspection to lookup value :clientProxyInterfaceName

[323] Replacing: null with: AppModule_JobsVO1PageDef

[324] Resolving VO:AppModule.JobsVO1 for iterator binding:oracle_jbo_uicli_binding_JUIteratorBinding_0

[325] UIMessageBundle (language base) being initialized

[326] DCUtil, RETURNING: for AppModule.JobsVO1

[327] Tester startup time: 6 s.

[328] INFO: No app _def_ in BindingContext for: AppModule

[329] DCUtil, returning:oracle.jbo.uicli.binding.JUApplication, for AppModule

[330] Replacing: null with: AppModule_JobsVO1_0PageDef

[331] INFO: No app _def_ in BindingContext for: AppModule

[332] DCUtil, returning:oracle.jbo.uicli.binding.JUApplication, for AppModule

[333] INFO: No app _def_ in BindingContext for: PROJECT_GLOBAL_VARIABLES

[334] INFO: mDCRefMap lookup failed. Does the cpx have a dataControlUsages 'dc' entry? PROJECT_GLOBAL_VARIABLES

[335] Resolving VO:AppModule.JobsVO1 for iterator binding:oracle_jbo_uicli_binding_JUIteratorBinding_1

[336] DCUtil, RETURNING: for AppModule.JobsVO1

[337] JobsVO1 ViewRowSetImpl.execute caused params to be "un"changed

[338] Column count: 4

[339] ViewObject: JobsVO1 Created new QUERY statement

[340] JobsVO1>#q computed SQLStmtBufLen: 144, actual=117, storing=147

[341] SELECT JobsEO.JOB_ID, JobsEO.JOB_TITLE, JobsEO.MIN_SALARY, JobsEO.MAX_SALARY FROM JOBS JobsEO

[342] Bind params for ViewObject: JobsVO1

[343] **** refreshControl() for BindingContainer :AppModule_JobsVO1_0PageDef

[344] *** DCDataControl.sync() called from :DCBindingContainer.refresh

3、在完成了前面的设置以后,就 可以使用业务组件浏览器来进行诊断和调试了,例如,我们为JobsEO生成对应的实现类JobsEOImpl.java,在其中添加如下代码:

private static ADFLogger logger =

ADFLogger.createADFLogger(JobsEOImpl.class);

/**

* This is the default constructor (do not remove).

*/

public JobsEOImpl() {

//Modified by Eleven.Xu, 2008.1.8

logger.info("JobsEOImpl AdfLogger Test!");

}

4、此时再次运行业务组件浏览器,发现刚才修改的代码中添加的日志已经被打印出来。

[335] Resolving VO:AppModule.JobsVO1 for iterator binding:oracle_jbo_uicli_binding_JUIteratorBinding_1

[336] DCUtil, RETURNING: for AppModule.JobsVO1

[337] JobsVO1 ViewRowSetImpl.execute caused params to be "un"changed

[338] Column count: 4

[339] ViewObject: JobsVO1 Created new QUERY statement

[340] JobsVO1>#q computed SQLStmtBufLen: 144, actual=117, storing=147

[341] SELECT JobsEO.JOB_ID, JobsEO.JOB_TITLE, JobsEO.MIN_SALARY, JobsEO.MAX_SALARY FROM JOBS JobsEO

[342] Bind params for ViewObject: JobsVO1

2009-1-8 14:13:21 howto.adflogger.model.entities.JobsEOImpl

信息: JobsEOImpl AdfLogger Test!

5、完成了对于Model项目的设置,为在应用运行时打印出必要的诊断日志,接下来将继续对配置文件和ViewController项目进行一些必要的设置,在设置前重新启动服务器并运行Main.jspx页面,没有诊断日志被打印。

2009-1-8 9:28:38 com.sun.faces.spi.InjectionProviderFactory getProviderInstance

严重: JSF1030: The specified InjectionProvider implementation 'com.bea.faces.WeblogicInjectionProvider' cannot be loaded.

Application Deployed Successfully.

Elapsed time for deployment: 30 seconds

---- Deployment finished. ---- Jan 8, 2009 9:28:40 AM

Run startup time: 32125 ms.

[Application howtoapplyadflogger deployed to Server Instance DefaultServer]

Target URL -- http://127.0.0.1:7101/howtoapplyadflogger-ViewController-context-root/faces/Main.jspx

2009-1-8 9:28:56 oracle.adfinternal.controller.faces.lifecycle.JSFLifecycleImpl setLifecycleContextBuilder

警告: ADFc: 'oracle.adfinternal.controller.application.model.JSFDataBindingLifecycleContextBuilder' 替换 ADF 页生命周期实施。

2009-1-8 9:28:56 oracle.adfinternal.controller.util.model.AdfmInterface initialize

信息: ADFc: BindingContext 存在, 并且将 ADFm API 用于 DataControlFrames

2009-1-8 9:28:56 oracle.adfinternal.controller.metadata.provider.MdsMetadataResourceProvider

信息: ADFc: 启用了对 MDS 元数据资源的控制器高速缓存。

2009-1-8 9:28:56 oracle.adf.controller.internal.metadata.MetadataService$Bootstrap add

信息: ADFc: '/WEB-INF/adfc-config.xml' 加载引导元数据。

6、修改logging.xml文件,该文件的位置位于:

1)如果设置了JDEV_HOME,则在该环境变量对应路径下的system/DefaultDomain/config文件夹中。

2)如果没有设施JDEV_HOME,则在Jdeveloper安装目录下的system/system/DefaultDomain/config文件夹中。

查看该文件

红色部分name为空,表示应用于所有package,其日志显示级别为WARNING,则可以显示WARNING或比WARNING更高级的日志信息,这里是Oracle的建议方式,通过这种方式过滤一些低级别的日志信息,保留该默认设置,如果需要对某些package进行更低级别的日志打印,则需要在蓝色部分添加对应信息,例:我们添加打印了oraclehowto两个package的日志信息,级别都为INFO

7、重新启动服务器并运行页面,发现还是不能打印出诊断信息,还需要对于ViewController项目进行简单的设置:双击打开ViewController项目,选择“Run/Debug/Profile”项,在“Run Configurations”中选中Default,点击“Edit”按钮,在Java Options中填入-Djbo.debugoutput=console

8、为查看View层中的日志,在Main.jspx页面添加新按钮,并在对应的Backing ScopeManaged Bean中该Button的事件方法中打印出了日志信息,代码如下:

public String loggerTest() {

logger.info("Managed Bean(Button) Logger Test!");

logger.fine("Fine Level Managed Bean(Button) Logger Test!");

return null;

}

9、重新启动服务器并运行Main.jspx页面,查看日志显示情况。

补充:Jdeveloper中有可能设置了日志显示级别为FINE或者FINEST后,却仍然不能显示出对应级别的日志信息, 是由于在Jdeveloper使用的JRElib中的logging.property文件中规定了默认日志显示的级别为INFO.level= INFO),可以根据情况进行调整,以显示对应级别的日志信息,必须注意的是,伴随日志显示级别的降低,日志打印内容越来越多,由于Java需要大量操作IO,必然导致运行速度变慢,因此,一般情况下,只需将其中的级别设置为INFO

[366] **** refreshControl() for BindingContainer :howto_adflogger_view_MainPageDef

[367] valiateToken:Decompressed BC state:BCST:=0%V%=NJobsVO1Iterator=-D-,

[368] DCUtil, returning:oracle.adf.model.binding.DCParameter, for AppModuleDataControl

[369] (oracle.adf.model.bc4j.DataControlFactoryImpl.SyncMode = Immediate

[370] Reusing a cached session application module instance

[371] **** PoolMessage REQ ATTACH LWS

[372] Invoke refresh for :JobsVO1Iterator

[373] Executing and syncing on IteratorBinding.refresh from :JobsVO1Iterator

[374] Resolving VO:JobsVO1 for iterator binding:JobsVO1Iterator

2009-1-8 14:10:55 howto.adflogger.view.backing.Main loggerTest

信息: Managed Bean(Button) Logger Test!

相关代码请查看:

applyadflogger.rar