前段时间把一网站升级到 Lerx V2.9 beta 。数据库导出导入更改为 MariaDB 5.5。突然发现网站出问题了,启动后会在24小时之内的的某一个时刻进程被关闭。日志没有任何报错的记录。找不到异常。Tomcat运行日志最后显示如下(由于解决好未保存日志,所以下面的日志是复制的网络上的。应该不会有太大的出入):
-------------------------------------------------------------------------------------
2015-4-6 19:13:13 org.apache.coyote.http11.Http11Protocol pause
信息: Pausing Coyote HTTP/1.1 on http-8080
2015-4-6 19:13:14 org.apache.catalina.core.StandardService stop
信息: Stopping service Catalina
2015-4-6 19:13:14 org.apache.catalina.core.StandardContext stop
信息: Container org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/] has not been started
2015-4-6 19:13:14 org.apache.coyote.http11.Http11Protocol destroy
信息: Stopping Coyote HTTP/1.1 on http-8080
-------------------------------------------------------------------------------------
分析上面的日志,实在找不出原因。似乎就是人为的手动关闭一样。百度发现很多人也发生了这些问题,但没有人发一篇解决办法。
于是翻墙Google什么的,一大堆相同的问题在网上,但可能由于英文水平的问题,没有找到解决办法。
由于近一个半月,无法解决。每每进程中断,唯有手工去再启动 Tomcat 进程。被折磨得苦不堪言。
昨日,在看一篇另外的文章的过程中,意外看到System.exit(X)这个方法,分析中间的X的区别。突然想,是不是Lerx的代码中有这个方法而导致进程主动退出呢。
于是搜索,哈哈哈哈。大乐。
由于前期对Lerx中的动作返回页处理不满意。于是独创出一种方法来处理动作返回:就是利用栈的原理将访问的页面一个一个的压入栈(另写个文本,将不需要记录的URL记入)。这种方法近似乎完美地解决了这一问题。
而这段代码是修改的网上某大侠的代码,代码里原作者这样书写:
public Object pop() { if(isEmpty()) { System.exit(1); }else{ Object result = contents[top-1]; contents[top-1] = null;//出栈 top--; return result; } /*书上这样写简便一点::: * top--; * Object result = contents[top]; * contents[top] = null;*/ }
就是这里面的一行影响了Tomcat的进程。修改了一下,问题解决。
记录如上,如果也解决了您的问题。请关注我们的开源项目。