2009-10-22 92 views
0

我有一个方法返回名为findItemByPIdEndDate()的项目列表,并在MngtImpl.java类中找到它。现在,我想在每隔一段时间执行这种方法,每小时可以这么说这里是我做过什么至今:在Java中执行另一个类的方法...以及更多

这是CronSchedule.java

import org.quartz.CronTrigger; 
import org.quartz.Scheduler; 
import org.quartz.SchedulerFactory; 
import org.quartz.impl.StdSchedulerFactory; 
import org.quartz.JobDetail; 

public class CronSchedule { 
    public CronSchedule()throws Exception { 
    SchedulerFactory sf=new StdSchedulerFactory(); 
    Scheduler sched=sf.getScheduler(); 
    JobDetail jd=new JobDetail("job1","group1",CronJob.class); 
    CronTrigger ct=new CronTrigger("cronTrigger","group2","0 * * * * ?"); 
    sched.scheduleJob(jd,ct); 
    sched.start(); 
    } 
    public static void main(String args[]){ 
    try{  
     new CronSchedule();   //Class where cron is created 
    }catch(Exception e){} 
    }         
} 

现在有了这个我有问题。这个类是基于时间约束(*在括号中)从上面的类中调用的,它执行MngtImpl类的方法。

import org.quartz.Job; 
import org.quartz.JobExecutionContext; 
import org.quartz.JobExecutionException; 

import com.rosa.MngtImpl; 

public class CronJob implements Job { 
    public void execute(JobExecutionContext arg0) throws JobExecutionException { 
      try { 
        MngtImpl pers = new MngtImpl(); 
        pers.findItemByPIdEndDate(); 
     } catch (Exception e) { 

       e.printStackTrace(); 
     } 
    } 
} 

这里是我尝试从上面的类中调用的方法。这种方法是在名为MngtImpl.java的类中找到的

public List<Long> findItemByPIdEndDate() throws Exception { 

       List<Long> list = null; 

       try{ 
         Session session = sessionFactory.getCurrentSession(); 
         Query query = session.getNamedQuery("endDateChecker"); 
         list = query.list(); 

       }catch (HibernateException e){ 
         throw new DataAccessException(e.getMessage()); 
       } 

       return list; 
     } 

现在,我要做的是。我需要根据一段时间(我可以随时指定)运行这个上面的方法。我需要在bean factory xml文件中创建一个实际调用此调度器的bean,并调用此方法,并且我通过从CronScheldule.java调用CronJob.java来调用此方法,该方法调用另一个类的方法,并创建了一个可能工作或不工作的bean

<bean id="cronSchedule" class="com.mypackage.CronSchedule"> 
     </bean> 

但它不是工作,我期待和它相当复杂,我可能会得到一些帮助的代码吗?谢谢

我会遇到以下异常:

java.lang.NullPointerException 11:10:46,410 ERROR [STDERR] 
    at com.packftc.RulesManager.exception(RulesManager.java:25) 11:10:46,410 ERROR [STDERR] 
    at org.drools.agent.RuleAgent$2.run(RuleAgent.java:442) 11:10:46,410 ERROR [STDERR] 
    at java.util.TimerThread.mainLoop(Unknown Source) 11:10:46,410 ERROR [STDERR] 
    at java.util.TimerThread.run(Unknown Source) 

这显然是这样做的错误的方式我已经试过像zilion事情至今:这里是我想简单的话做,我想从MngtImpl类执行findItemByPIdEndDate()方法每一分钟。方法正常运行我写了一个测试,并通过它。那么我现在该做什么?谢谢

+0

你的问题的措辞有点复杂难以理解:-(你似乎有一个基本的想法,我建议你问一个更精确的问题,究竟什么是不工作的 – KLE 2009-10-22 08:33:35

+1

'但它不工作, 对不起,但这没有帮助,它在干什么? 另外如果你使用的是Spring - 我认为它有一些很好的Quartz包装,你试过吗? – 2009-10-22 08:38:47

+0

我认为它有一些很好的Quartz包装,你试过他们?哪些,我不知道..“但它不工作,因为我预期”我应该得到一个清单..但相反,我得到一个例外,空指针 – ant 2009-10-22 08:45:44

回答

0

只是一个指针,因为我可以没有太多的堆栈跟踪,但它看起来问题在pers.findItemByPIdEndDate();,因为代码工作正常,当我用普通的java类替换Hibernate的东西。

此外,我提供的CronTrigger模式为0/5 * * * * ?,以便每5秒运行一次。你目前的模式根本不会解雇工作。

看看这是否有帮助。

0

如果执行定期任务是这里的问题(我不是很确定),我建议使用ScheduledExecutorService的,这是JDK 1.5的一部分,后来:

import java.util.concurrent.Executors; 
import java.util.concurrent.ScheduledExecutorService; 
import java.util.concurrent.TimeUnit; 

public class SchedulerExample { 

private ScheduledExecutorService scheduler = 
     Executors.newScheduledThreadPool(1); 

public void activateHourlyDataRetrieval() { 

     Runnable dataRetriever = new Runnable() { 

      MngtImpl pers = new MngtImpl(); 

      public void run() { 

       pers.findItemByPIdEndDate(); 

      } 
     }; 

     scheduler.scheduleAtFixedRate(dataRetriever, 0, 1, TimeUnit.HOURS); 
} 
} 
+0

我得到一个编译错误“TimeUnit.HOURS无法解析”我需要在appcontext中创建任何bean吗? – ant 2009-10-22 08:56:03

+0

您记得导入java.util.concurrent.TimeUnit吗?你在使用JDK 1.5或更高版本吗? – MarkoU 2009-10-22 09:04:49

+0

我改变了秒数..仍然没有 – ant 2009-10-22 09:05:14

相关问题