Интеграция кварца с пружиной - PullRequest
1 голос
/ 25 января 2011

У меня есть веб-приложение, и я пытаюсь запустить планировщик Quartz программным способом весной.У меня есть класс обслуживания, в котором я создаю экземпляр SchedulerFactory, а затем получаю планировщик.

Код выглядит следующим образом.

@Service("auctionWinnerService")
public class NormalAuctionWinnerServiceImpl implements AuctionWinnerService {

    public static final String NORMAL_AUCTION = "NORMAL AUCTION";
    public static int NORMAL_AUCTION_COUNTER = 0;
    private SchedulerFactory schedulerFactory;
    private Scheduler scheduler;

    public void declareWinner(int auctionId, Map<String, Object> parameterMap) {
        System.out.println("INSIDE declareWinner of NormalAuctionWinner");
        schedulerFactory = new StdSchedulerFactory();
        try {
            scheduler = schedulerFactory.getScheduler();
            System.out.println("GOT SCHEDULER : "+scheduler);
        } catch (SchedulerException e1) {
            e1.printStackTrace();
        }

        JobDetail jd = new JobDetail();
        jd.setName(NORMAL_AUCTION+" JOB "+NORMAL_AUCTION_COUNTER);
        jd.setJobClass(NormalAuctionWinnerJob.class);

        /** CREATE CRON TRIGGER INSTANCE **/
        CronTrigger t = new CronTrigger();
        t.setName(NORMAL_AUCTION + ++NORMAL_AUCTION_COUNTER);
        t.setGroup("Normal Auction");
        Date d = new Date();
        Date d1 = new Date();
        d1.setMinutes(d.getMinutes()+5);

        t.setStartTime(d);
        t.setEndTime(d1);
        try {
            t.setCronExpression("10 * * * * ? *");
            scheduler.scheduleJob(jd, t);
        } catch (SchedulerException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
}

SchedulerFactory и планировщик создаются, но мои задания не выполняютсязапустить.Кто-нибудь может указать, что я здесь упускаю?

Также мне нужен только один экземпляр Factory и один экземпляр планировщика.Я пытался сделать статический, но это не сработало.Любые указатели в этом направлении будут полезны.

Спасибо

Ответы [ 3 ]

1 голос
/ 26 января 2011

Если у вас нет особых требований к проприетарной функциональности Quartz, я рекомендую избавиться от него и использовать Возможность внутреннего планирования Spring .Начиная с Spring 3, это включает поддержку выражений типа cron, очень похожих на триггер cron в Quartz.

Помимо простоты приложения и его конфигурации, оно по своей природе более надежно, чем Quartz, и предоставляетAPI для программного использования через интерфейс TaskScheduler.

0 голосов
/ 27 января 2011

Вы забыли запустить планировщик!scheduler.start();

...
try {
   t.setCronExpression("10 * * * * ? *");
scheduler.scheduleJob(jd, t);
scheduler.start();
} catch (SchedulerException e) {
      e.printStackTrace();
} catch (ParseException e) {
      e.printStackTrace();
}

Я доказал это, добавив отсутствующее утверждение (и заменив задание на пустышку), оно сработало для меня /

0 голосов
/ 25 января 2011

Прежде всего, насколько хорошо вы знаете выражения триггера Quartz или Cron? Я могу ошибаться, но 10 * * * * ? * будет запускать курок каждую 10-ю секунду каждой минуты, но я никогда не видел такого выражения, оно может вообще не срабатывать.

Вы пытаетесь создать триггер для стрельбы каждые 10 секунд? В этом случае используйте простой триггер, подобный следующему:

new SimpleTrigger((NORMAL_AUCTION + ++NORMAL_AUCTION_COUNTER),
                   "Normal Auction",
                   d,
                   d1,
                   SimpleTrigger.REPEAT_INDEFINITELY,
                   10000L);

Edit:

Хорошо, поэтому, если это ваше требование, вам нужен триггер, который заполняет огонь только один раз, в конце аукциона. Для этого используйте SimpleTrigger, например:

new SimpleTrigger((NORMAL_AUCTION + ++NORMAL_AUCTION_COUNTER),
               "Normal Auction",
               d1,
               null,
               0,
               0L);

Дата начала в этом случае не имеет значения, если вы установите ее в соответствующее время (время окончания) и только один раз.

И, как дополнительное примечание, не рассчитывайте такие даты. Я предлагаю вам попробовать Библиотека времени Joda . Действительно простая и хорошо известная замена неуклюжего стандартного API Date / Calendar.

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