从石英作业调用应用程序范围的 bean 中的方法
Calling a method in application-scoped bean from quartz job
我有一个应用程序范围的 bean
@ManagedBean(name = "myController")
@ApplicationScoped
public class MyController implements Serializable{
...
public void allOn(){...}
我想从 quartz-job 调用 allOn() 方法
import org.quartz.Job;
public class CronJobAllOn implements Job{
@Override
public void execute(..){
//call allOn();}
}
我试图通过 JobDataMap
将 FacesContext 传递给 Job-Class
JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("facesContext", FacesContext.getCurrentInstance());
JobDetail job = newJob(CronJobAllOn.class)
.usingJobData(jobDataMap)
.withIdentity("job1", "group1")
.build();
但是当我尝试在 CronJobAllOn 中调用它时它只会抛出 IllegalStateException Class
public void execute(JobExecutionContext context) throws JobExecutionException {
FacesContext fc= (FacesContext) context.getMergedJobDataMap().get("facesContext");
MyController test = (MyController)fc.getExternalContext().getApplicationMap().get("MyController");
test.allOn();}
如何从 quartz-job 调用 MyController 中的 allOn() 方法?
我找到了问题的解决方案,BalusC 的简短评论让我走上了正确的道路。
我切换到 TomEE,以获得 CDI。
要在我的工作中使用 CDI-Bean 注入,我必须创建自己的 JobFactory Class:
public class CdiJobFactory implements JobFactory {
@Inject
@Any
private Instance<Job> jobs;
@Override
public Job newJob(TriggerFiredBundle triggerFiredBundle, Scheduler scheduler) throws SchedulerException {
final JobDetail jobDetail = triggerFiredBundle.getJobDetail();
final Class<? extends Job> jobClass = jobDetail.getJobClass();
for (Job job : jobs) {
if (job.getClass().isAssignableFrom(jobClass)) {
return job;
}
}
throw new RuntimeException("Cannot create a Job of type " + jobClass);
}
创建工厂
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.setJobFactory(cdiJobFactory);
之后我可以注入 myController:
public class CronJobAllOn implements Job{
@Inject
private MyController mc;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
mc.allOn();
}
我有一个应用程序范围的 bean
@ManagedBean(name = "myController")
@ApplicationScoped
public class MyController implements Serializable{
...
public void allOn(){...}
我想从 quartz-job 调用 allOn() 方法
import org.quartz.Job;
public class CronJobAllOn implements Job{
@Override
public void execute(..){
//call allOn();}
}
我试图通过 JobDataMap
将 FacesContext 传递给 Job-ClassJobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("facesContext", FacesContext.getCurrentInstance());
JobDetail job = newJob(CronJobAllOn.class)
.usingJobData(jobDataMap)
.withIdentity("job1", "group1")
.build();
但是当我尝试在 CronJobAllOn 中调用它时它只会抛出 IllegalStateException Class
public void execute(JobExecutionContext context) throws JobExecutionException {
FacesContext fc= (FacesContext) context.getMergedJobDataMap().get("facesContext");
MyController test = (MyController)fc.getExternalContext().getApplicationMap().get("MyController");
test.allOn();}
如何从 quartz-job 调用 MyController 中的 allOn() 方法?
我找到了问题的解决方案,BalusC 的简短评论让我走上了正确的道路。 我切换到 TomEE,以获得 CDI。
要在我的工作中使用 CDI-Bean 注入,我必须创建自己的 JobFactory Class:
public class CdiJobFactory implements JobFactory {
@Inject
@Any
private Instance<Job> jobs;
@Override
public Job newJob(TriggerFiredBundle triggerFiredBundle, Scheduler scheduler) throws SchedulerException {
final JobDetail jobDetail = triggerFiredBundle.getJobDetail();
final Class<? extends Job> jobClass = jobDetail.getJobClass();
for (Job job : jobs) {
if (job.getClass().isAssignableFrom(jobClass)) {
return job;
}
}
throw new RuntimeException("Cannot create a Job of type " + jobClass);
}
创建工厂
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
scheduler.setJobFactory(cdiJobFactory);
之后我可以注入 myController:
public class CronJobAllOn implements Job{
@Inject
private MyController mc;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
mc.allOn();
}