我想知道是否有人可以建议:我有一个场景,Quartz 运行的计划作业将每小时更新一个对象数组列表。
但是我需要这个对象数组列表对 Tomcat 创建的所有 session 都是可见的。所以我在想的是我每小时从运行的 Quartz 作业的某个地方写入这个对象,以便每个 session 都可以访问它。
谁能说出如何最好地做到这一点?我想知道从 Quartz 作业中写入 servlet 上下文的对象吗?另一种方法是让每个 session 从数据库表中填充对象的数组列表。
谢谢
摩根先生。
最佳答案
是的,我会将列表作为应用程序范围的属性存储在 ServletContext
中。相反,从数据库中提取数据可能效率较低,因为您只是每小时更新一次列表。为了给 Quartz 任务一个对 ServletContext
对象的引用,可能需要创建一个 ServletContextListener
。 ServletContext
只能从与 JavaEE 相关的类(如 Servlet 和 Listeners)中检索。
编辑: 在 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");
//...
}
}
关于java - 如何在 Java servlet 上下文中获取和设置全局对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3215988/