Запуск фоновых потоков при запуске GWT - PullRequest
4 голосов
/ 12 февраля 2009

У меня есть приложение GWT, которое отображает некоторые графики, отрисованные JFreeChart. Каждые несколько минут страница обновляется, в результате чего приложение генерирует новые графики. (Другими словами, весь процесс генерации диаграмм запускается клиентским запросом.) Проблема в том, что несколько клиентов, попадающих на один и тот же сервер, могут привести к нескольким запросам на генерацию диаграмм, но поскольку диаграммы одинаковы для всех пользователей, действительно нет причин делать это. Я хотел бы предварительно отобразить диаграммы в фоновом потоке, который будет запущен при запуске приложения, а затем просто подать клиенту уже обработанные графики по запросу.

Я не вижу никакого "санкционированного" способа в GWT выполнять свой собственный код при запуске сервера. Единственный способ сделать это - создать сервлет, который загружается при запуске контейнером приложения, и запустить поток генерации диаграммы в методе init ().

Есть ли более предпочтительный способ сделать это?

Примечание. Предполагая, что это правда, "нет" - вполне приемлемый ответ.

Ответы [ 4 ]

6 голосов
/ 12 февраля 2009

Чтобы ответить на ваш вопрос: Нет. GWT - это интерфейсная технология, и единственным битом GWT, пересекающим эту линию, является механизм RPC. Единственный способ типа «GWT», который вы могли бы сделать, это проверить, существуют ли файлы диаграмм при первом обращении к ним пользователя, и сгенерировать их, если они этого не делают. Это будет означать использование файловой системы для проверки того, была ли она создана или нет.

Лучшим способом было бы сделать то, что вы сказали, например: сконфигурировать ваш веб-проект для запуска класса при запуске. Вы делаете это в своем файле web.xml, как описано здесь:

http://wiki.metawerx.net/wiki/Web.xml.LoadOnStartup

Вот пример того, как Stripes делает это:

<servlet>
        <servlet-name>StripesDispatcher</servlet-name>
        <servlet-class>net.sourceforge.stripes.controller.DispatcherServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>StripesDispatcher</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
3 голосов
/ 01 августа 2010

Я не согласен, что вы должны поместить код в инициализацию сервлета для создания этих потоков. Когда веб-приложение остановлено, вы не сможете контролировать, когда уничтожать эти потоки. Также, когда вы снова запустите веб-приложение, оно снова создаст эти темы или нет?

Что было бы лучше, это использовать событие J2EE ServletContextListener с именем contextInitialized для создания потоков и событие contextDestroyed для уничтожения ваших потоков. Это также позволяет контролировать уничтожение потоков и ожидать завершения выполнения кода в потоках, прежде чем уничтожать их.

Похоже, это объясняет, как это работает: http://www.java -tips.org / Java-EE-советы / Java-сервлет / как к работе-с-servletcontextlistener.html

2 голосов
/ 12 февраля 2009

Прежде всего, я не согласен с предыдущим сообщением о том, что GWT является только интерфейсной технологией, поскольку в среду входит все для асинхронного создания и вызова служб. Смотрите, например, RemoteServiceServlet и использования. GWT предоставляет компоненты на стороне клиента и на стороне сервера.

Сказав это, GWT, похоже, не имеет сервлета типа запуска. Но, поскольку серверная часть основана на сервлетах, я для удобства буду склонен использовать сервлет запуска (поиск по Загрузка сервлетов при запуске в google) и создавать диаграммы запуск, затем периодически по мере необходимости.

В качестве альтернативы можно использовать задание cron, которое периодически перестраивает графики либо напрямую, либо с помощью частного сервиса.

В любом случае клиентские запросы будут просто получать предварительно сгенерированный график. Когда генерируется новый график, просто замените его вместо старого, чтобы не было заметных задержек для пользователя.

0 голосов
/ 12 февраля 2009

GWT - это интерфейсная структура. У меня есть какой-то конкретный серверный компонент, но он используется только для сериализации / десериализации запросов клиента. Помните, что передняя часть находится в JavaScript, а задняя часть - в java. Таким образом, серверные компоненты преобразуют объект JavaScript в его представление Java. Если вы посмотрите на свой код, вы можете заметить, что GWT RemoteServiceServlet просто наследует стандарты "javax.servlet.http.HttpServlet", как и любой сервлет. Он просто реализует свои собственные методы doPost и doGet для сериализации.

При этом ваш вопрос может относиться ко множеству других рамок. Это не зависит от GWT. Вам просто нужно настроить контейнер сервлетов для запуска GWT RemoteServiceServlet при запуске. Сервлет может иметь статический кеш, который используется всеми клиентами и доставлять одну и ту же диаграмму. Затем вы можете просто запустить второй поток при запуске, который периодически обновляет поток.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...