当前位置: 首页 > 面试题库 >

如何在Java Servlet上下文中获取和设置全局对象

沈长恨
2023-03-14
问题内容

我想知道是否有人可以建议:我有一种情况,即Quartz运行的计划作业将每小时更新对象的数组列表。

但是我需要此对象数组列表对Tomcat创建的所有会话可见。所以我在想,我每小时都会在运行的Quartz作业中的某个地方编写该对象,以便每个会话都可以访问它。

谁能说这可以最好地实现?我想知道从Quartz作业将对象写入servlet上下文吗?另一种选择是让每个会话从数据库表中填充对象的数组列表。

谢谢

摩根先生。


问题答案:

是的,我会将列表存储ServletContext为应用程序范围的属性。相反,从数据库中提取数据的效率可能较低,因为您仅每小时更新一次列表。ServletContextListener为了使Quartz任务可以引用该ServletContext对象,可能必须创建一个。将ServletContext只能从JavaEE的相关类,如Servlet和侦听器检索。

编辑:在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");
    //...
  }
}


 类似资料:
  • 问题内容: 我想在脚本中签入某个其他模块是否已加载。 但是,如果不存在,那就是。 如果我知道那是什么,我可以使用它。 但是,因为我希望我的模块与浏览器和工作,等等,我不能假设。 据我了解,这在ES 5 with中不起作用; 这也会因抛出异常而失败 所以好像我已经离开了 这些情况都不会通过JSLint。 我有什么想念的吗? 问题答案: 好吧,您可以使用运算符,并且如果标识符在范围链的任何位置都不存在

  • 我试着用正常的方式做吐司。但我得到了错误,我尝试了很多倍数源,但失败了。

  • 问题内容: 我正在一个项目上,我想让我的索引在滚动时加载更多内容。我想设置一个全局变量来保存页面已加载多少次。我的项目结构如下: 首先,我在中声明全局变量: 皮查姆(Pycharm)警告 在: 还有 我也引用了global-variable-and-python-flask 但我没有main()函数。在Flask中设置全局变量的正确方法是什么? 问题答案: 你没有在定义,只是在声明,所以就好像在说

  • 问题内容: 我知道我可以每次设置超时: …但是我想设置一个全局超时来保持我的代码为DRY。 问题答案: UPDATED :$ http将不遵守默认设置,因为它在httpProvider中设置了超时(请参见注释)。可能的解决方法: https //gist.github.com/adnan-i/5014277 原始答案:

  • 我必须在tomcat 7中部署我的app.war文件。的。war文件名后面是它的版本号。这里我需要设置一个上下文路径,这样实际的url将只包含应用程序名(没有版本号)。 我的要求是,服务器中不应该有编辑.xml。 这是我的背景。xml如下所示。 context.xml放在war at /META-INF文件夹中。谁能告诉我我错在哪里?

  • 在VBA中,我希望从响应中截取字符串,并在随后的请求中设置它。 (如果Excel崩溃,这个cookie似乎丢失了,用户必须再次进行身份验证。我希望为用户设置最后存储的会话ID,这样如果会话在服务器上仍然有效,他们就不必在Excel客户机中重新进行身份验证。) 我看到了一些在线资源,根据这些资源,下面将拉出JSESSIONID cookie,但最后一行总是打印为空: 当我打印时,我看不到任何包含JS