2016-04-02 4 views
1

Ich habe eine Anwendung Bohne scopedAufruf einer Methode in Anwendung-scoped Bohne aus Quarz Job

@ManagedBean(name = "myController") 
@ApplicationScoped 
public class MyController implements Serializable{ 
... 
public void allOn(){...} 

Und ich will

die Allon() -Methode aus einem Quarz-Job nennen
import org.quartz.Job; 
public class CronJobAllOn implements Job{ 
    @Override 
    public void execute(..){ 
      //call allOn();} 
} 

I versucht, die Faces auf die Job-Klasse über die JobDataMap

JobDataMap jobDataMap = new JobDataMap(); 
jobDataMap.put("facesContext", FacesContext.getCurrentInstance()); 
JobDetail job = newJob(CronJobAllOn.class) 
     .usingJobData(jobDataMap) 
     .withIdentity("job1", "group1") 
     .build(); 

Aber es wirft nur eine Illegal passieren w enn ich versuche, es in der CronJobAllOn Klasse

public void execute(JobExecutionContext context) throws JobExecutionException { 
    FacesContext fc= (FacesContext) context.getMergedJobDataMap().get("facesContext"); 
    MyController test = (MyController)fc.getExternalContext().getApplicationMap().get("MyController"); 
    test.allOn();} 

Wie kann ich aus einem Quarz-Job die Allon() -Methode in MyController rufen zu nennen?

+0

Die ISE wird hier erklärt: http://stackoverflow.com/q/4605118 Was die konkrete Anforderung betrifft, führen Sie eine echte J ein EE-Server oder ein Barebones-Servletcontainer? Haben Sie CDI verfügbar? (Ich weiß, dass Sie [java-ee] getaggt haben, aber die Verwendung von Quartz anstelle der standardmäßigen EJB-API legt nahe, dass Sie tatsächlich einen Servletcontainer wie Tomcat anstelle eines echten Java EE-Servers verwenden). – BalusC

+0

Danke für Ihre Antwort, Ich weiß nicht, was Sie mit ISE meinen. Ich verwende keinen Java EE-Server, daher habe ich das von Ihnen erwähnte Tag geändert. Habe ich mehr Optionen, wenn ich zum Java-EE Server wechsel? Die einzige Lösung für mein Problem, die mir in den Sinn kommt, besteht darin, Daten aus dem Quarz-Job in eine Datenbank zu schreiben und sie in der Anwendungs-Bean zu lesen. –

+0

Ich habe jetzt die Bedeutung von ISE. ISE steht für IllegalStateException. Viel zu lernen für mich. Und ich habe Ihre hilfreiche Nachricht nach dem Link gelesen, dass ich FacesContext niemals als Instanzvariable einer View/Session/Application Scoped Managed Bean zuweisen und in verschiedenen Requests wiederverwenden sollte. –

Antwort

1

Ich habe die Lösung für mein Problem, der kurze Kommentar von BalusC hat mich auf den richtigen Weg gebracht. Ich wechselte zu TomEE, um CDI zu bekommen.

Um die CDI-Bean Injektion in meinen Jobs zu verwenden, ich hatte meine eigene JobFactory Klasse zu erstellen:

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); 
} 

schafft die Fabrik

Scheduler scheduler = new StdSchedulerFactory().getScheduler(); 
scheduler.setJobFactory(cdiJobFactory); 

danach ich in der Lage war MyController zu injizieren: