0

我有一个方法,它返回一个名为 findItemByPIdEndDate() 的项目列表,它在 MngtImpl.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)

这显然是错误的做法,到目前为止我已经尝试过类似的事情:这是我试图用简单的话做的事情,我想每隔一分钟执行一次来自 MngtImpl 类的 findItemByPIdEndDate() 方法。方法运行正常 我写了一个测试,它通过了。那我现在该怎么办?谢谢

4

2 回答 2

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);
}
}
于 2009-10-22T08:47:09.427 回答
0

只是一个指针,因为我无法通过堆栈跟踪获得太多收益,但似乎问题出在,pers.findItemByPIdEndDate();因为当我用普通的 java 类替换 Hibernate 的东西时代码工作正常。

我还提供了 CronTrigger 模式,0/5 * * * * ?以便每 5 秒运行一次。您当前的模式根本不会解雇这项工作。

看看这是否有帮助。

于 2009-10-23T03:57:52.880 回答