我想知道是否有人可以建议:我有一种情况,即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");
    //...
  }
}

09-30 14:44
查看更多