从Java中的另一个类执行一个方法…和更多
-
05-07-2019 - |
题
我有一个方法,它返回一个名为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工厂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()方法。方法运行正常我写了一个测试并通过它。那我现在该怎么办?谢谢
解决方案
只是一个指针,因为我无法通过堆栈跟踪获得太多,但似乎问题出在 pers.findItemByPIdEndDate();
,因为当我用一个Hibernate替换Hibernate时,代码工作正常普通的java类。
我还提供了CronTrigger模式为 0/5 * * * *?
,以便每5秒运行一次。你当前的模式根本不会解雇工作。
看看这是否有任何帮助。
其他提示
如果定期执行任务是问题(我不太确定),我建议使用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);
}
}