代码之家  ›  专栏  ›  技术社区  ›  ant

在Java中执行另一个类的方法……

  •  0
  • ant  · 技术社区  · 15 年前

    我有一个方法,它返回一个名为findItemByIdendDate()的项列表,该列表在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){}
      }                                 
    }
    

    现在这个我有问题。这个类是基于时间约束(*in括号)从上面的类中调用的,它执行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工厂XML文件中创建一个bean,它实际实例这个调度器并调用这个方法,我尝试通过从cronscheldule.java调用cronjob.java来实现这一点,cronscheldule.java从另一个类调用方法,我创建了一个bean,这个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类中执行findintembypidendDate()方法,每分钟都要说一次。方法运行正常。我编写了一个测试,它通过了测试。那我现在该怎么办?谢谢你

    2 回复  |  直到 15 年前
        1
  •  0
  •   Nrj    15 年前

    只是一个指针,因为我不能通过堆栈跟踪做很多,但问题似乎出在 pers.findItemByPIdEndDate(); 因为当我用一个简单的Java类替换Hibernate的时候,代码工作得很好。

    我还提供了crontrigger模式作为 0/5 * * * * ? 所以每5秒运行一次。您当前的模式根本无法启动该作业。

    看看这是否有帮助。

        2
  •  0
  •   MarkoU    15 年前

    如果定期执行任务是这里的问题(我不太确定),我建议使用scheduleExecutorService,它是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);
    }
    }