Потоки на сервере приложений - PullRequest
12 голосов
/ 10 февраля 2009

У меня есть программа / нить на Java, которую я хочу развернуть на сервере приложений (GlassFish). Поток должен работать как «служба», которая запускается при запуске сервера приложений и останавливается при закрытии сервера приложений.

Как бы я поступил так? На самом деле это не Session Bean или MDB. Это просто нить.

Ответы [ 6 ]

7 голосов
/ 10 февраля 2009

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

Создайте класс Listener, который реализует 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 после вашего последнего 'context-param' и перед вашим первым 'servlet':

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

Не знаю, рекомендуют ли такие вещи или нет, но в прошлом это работало нормально для меня.

3 голосов
/ 10 февраля 2009

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

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

2 голосов
/ 26 февраля 2009
1 голос
/ 10 февраля 2009

Создайте сервлет, чей метод 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>
0 голосов
/ 01 июля 2010

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

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

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

0 голосов
/ 02 мая 2009

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

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

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

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

...