运行环境: 1、weblogic + 项目(spring mvc) + oracle11g数据库 + jdk8.144 2、某个程序在运行一段时间后(针对部分数据保存出错,部分数据不出错),没有进指定方法,直接404出错。 3、重启后,同样的数据保存成功 4、每天下午2-4点左右出现这种情况,未能找到根本的原因(后台没有错误日志与提示) 5、目前调试环境运行无法重现错误。
其它说明: 1、目前排除数据库原因(同时启动了一个应用程序的备机,连到该数据库,在主机出库时,备机正常操作)。 2、报错是针对该页面提交数据的所有用户,不是单个用户 3、java内存运行时正常占用30%左右。
如果有人愿意帮助解决该问题,个人愿意支付技术服务费2000元整,非常感谢参与。
其它说明: 1、目前排除数据库原因(同时启动了一个应用程序的备机,连到该数据库,在主机出库时,备机正常操作)。 2、报错是针对该页面提交数据的所有用户,不是单个用户 3、java内存运行时正常占用30%左右。
如果有人愿意帮助解决该问题,个人愿意支付技术服务费2000元整,非常感谢参与。
1、不是连结池或是资源问题,因为同样的界面,填写一个别的数据,可以正常提交保存2、目前最新的进展,在报错的情况下,连preHandle方法都没进,直接就404。谢谢。
那就是filter,或者weblogic,或者代理服务器给挡住了?前两者的可能性比较大。如果是filter的话,把你用的filter贴出来。如果是weblogic的话,看看weblogic的日志或者linux的message贴出来
调整Accept Backlog参数试一下
参考这个文章
https://blog.csdn.net/lykangjia/article/details/52839656
或者参考上面的文章配置一下其他参数出现问题的时候F12把请求的报文和回来的报文贴出来另外,不一样的数据是什么?你发送数据有多大,有没有特殊字符,比如回车符什么的,正常的数据又是什么?服务器能按固定的步骤重现吗?比如每隔一天下午两点到四点,发送固定的数据会有问题,发送某些固定的数据又没问题。重启之后又好了,是重启weblogic上的application,还是重启weblogic,还是重启linux?
备机是在同一网段的不同的linux上?
2、同样的提交页面,点保存时(页面填写有一些数据可以通过保存,有一些不能)
3、数据量不大,约20多项字段
4、可以保证提交的内容绝无问题(因为同样的数据在重启后豪无问题)
我觉得很有可能是weblogic的配置问题,应该是请求达到一定的程度导致的weblogic层的堆积导致weblogic拒绝了后续同样的请求?
理由有些勉强,如果拒绝请求的话不应该是404错误。
但可以把Accept Backlog调大一些试一下,或者在weblogic层用其他方式优化一下。如果排除了weblogic的问题的话,我很关心有一些数据可以通过保存,有一些不能的问题。
就是在发生错误的时候能保存的数据和不能保存的数据有没有什么明显特征。
如果不能解决问题的话,几乎可以判定应用没问题。
感觉你应该是高手了,我觉得应该先定位问题,用可能的手段层层定位,把问题定位到代理,防火墙,weblogic,filter,程序,连接池,数据库。
定时任务,外部环境上,认为因素上。
还有就是要确认服务器跑的应用只有这一个 否则就暂停其他应用?
每天下午2-4点 那可以搞个小程序修改系统时间跳过这个时间段,如果还有问题那就是不是系统时间引起的
单纯的404,spring会报警报,我怀疑没有进入spring。
weblogic的trace日志也打开,
404的log和正常的log对比一下,看看停到哪了。
看一下这个问题是不是你的问题
http://cybergav.in/2009/07/06/wls-http-404-errors-for-requests-to-bea_wls_internalwldummyinitjvmids/
我是单实例weblogic
给的信息太模糊了,简单的问题的话,你那边团队想必早就解决了,既然外挂我们能帮你解决的问题,又不能提供准确的信息。
我想能帮你解决问题的人不大可能业务环境现象都不明确的情况下花宝贵时间陪你猜来猜去的。
一般这种问题到最后都是很简单的原因,不可能不能定位。
我觉得你的判断有问题,希望提供客观明确的信息。1、主要是不知道提供哪些信息算是有帮助,目前后台用小窗口的模式运行,从小窗口的滚屏上,可以看到输出了访问的路径,但没有出错信息,我弄几个图上来。2、weblogic的日志里面,确实没有一丁点有帮助意义的东西,也仔细看过了。
C: \Oracle\Middleware\user_projects\domains\EPMSystem\precompiled C:\Oracle\Middleware\user_projects\domains\EPMSystem\precompiledJSPs C:\Oracle\Middleware\user_projects\domains\EPMSystem\servers\FoundationServices0\tmp
weblogic的内存配置
每次发布的时候,都是重新打印,删除tmp,cache,logs等,因为这个是运行过程中出错,所以这个无能为力啊。再者,就算出错的时候,部分数据还是可以提交的,这个真不知道该如何解释了
奇怪的吓人,就是停在doSaveCb中,好说后面的catch中的语句也要运行啊,是不是?
把catch exception 改成 cache throwable 试一下,先用system.out打印异常信息,然后再用你的savelog打印,另外5秒空闲关闭连接是不是有点短?先看异常明天。
在本地的开发环境上做如下修改:
1.把weblogic的连接超时时间和生产环境做同样的配置,貌似是5秒。
2.在mtsave的入口处(第一行)加入如下代码,跑一下,看看能否重现问题: try{
System.out.println();
System.out.println("start sleep.");
Thread.sleep(1000*60*6); // sleep 6 minutes
System.out.println("end sleep.");
}catch(Throwable th){
th.printStackTrace();
}3.如果步骤2不能重现问题,在mtsave的入口处(第一行)加入如下代码,跑一下,看看能否重现问题: System.out.println("start testError.");
throw new Error("test error.");4.审查impl.doSaveCB()这个方法从入口到存入DB返回到入口的这一串操作,有没有业务或逻辑问题。
能做的就这么多了。
奇怪的吓人,就是停在doSaveCb中,好说后面的catch中的语句也要运行啊,是不是?这时候数据库日志有异常吗
https://community.oracle.com/thread/695621
貌似是这个配置
Managed Server > Protocols > HTTP > Duration如果weblogic那边5秒就切断的话,应用那边遇到响应时间超过5秒的有可能继续跑,有可能抛出异常,但是浏览器那边catch不到。生产环境上昨晚该得代码try catch error throwable的那个别动,放在生产环境上,出问题的时候检查log。hibernate等jar包版本有没有升级过。
System.out.println("start testError.");
throw new Error("test error.");抛Throwable, Exception,RuntimeException的也都分别测一下,抛给框架,看看weblogic和框架有啥反映。
(RuntimeException和Error以外可以把mtsave方法加上声明抛出)
把这些文件下到本地就解决了。
你的时个别偶尔出错,应该不是这个问题,参考一下。
所有的JAR包应该有近一年没有变动过
代码中这样写了,中午更新一个版本上去,看看下午再出什么错。
1.生产环境不要加throw new Error("test error.");
2.测试环境把我说的那些代码分别加到程序的入口,你现在加的位置没什么用。
加到mtsave刚进来的地方,然后后面的程序都注释掉,不跑业务,直接抛给框架异常,不要trycatch,只想在测试环境看看框架和weblogic接到这几种异常分别会做出什么响应。
public ModelAndView mtsave(HttpServletRequest req
,HttpServletResponse res
,ModelMap model){
try{
System.out.println();
System.out.println("start sleep.");
Thread.sleep(1000*60*6); // sleep 6 minutes 或者更大
System.out.println("end sleep.");
}catch(Throwable th){
th.printStackTrace();
}
}
case2:测试Error异常。原来的注解都加上
public ModelAndView mtsave(HttpServletRequest req
,HttpServletResponse res
,ModelMap model){
System.out.println("start testError.");
throw new Error("test error.");
}
case3:测试Throwable异常。原来的注解都加上
public ModelAndView mtsave(HttpServletRequest req
,HttpServletResponse res
,ModelMap model) throws Throwable {
System.out.println("start testError.");
throw new Throwable("test error.");
}
case4:测试Exeption异常。原来的注解都加上
public ModelAndView mtsave(HttpServletRequest req
,HttpServletResponse res
,ModelMap model) throws Exception {
System.out.println("start testError.");
throw new Exception("test error.");
}
case5:测试RuntimeException异常。原来的注解都加上
public ModelAndView mtsave(HttpServletRequest req
,HttpServletResponse res
,ModelMap model){
System.out.println("start testError.");
throw new RuntimeException("test error.");
}
请问是这样写嘛,没写过
建议您直接加一个aop 异常捕获,从您的反馈来看,一部分代码可以执行另外一部分代码没有执行这种异常代码内必然可以捕获的。
在aop层直接加一个 catch Throwable,并且log.error(e)把所有的日志都记录下来另外便于调试,建议您把weblogic的运行日志也打开到debug级别,在weblogic运行日志中,dispatcher的信息都是有的
请问是这样写嘛,没写过
建议您直接加一个aop 异常捕获,从您的反馈来看,一部分代码可以执行另外一部分代码没有执行这种异常代码内必然可以捕获的。
在aop层直接加一个 catch Throwable,并且log.error(e)把所有的日志都记录下来另外便于调试,建议您把weblogic的运行日志也打开到debug级别,在weblogic运行日志中,dispatcher的信息都是有的谢谢1、先把weblogic的debug开起来吧2、今天中午重新发布应用后,没有出错,继续看明天的情况。
mtsave f...er
mtsave f...th
今天上面这些信息有没有输出?