Не запускать задание, когда оно уже запущено

У меня есть задание, запланированное в Liferay. Если, например, это задание выполняется каждые 5 минут и для его завершения требуется более 5 минут, как оно обрабатывается в Liferay?

Я заметил, что работа просто начнется снова, это может привести к проблемам для меня.

Можно ли как-то не запускать задание, когда оно уже запущено?

*используя Liferay 6.0.6

Спасибо


person Matthias G    schedule 21.03.2013    source источник


Ответы (2)


Попробуйте LockLocalServiceUtil и его методы lock(), unlock() и isLocked(). Что-то вроде этого:

try {
    if (LockLocalServiceUtil.isLocked()) {
        return;
    }
    LockLocalServiceUtil.lock();

    // do your job
} finally {
    LockLocalServiceUtil.unlock();
}

Блокировки хранятся в базе данных, поэтому в кластерной среде проблем не возникнет.

person milos.zikmund    schedule 24.03.2013
comment
круто, спасибо! не могли бы вы предоставить немного больше информации? LockLocalServiceUtil.lock (long userId, String className, long key, String owner, boolean inheritable, long expireTime) я полагаю, expireTime измеряется в миллисекундах? какое значение требуется в поле владельца? - person Matthias G; 25.03.2013
comment
Да, вы правы, expireTime измеряется в миллисекундах. На самом деле, я не знаю вашего точного варианта использования, но для меня lock(String className, String key, String owner, boolean retrieveFromCache) всегда было достаточно. Самый простой способ его использования — заполнить параметры className и key своими значениями (метод isLocked() проверяет только по этим параметрам) и заполнить owner с некоторой строковой константой (например, DEFAULT_OWNER) и retrieveFromCache со значением false. Потом можно использовать unlock(String className, String key) для разлочки и все нормально работает. - person milos.zikmund; 25.03.2013

Это может быть не лучшая практика, но здесь идет

    private static boolean runningJob = false;
@Override
public void receive(Message arg0) throws MessageListenerException {

    if(runningJob)
        return;

    runningJob = true; //marking that a job just started
    //Do stuff  { ....... } // this might take a while
    runningJob = false;
}
person yannicuLar    schedule 22.03.2013
comment
это не будет работать в кластере, я думаю: S, поэтому для меня это невозможное решение, которое я мог бы использовать. Я не упомянул в своем вопросе, что он сгруппирован, так что с вашим раствором теоретически все в порядке, я думаю ... спасибо за ваш вклад! - person Matthias G; 22.03.2013