Как получить и установить глобальный объект в контексте сервлета Java

Интересно, может ли кто-нибудь посоветовать: у меня есть сценарий, когда запланированное задание, выполняемое Quartz, будет обновлять каждый день аррайалист объектов.

Но мне нужен этот arraylist объектов для видимости для всех сеансов, созданных Tomcat. Поэтому я думаю, что я пишу этот объект где-то каждый час из задания Quartz, которое выполняется, чтобы каждый сеанс мог получить к нему доступ.

Может ли кто-нибудь сказать, как это может быть достигнуто? Мне интересно, как объект записывается в контекст сервлета из задания Quartz? Альтернативой является то, что каждый сеанс заполняет аррайалист объектов из таблицы базы данных.

благодаря

Мистер Морган.

Да, я бы сохранил список в ServletContext как атрибут области приложения. Вытягивание данных из базы данных вместо этого, вероятно, менее эффективно, так как вы только обновляете список каждый час. Создание ServletContextListener может потребоваться, чтобы дать задаче Quartz ссылку на объект ServletContext . ServletContext может быть получен только из classов, связанных с JavaEE, таких как Servlets и Listeners.

EDIT: в 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"); //... } } 

Вы можете попробовать некоторое кэширование, например, EhCache, чтобы хранить ваши значения и обновлять их каждый час. Он будет обрабатывать проблемы параллелизма. Сам объект кеша может быть сохранен в ServletContext

Хорошим способом записи в ServletContext из задания Quartz является регистрация слушателей на вашем задании, которые получают уведомление об измененном значении. Так, например:

 public class JobListener { public void updateValue(Object newValue); } public class ServletContextCacheJobListener implements JobListener { private ServletContext ctx; public ServletContextJobListener(ServletContext ctx) { this.ctx = ctx; } public void updateValue(Object newValue) { Cache cache = (Cache) ctx.getAttribute("cache"); cache.update("yourKey", newValue); } } 

В вашем List будет List и когда вы планируете задание, вы создаете экземпляр конкретного слушателя и добавляете его в задание.

Ну, если вы используете статические поля, они будут видны всем classам, загруженным одним и тем же загрузчиком classов. Я думаю, что по крайней мере servlets одного приложения должны заканчиваться квалификацией. Однако это, по общему признанию, грязно.

Объектом, который определен и гарантирован (глобальнее), является ServletContext . Это разделяется между всеми сервлетами, входящими в одно приложение, т.е. загружаемыми из одного и того же web.xml . Есть вызов и вызов для ServletContext, которые позволяют рассматривать его по существу как карту.

Кроме того, вам нужно будет найти classы, общие для всех веб-приложений внутри одного сервера Tomcat. Tomcat делает много работы с загрузчиками, и я думаю, что у разных веб-приложений будут разные погрузчики. Вы можете обойти это, написав свой собственный class и разместив этот class в common или shared каталогах Tomcat. Если я правильно понимаю это описание , эти classы будут доступны, ТОЛЬКО, ко всем веб-приложениям.

Наконец, за пределами одного сервера Tomcat вам понадобится механизм TCP / IP для обмена данными между JVM. Но поскольку я понял ваш вопрос, это не обязательно.

  • Разница между getAttribute () и getParameter ()
  • Как загрузить файлы на сервер с помощью JSP / Servlet и Ajax?
  • Как передавать аудио / видео файлы, такие как MP3, MP4, AVI и т. Д. С помощью сервлета
  • Браузер не может получать / находить относительные ресурсы, такие как CSS, изображения и ссылки при вызове сервлета, который пересылает JSP
  • Где находится каталог развертывания в Eclipse?
  • Получить управляемый bean-элемент JSF по имени в любом classе, связанном с Servlet
  • Почему Spring MVC отвечает 404 и сообщает «Нет сопоставления для HTTP-запроса с URI в DispatcherServlet»?
  • Загрузить плагин не вызывает Java Servlet
  • Как получить доступ к атрибуту запроса, установленному сервлетом в JSP?
  • Внедрение простого сервлета загрузки файлов
  • Управление данными сеанса Webapp / streamом controllerа для нескольких вкладок
  • Interesting Posts

    Как проверить состояние внешнего USB-накопителя?

    Использовать jQuery для обнаружения переполнения контейнера?

    Окончательный способ запуска событий нажатия клавиш с помощью jQuery

    Как скомпилировать Qt 5 под Windows или Linux, 32 или 64 бит, статические или динамические на VS2010, VS2012, VS2013 или VS2015 Express или g ++

    Как установить блок для Paint.setTextSize ()

    Неверная длительность звука с помощью ffmpeg

    Тайм-аут аутентификации форм против сеанса

    Как получить PID процесса, который я только начал в java-программе?

    Рекомендации по использованию интерфейса Java. Неужели получатели и сеттеры в интерфейсе плохо?

    Постоянно выделять все вхождения текста в Notepad ++?

    Связывание данных с SelectedItem в WPF Treeview

    Как найти качество JPG?

    emberjs – как пометить активный элемент меню с помощью инфраструктуры маршрутизатора

    В чем разница между Bitmap и Drawable в Android?

    Является ли «структурное взлома» технически неопределенным поведением?

    Давайте будем гением компьютера.