Java の別のクラスからメソッドを実行する…など
-
05-07-2019 - |
質問
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 を作成しました。
<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() メソッドを毎分実行したいのです。メソッドは適切に機能しています テストを作成し、パスしました。それで、私は今何をすればいいでしょうか?ありがとう
解決
スタックトレースではあまり確認できなかったので単なるポインタですが、問題は次のとおりです。 pers.findItemByPIdEndDate();
Hibernate のものをプレーンな Java クラスに置き換えると、コードは正常に動作するためです。
また、CronTrigger パターンを次のように指定しました。 0/5 * * * * ?
したがって、5秒ごとに実行します。現在のパターンではジョブがまったく起動されません。
これが役立つかどうかを確認してください。
他のヒント
ここでタスクを定期的に実行することが問題である場合 (よくわかりませんが)、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);
}
}