Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > При старте TomCat автоматически запустить класс.


Автор: Fameing 15.3.2006, 10:24
Возможно ли сделать что-то подобное для того как только запускается Application или весь TomCat то и запустить какой ныбуть класс ?

В классе есть метод main() и вот его нужно запустить.

Автор: Pantein 15.3.2006, 10:51
...очень просто...создай сервлет, укажи в web.xml параметр load-on-startup равный 0. Пример:
Код
<servlet>
            <servlet-name>.....</servlet-name>
            <servlet-class>......</servlet-class>
            <load-on-startup>0</load-on-startup>
</servlet>

и в методе init сервлета дергай нужный тебе класс и его метод. Сервлет будет инициализироваться сразу при запуске сервера или приложения и соответственно запускать нужный тебе метод.

Автор: 3,14 15.3.2006, 11:24
Боюсь, Pantein, не совсем понял задачу, так как у класса есть main() это наверняка не сервлет.

Запустить класс при запуске Tomcat просто, нужно просто добавить в bat файл строку:
java -classpath <bla-bla-bla> MyClass
А как запускать при старте webapp это ещё подумать нужно.

Не скромный вопрос, а зачем это нужно?

Автор: Fameing 15.3.2006, 11:33
Как сказал Pantein все заработало. 3,14 ты прав это не сервлет а простой клас.


Код

public class RTimerTask extends TimerTask {
    private static Logger logger = Logger.getLogger("simple");
    private static String time;

    public void run() {
        Connection conn = null;
        PreparedStatement pstmt = null;
        try {
            SimpleDateFormat formadata = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss");
            ResultSet rset;
            condb condb = new condb();
            conn = condb.opencon("PPS3");

            String SQL = "SELECT * FROM pps_adm.safe_history_date";

            pstmt = conn.prepareStatement(SQL);

            rset = pstmt.executeQuery();

            if (rset.next()) {
                time = formadata.format(rset.getTimestamp(1));
            }

            rset.close();
        } catch (SQLException e) {
            logger.error("SQLException RTimerTask" + e);
        } finally {
            try {
                if (pstmt != null) {
                    pstmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e1) {
                logger.error("SQLException RTimerTask close() " + e1);
            }
        }
    }

    public void main() {
        Timer timer = new Timer();
        RTimerTask task = new RTimerTask();
        timer.schedule(task, 0L, 30000L);
    }

    public static String getTime() {
        return time;
    }
}



а в сервлете зделал так

Код

public class loadonstartup extends HttpServlet {

    public void init() {
         RTimerTask RTimerTask = new RTimerTask();
         RTimerTask.main();
    }

}






Автор: Fameing 15.3.2006, 11:51
Цитата(Pantein @ 15.3.2006, 10:51)
...очень просто...создай сервлет, укажи в web.xml параметр load-on-startup равный 0. Пример:
Код
<servlet>
            <servlet-name>.....</servlet-name>
            <servlet-class>......</servlet-class>
            <load-on-startup>0</load-on-startup>
</servlet>

и в методе init сервлета дергай нужный тебе класс и его метод. Сервлет будет инициализироваться сразу при запуске сервера или приложения и соответственно запускать нужный тебе метод.

А какие есть еще параметры в <load-on-startup> ?

Автор: 3,14 15.3.2006, 12:16
Цитата(Fameing @ 15.3.2006, 11:33 Найти цитируемый пост)
а в сервлете зделал так

public class loadonstartup extends HttpServlet {

    public void init() {
        RTimerTask RTimerTask = new RTimerTask();
        RTimerTask.main();
    }

}

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

Автор: Pantein 15.3.2006, 12:20
To3.14 Я правильно понял задачу smile, просто может ты меня не понял, я написал чтометод надо дергать в сервлете, а не то, что нужный класс является сервлетом, и имел в виду как раз то, что и получилось, метод main такой же обычный метод как и все и его использовать можно как и любой другой метод, и для решения в рамках одного приложения так и нужно делать, потому что создание батника немного не то что нужно, насколько я понял класс должен крутиться и выполнять опред. действие веб приложения, а не как standalone application.

Fameing параметр <load-on-startup> это order для инициализации сервлета, если этого параметра нету, то определение порядка инициализации и ее время отводится сервлет контейнеру.

Автор: Fameing 15.3.2006, 12:21
Ну а как подругому можно реализовать ? Если по таймеру лезу в базу. А то что пришло исползую на протежении 30 сек в других сервлетах и jsp.

Автор: Pantein 15.3.2006, 12:34
ели действие надо будет проводить постоянно, или часто, тогда, используй Quartz, тебе сюда

http://www.opensymphony.com/quartz/

Автор: 3,14 15.3.2006, 13:03
А разве нельзя это приложение запускать отдельно от web приложения, как я понял RTimerTask туда ничего не передаёт. Пусть у тебя запуск RTimerTask так же будет прописан в какой нибудь start up скрипт, обычно так делают.

Автор: Fameing 17.3.2006, 15:09
Скорее всего RTimerTask нужно запукать всесте с приложением так-как через метод getTime() нужно получать дату и время. Или можно поместить в path class и оттуда я тоже буду получать информацию ?

Автор: 3,14 17.3.2006, 15:34
Fameing, тогда запускай таймер из какого либо существующего сервлета, а не создвай новый, это должен быть тот сервлет, к-ый использует данный таймер.

Автор: Fameing 17.3.2006, 16:09
Просто есть проблема в том что данние нужно получить до того когда будет использован сервлет.

Автор: alexsmirnov 19.3.2006, 22:06
Лучше не в сервлете, а в context Listener - запускается до всех сервлетов, не остается в памяти ( а если надо - можно поместить в servlet Context ) cm javax.servlet.ServletContextListener .
Конфигурится в web.xml или tld

Автор: FatherFrost 20.3.2006, 14:04
Fameing, наиболее правильным будет решение с листнером контекста сервлета... Потому что код, предложенный тобой выше, рабочий, но так делать не корректно...

alexsmirnov, Но листнер то как раз все время висит, но один для всех сервлетов... (ИМХО)

Автор: alexsmirnov 20.3.2006, 22:05
Listener сам не висит - просто создается экземпляр класса ( class.newInstance() ) и 1 раз запускается его метод, после чего контейнер про этот экземпляр забывает - а оставлять дальше что-либо или нет - дело вкуса разработчика.

Автор: FatherFrost 22.3.2006, 08:48
alexsmirnov, а какже тогда листнер может отлавливать событие на уничтожение (прекращение работы веб приложения). Ведь в интерфейсе javax.servlet.ServletContextListener есть два метода: contextInitialized(ServletContextEvent sce) и contextDestroyed(ServletContextEvent sce). Так что контейнер про него если и забывает, то только до коннца работы...

Автор: Fameing 28.3.2006, 11:10
А можно примерчик как должное это виглядить чтото я немогу понять. smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)