我有一个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>
答案 0 :(得分:0)
是的,它已作为ServletContext
中的属性存储。像任何其他属性一样获取它:
YourApplicationScopedBean bean = servletContext.getAttribute("yourApplicationScopedBeanName");
//use it...
如果bean
为null
,那么当石英作业开始时,您的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中初始化此资源,并通过另一个组件提供对此资源的访问。