1.正式环境更新后不就服务器cpu飙升,最终服务器卡死,重启tomcat后正常,不就后又再次卡死.
原因:更新时使用./shutdown.sh停止服务器,未能将quartz线程杀死,重新启动之后,原认定任务仍然在继续执行.
解决:kill 掉进程后重新启动正常. 在代码中增加服务器停止后,手动关闭quartz任务.
public class QuartzStop implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent servletContextEvent) { } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { try { Scheduler defaultScheduler = StdSchedulerFactory.getDefaultScheduler(); defaultScheduler.shutdown(true); } catch (Exception e) { e.printStackTrace(); } } }
2.hessian连接通道关闭,但接口地址能够正常访问
原因:设置的hessian连接超时关闭时间过短,在接口还没有返回或整准备返回执行结果时,发现通道已经被关闭.
解决:增长连接超时关闭时长,改进接口熔断机制.
HessianProxyFactory hessianProxyFactory = new HessianProxyFactory(); hessianProxyFactory.setConnectTimeout(10000); hessianProxyFactory.setReadTimeout(10000);
3.外网,内网能够正常访问页面,但是专网无法打开页面,但接口能够正常访问
原因:调试发现,页面需要的其中一个js文件返回 http 206 ,curl时也一样,在分段续传的过程中,防火墙将js其中一段截取了下来,导致续传永远无法完成,持续等待.
解决:开启服务器压缩,采用gzip方式传输
但是,某些浏览器不支持,会增加服务器以及客户端的cpu压力
compression="on"
compressionMinSize="2048"
noCompressionUserAgents="gozilla,traviata"
compressableMimeType="text/html,text/xml,text/javascript,application/x-javascript,application/javascript,text/css,text/plain"
4. 新建任务时,任务的创建时间突然变成了明天的时间,服务器date -R显示时间时区均正常
原因:通过hwclock --show 查看linux硬件时间时发现与系统时间相差8小时,而程序获取到的时间正好是这个时间,也就是说代码 System.currentTimeMillis()
获取到了硬件时间而不是系统时间,奇怪的是过段时间去查看系统硬件时间又变回正常,暂未找到解决办法.
5.mysql 行锁之后无法释放,出现死锁,整个业务卡死
原因:mysql 的select ..for update 与oracle存在差异,mysql 不支持nowait的方式,在等待的过程中,程序向下继续执行了长select操作,同时默认的等待超时时间过长(数据库设置两分钟),导致任务直接卡住两分钟,在此过程中,整个业务卡死,无法操作.
解决:取消了锁行后的长select操作,同时将行锁的释放提前,同时在分支处理方式中添加释放锁的操作.
6.ORA-01882: timezone region not found
JAVA_OPTS="-Duser.region=CN -Duser.timezone=GMT=GMT+8"
7.tomcat版本升级之后url访问失败
tomcat 新版本对于url链接中的特殊字符处理,旧版本中空格和中文不做处理可能可以识别,但在新版本中,某些浏览器下中文必须urlencode ,空格必须移除。原来处理图片缓存的url链接之后跟的new Date()需要替换成毫秒值。
8.elastic job 启动 Splitter 类中 splitToList 方法找不到。
更换guava 版本为18.0不再出现。