我想知道是否有人可以建议:我有一种情况,即Quartz运行的计划作业将每小时更新对象的数组列表。
但我需要此对象数组列表对Tomcat创建的所有 session 可见。所以我在想的是,我每小时都会在运行的Quartz作业中的某个位置写入该对象,以便每个 session 都可以访问它。
谁能说这可以最好地实现?我想知道从Quartz作业将对象写入servlet上下文吗?另一种选择是让每个 session 从数据库表中填充对象的数组列表。
谢谢
摩根先生。
最佳答案
是的,我会将列表存储在ServletContext
中作为应用程序范围的属性。相反,从数据库中提取数据的效率可能较低,因为您仅每小时更新一次列表。为了向Quartz任务提供对ServletContextListener
对象的引用,可能需要创建ServletContext
。只能从Servlet和Listeners等与JavaEE相关的类中检索ServletContext
。
编辑:
在ServletContextListener中,当您创建作业时,可以通过将列表添加到JobDataMap将其传递到作业中。
public class MyServletContextListener implements ServletContextListener{
public void contextInitialized(ServletContextEvent event){
ArrayList list = new ArrayList();
//add to ServletContext
event.getServletContext().setAttribute("list", list);
JobDataMap map = new JobDataMap();
map.put("list", list);
JobDetail job = new JobDetail(..., MyJob.class);
job.setJobDataMap(map);
//execute job
}
public void contextDestroyed(ServletContextEvent event){}
}
//Quartz job
public class MyJob implements Job{
public void execute(JobExecutionContext context){
ArrayList list = (ArrayList)context.getMergedJobDataMap().get("list");
//...
}
}