2009-10-22 68 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

相關問題