0

findItemByPIdEndDate() と呼ばれるアイテムのリストを返すメソッドがあり、MngtImpl.java クラス内で見つかりました。今、私は時々このメソッドを実行したいと思います.1時間ごとに言ってみましょう.

これは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 ファクトリ xml ファイル内に Bean を作成する必要があります。別のクラスからメソッドを呼び出す CronScheldule.java から CronJob.java を呼び出して、これを試してみました。

<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() メソッドを毎分実行したいということです。メソッドは正常に機能しています。テストを書き、合格しました。それで、私は今何をしますか?ありがとうございました

4

2 に答える 2

0

スタック トレースでは多くのことができなかったので単なるポインタですがpers.findItemByPIdEndDate();、Hibernate のものをプレーンな Java クラスに置き換えるとコードが正常に動作するため、問題があるようです。

0/5 * * * * ?また、 5 秒ごとに実行するようにCronTrigger パターンを指定しました。現在のパターンは、ジョブをまったく起動しません。

これが役立つかどうかを確認してください。

于 2009-10-23T03:57:52.880 に答える
0

ここでタスクを定期的に実行することが問題である場合 (よくわかりません)、JDK 1.5 以降の一部である ScheduledExecutorService を使用することをお勧めします。

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 に答える