标签: ejbwas(ejb)集群webspherewebsphere部署问题分布式部署 |
分类: IBM服务器Websphere |
IBM Websphere服务器(集群)常见问题及解决方案
笔者接触IBM的Websphere服务器有2年多的时间了,对它的了解也是微乎其微(太复杂了),使用的版本有WAS 6.1、8.0 、8.5,之前完成的几个项目都是使用的该服务器进行部署,使用的总体感受是:
l 搭建环境比较麻烦,安装补丁包太多
l 部署比较慢,容易出问题,特别是缓存问题(后续会有提到)
l 运行起来稳定性还不错,不过一些参数配置需要注意
最近的一个项目同样也是使用该服务器,搭建的比较的复杂,出了一些问题,个人感觉比较典型,网上资料也非常少,本人也是头疼了好多天,最后还是找IBM工程师解决的,在此作一下总结,也希望给以后遇到类似情况的同仁们提供一些参考。
项目分为前端web和后台逻辑app,系统环境:linux,服务器:Websphere8.0
l Web端使用2台服务器m1、m2,同时使用1台服务器m3做F5均衡负载;
l App端使用2台服务器m4、m5,同时使用1台服务器m6做Dmgr管理m4、m5,后台的负载是使用EJB集群负载。
由于之前问题是出在生产环境上,当时问题出现时没有截图,现在总结只能找一部分的日志进行述说了。
WAS集群环境搭建好以后,EJB(APP)部署不上去,部署错误日志如下:
SEVERE: Error generating RMI code: RMIC command failed on project: business with message:
error: Class org.apache.log4j.Logger not found.
error: Class Business contains an invalid return type.
error: Class com.sinosoft.service.Business contains an invalid argument type in method request.
ADMA5008E: EJBDeploy 程序处理文件/home/wasadmin/IBM/WebSphere/AppServer/profiles/Dmgr01/wstemp/514564614/upload/business_jar.ear 失败。异常为:com.ibm.etools.ejbdeploy.EJBDeploymentException: Error executing EJBDeploy
ADMA0063E: Enterprise JavaBeans(EJB)部署期间发生错误。异常:com.ibm.etools.ejbdeploy.EJBDeploymentException: Error executing EJBDeploy
ADMA5011I: 清除应用程序 business_jar 的 temp 目录已完成。
ADMA5014E: 应用程序 business_jar 安装失败。
应用程序 business_jar 安装失败。
错误信息大致为log4j相关的class没有加载上,EJB初始失败。检查共享库的配置,没有问题。应该是Websphere类加载先后顺序的问题。
u 解决方案
Ø 方案1:直接将log4j.jar解压,将class打包到部署包中
Ø 方案2:调整websphere的类加载顺序,选择server,将类加载模式设置成parent_last。设置完后要重启server
上述问题解决完后,EJB仍然部署不上去,具体错误日志忘记了,错误内容大致为:EJB集群的环境不一致,这个问题很是坑爹,折腾了1天多都没有搞定,最后请了IBM工程师,发现问题是后台2台服务器的时间差距太大(一台服务器的时间不准确),将服务器时间调整一致后,问题解决。真不知道客户IT部门是怎么搭的环境…..
解决完上面的2个问题后,项目终于顺利的部署上去了,结果在测试时报了webservice调不通的错误,错误日志如下:
EJB threw an unexpected (non-declared) exception during invocation of method "request" on bean "BeanId(business_jar#business.jar#BusinessFacade, null)". Exception data: java.lang.VerifyError: JVMVRFY013 class loading constraint violated; class=org/apache/axis/message/NodeImpl, method=getParentNode()Lorg/w3c/dom/Node;, pc=0
at java.lang.J9VMInternals.verifyImpl(Native Method)
at java.lang.J9VMInternals.verify(J9VMInternals.java:85)
at java.lang.J9VMInternals.verify(J9VMInternals.java:83)
at java.lang.J9VMInternals.verify(J9VMInternals.java:83)
at java.lang.J9VMInternals.verify(J9VMInternals.java:83)
at java.lang.J9VMInternals.initialize(J9VMInternals.java:162)
at org.apache.axis.client.Call.invoke(Call.java:2364)
at org.apache.axis.client.Call.invoke(Call.java:1812)
u 解决方案
由于共享库里的xmlbeans-2.3.0.jar和websphere内部包冲突,去掉该jar包,重启server。重启完以后发现还是不管用,此时尝试一下卸载程序包,清除Websphere的所有缓存,然后重新部署。一定要清除所有的缓存,删除掉temp、wastemp,保险起见,最后用find命令找一下残留文件,全部删除,websphere只要有缓存,就容易出问题,在这一点上真是吃了不少的亏了……
除了上一个项目遇到的问题外,之前项目也遇到几个问题,较为简单,在此也作一下总结
检查系统默认的环境变量和字符集编码,同时可以设定server Java虚拟机的字符编码,当然前提是要保证系统装了汉语字符集(特别是一些linux环境)。
连接数不足,设置数据库连接池的最大连接数,websphere默认的一般都比较小,最大连接数5个,在管理界面设置即可: Data sources > dbcpas > Connection pools
内存溢出,应该是项目程序的问题了,检查代码的数据库连接是否有没有关闭的;检查代码是否有内存使用不合理的,可以使用内存诊断工具JProfiler调试
一般可能有webservices、ejb调用超时,有些程序的处理时间比较的长,可以根据情况设置websphere的默认处理时间:
l EJB调用参数设置
Server-EJB Container Settings
Server-Container Services-ORB service
l 设置事务的超时时间
Server-Container Services-Transaction service
总的来说,Websphere服务器是一个功能强大而且复杂的服务器(复杂过头了),如果要使用,最好要对它了解的比较深刻,要随时准备解决未知的问题,不到不得已尽量少用吧(客户终于决定减少使用IBM的产品了)。
Websphere服务器最恶心的一点就是缓存,可能你卸载完了其实还隐藏着很多的缓存文件,当出现问题时,记得find一下,删掉所有的缓存文件,从头再来…又是漫长的折磨…