Запуск/остановка на конкретную дату

208
26 июля 2018, 00:00

День добрый. Возникла необходимость создания планировщика заданий. Почитав интернет везде рекомендует использовать Quartz. Но я не со всем понимаю как создать то что мне надо: У меня есть база данных с днями рождениями клиентов. Суть в том что на 1 число текущего месяца необходимо сформировать список клиентов с др, у каждого клиента есть столбец GIFT. Его суть в том, что на дни рождения в этот столбец будет начисляться бонусные баллы. Так вот необходимость состоит в том что. Нужно создавать н-количество задач которые будут начислять эти бонусы. То есть в задачу надо передавать id_cliet и sum_gift. Причем каждую задачу надо выполнить строго за день до его дня рождения. А затем спустя день после его дня рождения выполнить вторую, которая удалит бонусы если они не были использованы.

Для этих целей не плохо подошел этот код. Но есть нюанс, я не понимаю как в него передать нужные мне значения для аппдейтов. И привязать его к дате выполнения.

public class QuartzJob implements Job {
public QuartzJob(){
}
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    System.out.println(jobExecutionContext.getTrigger());
}
}
 JobDetail job = JobBuilder
                .newJob(QuartzJob.class)
                .withIdentity("QuartzJob", "group1")
                .build();
        Trigger trigger = TriggerBuilder
                .newTrigger()
                .withIdentity("QuartzTrigger", "group1")
                .withSchedule(CronScheduleBuilder
                        .cronSchedule("0 48 9-18/1 ? * MON,TUE,WED"))
                .build();

        SchedulerFactory schedFact = new StdSchedulerFactory();
        Scheduler sched = schedFact.getScheduler();
        sched.start();
        sched.scheduleJob(job,trigger);

Всем кто откликнется спасибо!

Answer 1

Логика не та. Вам не нужно плодить кучу заданий. Достаточно одной задачи, которая будет обращаться прямо в момент выполнения в бд, брать всех юзеров и проходится по ним делая то что Вам нужно. Запускать можно, допустим в конце дня, то бишь в полночь. Ну в момент выполнения вы уже смотрите если дата рождения юзера совпадает со следующим днем то начисляете бонусы, если же дата рождения после списываете бонусы.

public class CronUsers implements Job {
        @Override
        public void execute(JobExecutionContext ctx) throws JobExecutionException {
            // Определяем текущую дату. Можно заодно предыдущую и следующую.
            Calendar C = Calendar.getInstance(); 
            Date current = C.getTime();// текущая
            C.add(Calendar.DATE, -1); // минус один день
            Date yesterday = C.getTime();
            C.add(Calendar.Date, 2); // добавляем два дня (учитываем что отнимали в предыдущем действии один день.
            Date tomorrow = C.getTime();
            // Обращаетесь к бд. Получаете список пользователей
            List<User> users = DataBase.getUsers();
            users.stream().forEach(user=>{
               Date birthday = user.getBirthDay(); // преобразуем строку с датой рождения в объект Date. Можно воспользоваться SimpleDateFormat.
               // Делаем проверки на даты и пишем в базу
            });
        }
    }
READ ALSO
Mockito тестирование

Mockito тестирование

Тестирую метод 1В методе 1 есть статический вызов метода 2 на объекте другого класса

193
AndroidStudio unit tests

AndroidStudio unit tests

Как протестировать работу кнопок с помощью Espresso,когда они создаются программно и их не запустить с помощью resource idC помощью classname так же не проверить...

213
ArrayDeque, работает не так как ожидаю

ArrayDeque, работает не так как ожидаю

Проблемы с пониманием работы ArrayDeque, а именно с заданием размерности

196
Создание анимированных персонажей

Создание анимированных персонажей

Хочу спроситьКакие технологии используются для создания анимированных персонажей на платформа Android и/или iOS

203