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


Автор: cosmonaft 28.2.2008, 22:24
Привет. Только начал разбираться с quartz.
Есть такая задача: при старте приложения, достать различные настройки тригера из БД (время запуска, количество запусков, дни и т.д.), создать этот тригер, который в нужное время запустит job. И второе, есть веб-интерфейс, в котором эти настройки тригера можно менять. Подскажите пожалуйста, примерно, как это реализовать. Долго думал, пока ничего путного не придумал. 

Автор: powerOn 28.2.2008, 22:52
А в чем собственно проблема? В каком моменте у возникли сложности? Весь порядок действий вы описали, остаётся только реализовать...

Автор: cosmonaft 28.2.2008, 23:17
Есть несколько вопросов, которые хотелось бы прояснить.
Т.е. в web.xml прописать сервлет, который стартует вместе с приложением? А там в методе init() и создавать тригер? А что потом будет с этим сервелтом, отработал и висит себе дальше в памяти? 
А нормально ли, если действия по созданию тригера перенести в уже существующий сервлет quartz'a QuartzInitializerServlet?

Автор: Zamuta 29.2.2008, 11:26
cosmonaft

Цитата

Т.е. в web.xml прописать сервлет, который стартует вместе с приложением? А там в методе init() и создавать тригер? А что потом будет с этим сервелтом, отработал и висит себе дальше в памяти? 

Не надо в методе init создавать триггер, триггер(ы) создаёшь в отдельном классе, в бд только хранятся настройки. При запуске приложения настройки будут извлекаться из бд (время след. запуска, результат пред. выполнения и т.д.) и выполняться, при остановке выгружаться.
Код

<servlet>
        <description>QuartzInitializerServlet</description>
        <servlet-name>QuartzInitializerServlet</servlet-name>
        <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
        <init-param>
            <param-name>config-file</param-name>
            <param-value>/quartz/quartz.properties</param-value>
        </init-param>
        <init-param>
            <param-name>shutdown-on-unload</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>start-scheduler-on-load</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
    </servlet>


Цитата

А нормально ли, если действия по созданию тригера перенести в уже существующий сервлет quartz'a QuartzInitializerServlet?

Странный у вас способ написния кода. Короче, он не для того писался. 

Сообщай о результатах.



Автор: cosmonaft 29.2.2008, 12:11
Zamuta, я все-таки не понял. Код, что ты привел у меня прописан. Он, как я понимаю, для запуска самого планировщика. 
Цитата

Не надо в методе init создавать триггер, триггер(ы) создаёшь в отдельном классе

Так я сделал такой класс. И где тогда при запуске приложения обратиться к объекту этого класса?
Цитата

При запуске приложения настройки будут извлекаться из бд (время след. запуска, результат пред. выполнения и т.д.) и выполняться, при остановке выгружаться

Опять же, я как раз и хочу узнать, где мне извлевкать эти настройки

Автор: Zamuta 29.2.2008, 13:00
cosmonaft, например
Код

public class MainCronTrigger {

    public MainCronTrigger() {        
    }

    public void run() throws Exception {       
  
        SchedulerFactory sf = new StdSchedulerFactory("/quartz/quartz.properties");
        Scheduler sched = sf.getScheduler();       
        JobDetail job = new JobDetail("job_name", "group_name", Job_name.class);
        CronTrigger trigger = new CronTrigger("trigger_name", "group_name", "job_name", "group_name", "1 * * * * ?");
        sched.addJob(job, true);
        Date ft = sched.scheduleJob(trigger);

        sched.start();
    }

    public void stopTrigger() {
        try {
            SchedulerFactory sf = new StdSchedulerFactory();
            Scheduler sched = sf.getScheduler();
            sched.shutdown();
        } catch (SchedulerException ex) {
            ex.printStackTrace();
        }
    }
}


Метод run() сохранит настройки в бд и запустит триггер. В след. раз нет необходимости запускать метод run(), т.к. настройки уже будут лежать в бд.

Цитата

Опять же, я как раз и хочу узнать, где мне извлевкать эти настройки


В коде это объекты JobDetail и CronTrigger. Для того чтобы кварц мог хранить настройки в бд сначала необходимо создать для этого таблицы, с которыми он будет работать и описать параметры соединения с бд в quartz.properties. Структуру таблиц для вашей бд можно найти в самом пакете quartz. quartz-1.6.0.zip\docs\dbTables .
Это моё решение, применимо для моей ситуации. Вы можете сделать по другому исходя из ваших запросов, например почитав  http://www.flazx.com/ebook5245.php

Автор: cosmonaft 29.2.2008, 14:17
Zamuta,  проблема в том, что нету специальных таблиц для кварца и нету JobStores. Есть таблицы, которые уже давно существуют и менять их, наверное, не будут.

Автор: Zamuta 29.2.2008, 14:56
cosmonaft, а как ты тогда собираешься хранить настройки в бд, если у тебя нет к ней доступа? Значит храни в файле или в памяти. Можешь посмотреть в примерах, которые идут в пакете с кварцем.

Автор: cosmonaft 29.2.2008, 15:26
Да не том смысле, что совсем нету доступа к базе  smile Доступ есть, но там уже есть свои специфические таблицы с настройками для тригеров, а ты имелл ввиду таблицы, которые создаются специально для работы с кварц.

Автор: Zamuta 29.2.2008, 15:32
cosmonaft, т.е. таблицы для триггеров есть, а для кварца нет? Это как?

Автор: cosmonaft 29.2.2008, 16:04
Таблицы не для самих тригеров, а настройки различные по количеству запусков, дням запуска и т.д. Просто раньше предполагалось делать приложение без использования квраца, поэтому и остались поля в таблице для этого дела.
 
Zamuta, я дико извиняюсь за свою непонятливость, но как класс MainCronTrigger, что ты привел создаст свой экземпляр и запустит метод run() при старте эппликейшена.

Автор: Zamuta 29.2.2008, 16:26
cosmonaft, никак. Метод, run() ты можешь запустить вручную, но после этого твои настройки сохранятся в бд и при следующих запусках кварц будет смотреть в бд и решать что выполнять и когда. Твоя задача только указать инициализировать все триггеры со всеми настройками.

Автор: cosmonaft 29.2.2008, 17:00
Ага, стало несколько прояснятся. 
Т.е. если я сразу в бд запихну все необходимые данные, то надобность в запуске того метода run() из MainCronTrigger отпадает вовсе (да и необходимость самого класса)? Я правильно понял?
Тогда, похоже, все же придется настраивать JobStore и коннект с базой...


Автор: Zamuta 29.2.2008, 17:35
cosmonaft, да всё правильно.

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