Jsf 从quartz作业调用应用程序范围bean中的方法

Jsf 从quartz作业调用应用程序范围bean中的方法,jsf,tomcat,callback,quartz-scheduler,Jsf,Tomcat,Callback,Quartz Scheduler,我有一个应用程序范围的bean @ManagedBean(name = "myController") @ApplicationScoped public class MyController implements Serializable{ ... public void allOn(){...} 我想从quartz作业中调用allOn()方法 import org.quartz.Job; public class CronJobAllOn implements Job{ @Ove

我有一个应用程序范围的bean

@ManagedBean(name = "myController")
@ApplicationScoped
public class MyController implements Serializable{
...
public void allOn(){...}
我想从quartz作业中调用allOn()方法

import org.quartz.Job;
public class CronJobAllOn implements Job{
     @Override
     public void execute(..){
          //call allOn();}
}
我试图通过JobDataMap将FacesContext传递给Job类

JobDataMap jobDataMap = new JobDataMap();
jobDataMap.put("facesContext", FacesContext.getCurrentInstance());
JobDetail job = newJob(CronJobAllOn.class)
        .usingJobData(jobDataMap)
        .withIdentity("job1", "group1") 
        .build();
但当我试图在CronJobAllOn类中调用它时,它只抛出一个IllegalStateException

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作业调用MyController中的allOn()方法?

我找到了问题的解决方案,BalusC的简短评论让我走上了正确的道路。 我换了,换了CDI

为了在我的工作中使用CDIBean注入,我必须创建自己的JobFactory类:

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);
}
之后,我可以注射myController:

public class CronJobAllOn implements Job{

@Inject
private MyController mc;

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {

    mc.allOn();

}

ISE在这里解释:至于具体需求,您运行的是真正的JavaEE服务器还是基本的servletcontainer?你们有CDI吗?(我知道您标记了[JavaEE],但是使用Quartz而不是标准EJBAPI表明您实际上使用了像Tomcat这样的servletcontainer而不是真正的JavaEE服务器)。谢谢您的回答,我不知道您对ISE的意思。我没有运行JavaEE服务器,所以我更改了您提到的标记。当我切换到JavaEE服务器时,是否有更多选项?我想到的解决我的问题的唯一方法是从quartz作业将数据写入数据库,然后在应用程序范围的bean中读取数据。ISE代表非法国家例外。我有很多东西要学。在链接之后,我阅读了您的有用消息,即我永远不应该将FacesContext指定为视图/会话/应用程序范围的托管bean的实例变量,并在不同的请求中重用它。
public class CronJobAllOn implements Job{

@Inject
private MyController mc;

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {

    mc.allOn();

}