2007年12月13日星期四

sun-web.xml之痛

去年开发的系统,突然出现了问题,问了原来的开发的成员,说时间太久忘了,只要找我,其实我也差不多忘了。

错误主要是在显示系统中详细信息和保存项目的时候,很快就定位是iplanet端数据库连接池配置问题。

于是,让DBA检查,将密码重新设置,没有成功。
让DBA发过来日志有如下错误,可能是sun-web.xml文件有问题,是不是UNIX下字符出现错误,将我本机的这个文件发过去给DBA,没有成功。

WEB0120: XML error parsing deployment descriptor [/~~~~~~~~/wwwroot/WEB-INF/sun-web.xml]
Failed to create the XML-DOM Document. Check your XML to make sure it is correct.
java.net.ConnectException: 连接超时 at org.apache.crimson.parser.Parser2.fatal(Parser2.java:3376) at org.apache.crimson.parser.Parser2.externalParameterEntity(Parser2.java:3064) at org.apache.crimson.parser.Parser2.maybeDoctypeDecl(Parser2.java:1347) at org.apache.crimson.parser.Parser2.parseInternal(Parser2.java:656)


最后,重新考虑这个日志的时候,忽略了“java.net.ConnectException: 连接超时 ” 这个错误。怎么会网络访问,重新检查sun-web.xml,发现DOCTYPE节点,其声明的dtd文件是指向http://www.sun.com/的,可能这就是问题所在。以前从来没有注意这个问题,对于DOCTYPE,PUBLIC指定DTD文件是在系统之外,需远程访问;如果是SYSTEM,就在本地找寻dtd文件。虽然在我机器上将网络断开,没有重现这个错误,但是比较肯定系统就是遇到这个问题。将这个节点去掉,将sun-web.xml发给系统管理员,果然成功了!


<!DOCTYPE sun-web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Application Server 8.1 Servlet 2.4//EN" "http://www.sun.com/software/appserver/dtds/sun-web-app_2_4-1.dtd">

另外,将系统迁移到iplanet的时候,磕磕碰碰,花费了以整体的时间,记录下来以备忘。

1)Iplanet的版本。
从sun的官方网站下载要注册,我原来有帐户但是忘了,于是从别的地方下载了一个。本来是要6.1版本的,下来发现是6.0的,这就是后面很多错误的根源。
部署完成之后,访问系统的时候,总是出现如下错误:
“"No WebApplicationContext found: no ContextLoaderListener registered"”
在web.xml中增加如下内容,可以Iplanet可以成功启动。

<servlet>
<servlet-name>context</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>



但是访问系统的时候,出现Servlet 2.2中不支持setCharacterEncoding() 错误。乖乖,原来IPlanet只支持Servlet 2.2,而我需要的是2.3版本。于是从Sun上下载了6.1颁布,不需要在web.xml增加上述那段,部署成功。

2)数据库连接池的建立
在Iplanet端建立了连接池,出现总是找不到驱动程序的错误,而实际上classes2.jar已经在WEB-INF/lib路径下。最后在JVM Path Settings中将JDBC的路径直接出入,解决这个问题。








3)Iplanet程序的部署。


首先是将Web程序打包成war。但是Iplanet部署war文件的时候有大小限制,可以先不降lib目录打包,待部署完成再拷贝过去。
部署应用。其对应的路径为:
Administration Server > MyServer > vsclass1 > WebApplication。
其中MyServer是系统默认建立的服务器,vsclass1是系统默认建立的虚拟class。可以同时管理n个服务器,一个服务器上又可以建立n个vsclass1,一个vsclass可以对应多个WebApplication。所以,从左到右都是1:n的关系。为什么会有vsclass1的概念呢? 这是因为对于某些Web Application,其配置可能绝大部分相同,所以可以统一在vsclass层次定义就可,这些Web Applications共享这些设置。这个设计应该是为哪些提供hosting服务的机构设定的吧。但是看看现在hosting,绝大部分都在使用LAMP。
然后就是在vsclass层建立,数据库链接池和JDBC的Resource。
最后别忘了将lib拷贝到Web Application的WEB-INF目录下。


总结,
1) 最初发现问题的时候,虽然大概定位,但是没有再深究问题的根本,再加上时差的问题,问题解决效率不高。
2) 没有模拟服务器环境,而开始只在Tomcat上测试,而sun-web.xml在Tomcat环境下是不需要的,对问题的重现带来困难。
3) 在定位sun-web.xml文件的错误之后,没有静下心来研究文档结构,而是意味怀疑字符问题,耽误解决问题的时间。

Any way,问题总算解决了,休息一下,休息一下。

2007年12月4日星期二

拷贝定时执行的任务

测试机器上的定期运行的任务停止运行已经有快两个星期,最后一次运行应该是感恩节前了。主要的问题是通过执行程序“Start ClientVantage.exe”再也不能生成计划任务 “Standard Transactions” 了。重新启动,OS升级,杀掉系统中的相关进程都不能。虽然是测试机器,但是数据有时候还是有一定参考意义,今天暂时找到一个方法。

1. 从别的机器上将Windows/tasks下的“Standard Transactions”任务拷贝到测试机器的Windows/tasks目录下。
2. 执行的时候应该会出现“Can not start”的错误,那么就编辑这个任务,将开始时间更改一下,系统会提示让你输入这个操作系统的密码,输入完成确定之后,任务就可以正常执行了。


这只是一个暂时的方法,对于每天重新启动,还是不能应付,再想办法。