Поточная обработка в сервере приложений

Может случиться так, что вы пишете «удивительный», а не «внушительный»

12
задан informatik01 11 August 2013 в 23:11
поделиться

6 ответов

Я только сделал это с Tomcat, но он должен работать в Glassfish.

Создайте класс Слушателя, который реализует javax.servlet.ServletContextListener, затем поместите его в web.xml. Это будет уведомлено, когда Ваше веб-приложение будет запущено и уничтожено.

Простой класс Слушателя:

public class Listener implements javax.servlet.ServletContextListener {

    MyThread myThread;

    public void contextInitialized(ServletContextEvent sce) {
        myThread = new MyThread();
        myThread.start();
    }

    public void contextDestroyed(ServletContextEvent sce) {
        if (myThread != null) {
            myThread.setStop(true);
            myThread.interrupt();
        }
    }

}

Это входит в web.xml после Вашего последнего 'контекста-param' и перед Вашим первым 'сервлетом':

<listener>
    <listener-class>atis.Listener</listener-class>
</listener>

Не знайте, рекомендуется ли такого рода вещь или нет, но она хорошо работала для меня в прошлом.

7
ответ дан 2 December 2019 в 21:24
поделиться

Это не что-то, что необходимо сделать в любом сервере приложений, если у Вас нет доступа к управляемым потокам, обеспеченным сервером приложений. Я не знаком с Glassfish, но Вы могли сделать это в Websphere или Weblogic с помощью commonj WorkManager.

По-видимому, то же может быть выполнено в Glassfish и JBOSS через JCA WorkManager (который я не знаком с).

3
ответ дан 2 December 2019 в 21:24
поделиться

Создайте сервлет, init метод которого запускает поток, который является основной программой.

public void init() throws ServletException {
    mailThread = new MailSendThread();
    mailThread.start();
}

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

<servlet>
    <servlet-name>Mail Sending Servlet</servlet-name>
    <servlet-class>MailServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
</servlet>
1
ответ дан 2 December 2019 в 21:24
поделиться

Мне также нужно создать несколько потоков, каждый из которых будет открывать сокет для других удаленных процессов, запущенных в моем приложении Glassfish. Сервер. Я посмотрел на компонент LifecycleListener, предоставленный Glassfish, который вам нужно реализовать.

Я создал прототип для выполнения потоков и сокетов в реализации LifecycleListener, и он действительно не помог с управлением этими ресурсами. Чтобы получить доступ к LifecycleListener, мне пришлось поместить публичный статический метод , который будет выполнять нужные действия.

Я не вижу значения в LifecycleListener, потому что я мог выполнить ту же самую работу внутри моего EJB, то есть клиента, вызывающего LifecycleListener. Потому что в bean-компоненте нет должного управления Thread и Socket.

Мне сказали, что JCA может быть лучшим путем. Я не пробовал это.

0
ответ дан 2 December 2019 в 21:24
поделиться

Я запускаю синхронизированный объект с помощью службы таймера и только с одним единственным истечением срока. Затем, во время тайм-аута, я делаю с потоком то, что хотел.

http://onjava.com/pub/a/onjava/2004/10/13/j2ee-timers.html

Для меня это сработало, так как он использует компоненты J2EE и представляет собой другой поток.

0
ответ дан 2 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: