UDL(United Data Load)是公司开发用于通用数据加载工具,支持抽取设置、作业定义并提供页面监控等功能,在某一项目中中多次出现了UDL作业调度出现问题,由于该问题隐藏得较深,分析解决花了较多的精力,现把经验总结共享给大家。 1. 问题现象问题一般是UDL运行3-5天才出现,出现错误现象是固定的,后台抛出如下异常(红色部分是下面分析的切入点):
1 2011-10-08 01:05:00,078 [] ERROR - 作业:DELETE_F_TABLE_ALL_WORKID运行过程中发生不可预知的错误,当前作业在本次调度中终止运行,发生不可预知的错误,这通常是基础信息配置有误,或运行环境异常导致,等原因,请根据错误提示信息,检查错误原因 [URuntimeJob:runJob]
2 java.lang.IllegalStateException: Entry.next=null, data[removeIndex]=resoft.udl.schedule.JobKey@600a5e7d=false previous=resoft.udl.schedule.JobKey@74a3b4ef=false key=resoft.udl.schedule.JobKey@fb09e543 value=true size=150 maxSize=150 Please check that your keys are immutable, and that you have used synchronization properly. If so, then please report this to commons-dev@jakarta.apache.org as a bug.
3 at org.apache.commons.collections.map.LRUMap.reuseMapping(LRUMap.java:300)
4 at org.apache.commons.collections.map.LRUMap.addMapping(LRUMap.java:266)
5 at org.apache.commons.collections.map.AbstractHashedMap.put(AbstractHashedMap.java:283)
6 at resoft.udl.jetlValidate.logicValidate.validator.ValidatorFactory.setJobOver(ValidatorFactory.java:57)
7 at resoft.udl.job.URuntimeJob.runJob(URuntimeJob.java:389)
8 at resoft.udl.job.URuntimeJob.execute(URuntimeJob.java:132)
9 at org.quartz.core.JobRunShell.run(JobRunShell.java:202)
10 at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:987)
11 at edu.emory.mathcs.backport.java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:528)
12 at java.lang.Thread.run(Thread.java:595) 2. 问题分析
跟踪了UDL代码 ValidatorFactory.java中setJobOver方法