2 кварцевых задания обновляют одно и то же значение в дБ одновременно, вызывая несогласованное поведение - PullRequest
0 голосов
/ 16 апреля 2019

У меня была одна кварцевая работа, выполняющая некоторые вещи и отнимающая много времени для одного конкретного случая, а другие очень быстрые. Поэтому я не хочу останавливать свою работу в ожидании, когда один медленный случай выполняется очень долго, а другие дела завершены. Это задание запускается и проверяет флаг doStuff. когда doStuff == 1 run, выполнить вещи и сделать значение равным 0. Так что, когда в следующий раз задание запускается, оно не должно запускать уже выполненные вещи.

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

У меня есть 2 кварцевых задания A & B, запущенных одновременно и использующих один флаг, чтобы решить, запускать ли задание и выполнять какие-либо действия или запускать и выходить без выполнения каких-либо действий. У меня есть флаг doStuff, и он имеет начальное значение 0. когда его значение равно 1, то обе работы должны начать делать что-то, а когда они закончат, они должны обновить значение обратно до 0. Когда значение равно 0 и работа началась, то эта работа не будет делать ничего. Работа, выполняемая как работой A & B, точно такая же, но разные параметры. В идеале обе работы должны выполняться, когда флаг равен 1, и делать вещи, и обновлять значение до 0 Но когда первое задание запускается и завершается до запуска второго задания, оно обновляет значение до 0, а при втором запуске считывает значение 0 и ничего не делает.

Флаг doStuff - это столбец БД. Я могу добавить еще один столбец для задания B, но это не очень хороший дизайн, поскольку мы можем получить требование задания C, задания D, и я не могу добавить столбец для каждого требования.

Есть ли лучший способ справиться с этой проблемой?

Примечание: я новичок в Quartz Framework.

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

Ниже показано, как метод execute из InterruptableJob выглядит как

public void execute(JobExecutionContext jobContext) throws JobExecutionException {
    JobDataMap jobDataMap = jobContext.getMergedJobDataMap();
    final long customerId = jobDataMap.getLong(CUSTOMER_ID_KEY);

    List < QAgentAssetSourceInfo > customerAgents = getValuesBasedOnDoStuff();

    // below code is in Runnable run method and will be started in new thread 
    {
        failedAgents.putAll(agentMgmtHelper.get().doStuff(customerAgents, customer.getId(), null, batchSize));


        // we are done with stuff now make value to 0
        unsetDoStuff();
    });

}
...