日期:2014-05-19  浏览次数:20796 次

spring定时器问题
使用Spring自带的quartz定时器,配置如下:
XML code

<bean name="hotelLabelList" class="cn.o.hotel.task.HotelLabelTask" />

<bean id="imageListJob"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
  <property name="targetObject" ref="imageList" />
  <property name="targetMethod" value="getHotelImageList" />
  <property name="concurrent" value="true" />
</bean>

<bean id="imageListsTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
  <property name="jobDetail" ref="imageListJob" />
  <property name="cronExpression" value="0 0/2 * * * ? " />
</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <property name="triggers">
    <list>
      <ref bean="imageListsTrigger"/>                
    </list>
   </property>
</bean>



java代码:
Java code

         @Resource(name="hotelService")
    private HotelService hotelService;
    
    public void getHotelImageList() throws Exception {
        System.out.println("start imageList");

                  //查询酒店,返回指定条数的酒店List
        List<HotelInfo> list = hotelService.listHotelInfosBysize(50);
        
        System.out.println("==============start==================");
        if(null != list){
            for(HotelInfo info : list){
                if(!info.isGrapImage()){
                    hotelImageList(info, 1);
                }
            }
        }
        System.out.println("================end===========");
    }


查询酒店信息表,这个表中的数据大概有2W多条,使用的是mysql数据库,现在的问题是:当酒店查询size过大,list不返回,下面的代码也不执行;size设置比较小,进入该方法时,能够执行list查询以下的代码,第二次进入方法,则出现前面的现象。现在我不知道是list不能存储大数据还是定时器的问题,请大侠指教。。(注意下面方法的注释1)
查询方法:
Java code

         @Override
    @Transactional(propagation = Propagation.NOT_SUPPORTED, readOnly = true)
    public List<HotelInfo> listHotelInfosBysize(int size) {
        Criteria crta = this.hotelInfoDao.createCriteria();
        crta.add(Restrictions.eq("grapImage", false));
        if(size>0){
            crta.setMaxResults(size);
        }
        List<HotelInfo> list = crta.list();//注释1、这里没有返回值,好像卡死在这里。。
        return list;
    }



------解决方案--------------------
int size 值是不是太大了。给小点试试
既然分页了,干嘛一次取那么多数据。
------解决方案--------------------
才两万条数据、在说了、你也只是查询50条而已、就算在慢也应该没有多大问题!
 可以考虑下、在sql方面做优化、用原生态sql!
也可以把定时的频率调低一点、两分钟一次、有点频繁了呢!
------解决方案--------------------
你打个短点逐步跟踪一下、看看第2次、运行过程!