描述:定时(买小时或每几小时,或每几天)将sqlserver2005的某些表导入到oracle对应的表格,并且可以通过画面能够设定导入的时间并纪录导入信息的相关纪录,所以我对这个要求现在已经做了一些处理,完成的部分
1.xml文件 ,用于配置需要导入的表格
2.reader工厂以及实现类(有多少个表格就有多少个实现类),这些类是读取sqlserver的数据的
3.writer工厂以及实现类(对应将sqlserver导入到oracle中)
只要配置好xml后就可以将xml中配置所有的表格全部导入到oracle中。
目前上面已经全部完成,剩下的就是定期执行了,现在我不知道有什么好的方法能够通过web程式来设定任务的开始时间
已经跟踪相关传入的状态,所以请大家来看看有什么好的方法。如果用线程该如何控制,还有其他好的方法?想法:
1.提供一个jsp画面用于控制任务处理程式开始时间,设定完成后写入一个配置档,下次任务开始重新读取配置档依据新的时间点执行 
2.提供一个jsp画面用于显示目前处理了多少任务和当前任务状态,任务执行信息可以保存到ORACLE中以便该画面读取。
我现在是这么想,就是不知道该如何去实现它,用线程还是用其他的方法,线程可以保存在session中吗?头晕了,还请各位有什么好的方法或实现指点一二。

解决方案 »

  1.   

    今天周六没有人上csdn吗?55
      

  2.   


    import java.util.Timer; import javax.servlet.ServletContextEvent; 
    import javax.servlet.ServletContextListener; public class TestListener implements ServletContextListener { 
      private Timer timer = null;   public void contextInitialized(ServletContextEvent event) { 
        timer = new Timer(true); 
        //加载任务、设置启动时间和任务间隔时间
        timer.schedule(new TestTask(), 0, 86400000);//milliseconds 
      }   public void contextDestroyed(ServletContextEvent event) { 
        timer.cancel(); 
      } 
    } import java.util.TimerTask; public class TestTask extends TimerTask { 
      public void run() { 
        // do something ... 
      } 
    }
    web.xml:<listener> 
    <listener-class>test.TestListener</listener-class> 
    </listener> 
      

  3.   

    比较简单的折中办法:
    把你的资料交换模块独立出来,做一个JAR
    然后如果是linux用crontab加入到系统的定时任务里
    如果是windows,查一下api吧,加win的任务里去
      

  4.   

    不太明白,如果是放到web页面上触发定时执行的话,你是要一直开着这个页面吗?
    如果是这样,你可以设定页面定时自动刷新,这样就可以定时出发你后台的动作了。如果不一定非要在web上触发,楼上的建议可以,如果想灵活,也可以采用一些开源的调度引擎,比如最有名的:quartz,
    http://www.opensymphony.com/quartz/
      

  5.   

    java.util.Timer/TimerTask 注意这2个是基于任务计划的没错,但是他们只能针对周期!
    就是设置任务的周期执行,而不能去定时!
    quartz 就可以完成定时。http://www.opensymphony.com/quartz/ 
    我最近研究spring 呵呵 spring对这个库做了几乎接近完美的封装 先赞一下~
    建议参考如下类的api
    org.springframework.scheduling.timer.ScheduledTimerTask
    org.springframework.scheduling.quartz.CronTriggerBean
    时间元素很丰富了 包括: 秒 ,分 ,小时, 每月第几天, 月 ,每周第几天 ,年 ,
    甚至可直接指定目标对象的指定方法!
      

  6.   

    楼主所遇到的(TimerTask)是java的几大主题api封装问题之一:
    可能报表(jasperReport,crystalReport...)这样的主题,关注的多些。
    但是TimerTask仍旧是关注多的主题之一!成熟方案很多了,现在。
    同等的主题还有mail。都是项目中常见的问题。
      

  7.   

    quartz 在监听中起动,在servlet可以获取引用吗?因为在jsp调用servlet时候要对之前的任务时间进行修改
      

  8.   

    用quartz就不用jsp了,都是在后台,自动的。
      

  9.   

    还是建议你 在web.xml文件里,引个spring包吧(作为一个listener),小用spring试试它对 quartz的封装。
    纯 quartz我也没用过
      

  10.   

    用quartz
    servlet:
    public void init(ServletConfig cfg) throws ServletException {
    logger.info("servlet init is running");
    try {

    Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

    cfg.getServletContext().setAttribute(Constants.TTYPE_SIMPLE,scheduler);

    if (!scheduler.isShutdown()) {
    logger.info("servlet init scheduler is exists ");
    scheduler.deleteJob("ReceiveOnTimed", Scheduler.DEFAULT_GROUP);
    }


    long ctime = System.currentTimeMillis(); 
     JobDetail jobDetail = new JobDetail("ReceiveOnTimed", "jobDetailGroup-s2", SchedulerJobTest.class);
     SimpleTrigger simpleTrigger = new SimpleTrigger("simpleTrigger2", "triggerGroup-s2");
     
     simpleTrigger.setStartTime(new Date(ctime));
     
     simpleTrigger.setRepeatInterval(2*1000);
     
     simpleTrigger.setRepeatCount(10);
     
     scheduler.scheduleJob(jobDetail, simpleTrigger);
     
     scheduler.start();
     
     
    } catch (Exception e) {
    e.printStackTrace();
    } }如果要随服务启动则写在监听中