2016-04-02 42 views
1

kuvars işinden uygulama kapsamlı fasulye bir yöntemi çağırma Ve bir kuvars-işBen bir uygulama fasulye</p> <pre><code>@ManagedBean(name = "myController") @ApplicationScoped public class MyController implements Serializable{ ... public void allOn(){...} </code></pre> <p>kapsamlı olması

import org.quartz.Job; 
public class CronJobAllOn implements Job{ 
    @Override 
    public void execute(..){ 
      //call allOn();} 
} 

ben den Allón() yöntemini çağırmak istiyorum JobDataMap

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

ile iş-Class FacesContext geçmeye çalışan Ama sadece bir IllegalStateException ağırlık atar Tavuk i

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

Nasıl bir kuvars-işten MyController içinde Allón() yöntemini çağırabilirsiniz CronJobAllOn Sınıfında diyoruz deneyin?

+0

ISE burada açıklanmaktadır: http://stackoverflow.com/q/4605118 Somut gereksinime göre, gerçek J'yi çalıştırır mısınız? ava EE sunucusu veya barebone servletcontainer? CDI var mı? ([Java-ee] etiketli olduğunu biliyorum, ancak standart EJB API yerine Quartz kullanmak, gerçek bir Java EE sunucusu yerine Tomcat gibi bir servletcontainer kullandığınızı gösterir). – BalusC

+0

Cevabınız için teşekkürler, ISE ile ne demek istediğini bilmiyorum. Bir Java EE sunucusu çalıştırmıyorum, bu yüzden bahsettiğiniz etiketi değiştirdim. Java-EE Sunucusuna geçtiğimde daha fazla seçeneğim var mı? Aklıma gelen benim sorunumun tek çözümü, kuvars işinden bir veri tabanına veri yazmak ve uygulama kapsamındaki fasulye içinde okumaktır. –

+0

Şimdi İMKB'nin anlamını aldım. ISE, IllegalStateException anlamına gelir. Benim için öğrenecek çok şey var. Bağlantıdan sonra yardımcı iletinizi okudum, hiçbir zaman bir görünüm/oturum/uygulama kapsamı yönetilen fasulye örneğinin alt öğesi olarak FacesContext'i atamam ve farklı isteklerde yeniden kullanmam. –

cevap

1

Sorunumun çözümünü aldım, BalusC'un kısa yorumu beni doğru yola koydu. CDI almak için TomEE'a geçtim.

ben kendi JobFactory Class oluşturmak zorunda kaldı benim işlerde CDI-Bean enjeksiyonu kullanmak için:

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

i myController enjekte başardı bundan sonra Fabrikası

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

oluşturun: