通过ServletContext访问ApplicationScoped bean

时间:2015-01-26 16:42:16

标签: jsf quartz-scheduler

我有一个ApplicationScoped bean,我想在石英作业实现中访问它。 该bean通过运行时保存了一个hashmap,我想在作业运行时填充hashmap。 但是,FacesContext在作业中脱离了上下文。 我可以访问ServletContext。是否可以通过ServletContext访问我的bean?

我访问Servlet上下文的代码:

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

    SchedulerContext schedulerContext=null;
    try {
        schedulerContext=context.getScheduler().getContext();
    }
    catch (SchedulerException e) {
        e.printStackTrace();
    }

    ServletContext servletContext=(ServletContext)schedulerContext.get("QuartzServletContext");
    BOCacheM bOCacheM = (BOCacheM) servletContext.getAttribute("bOCacheM");
}

我的QuartzServletContext在web.xml中定义为:

<context-param>
    <param-name>quartz:scheduler-context-servlet-context-key</param-name>
    <param-value>QuartzServletContext</param-value>
</context-param>

<listener>
    <listener-class>
        org.quartz.ee.servlet.QuartzInitializerListener
    </listener-class>
</listener>

1 个答案:

答案 0 :(得分:0)

是的,它已作为ServletContext中的属性存储。像任何其他属性一样获取它:

YourApplicationScopedBean bean = servletContext.getAttribute("yourApplicationScopedBeanName");
//use it...

如果beannull,那么当石英作业开始时,您的bean就不会被创建了。确保通过在其定义中添加eager=true来创建bean:

@ManagedBean(eager=true)
@ApplicationScoped
public class YourApplicationScopedBean {
    //...

    @PostConstruct
    public void init() {
        //initialize your shared resources here...
    }
}

请注意eager=true仅适用于@ApplicationScoped bean。

如果这仍然不起作用,那么即使在创建bean并将其存储在应用程序上下文中之前,您的石英作业似乎也被触发了。最好在ServletContextListener而不是@ApplicationScoped bean中初始化此资源,并通过另一个组件提供对此资源的访问。