2013-03-21 2 views
0

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

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

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

* с помощью Liferay 6.0.6

Благодарности

ответ

2

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

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

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

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

+0

удивительный, спасибо! Вы могли бы предоставить немного больше информации? LockLocalServiceUtil.lock (long userId, String className, long key, String owner, boolean inheritable, long expirationTime) Я думаю, expirationTime измеряется в миллисекундах? какое значение требуется в поле владельца? –

+0

Да, вы правы, expirationTime измеряется в milis. На самом деле, я не знаю вашего точного варианта использования, но для меня всегда достаточно блокировки (String className, String key, String owner, boolean retrieveFromCache) '. Самый простой способ использовать это - заполнить параметры _className_ и _key_ вашими значениями ('isLocked()' метод проверяет только в соответствии с этими параметрами) и заполнить _owner_ некоторой константой String (например, DEFAULT_OWNER) и _retrieveFromCache_ с ложным значением. Затем вы можете использовать 'unlock (String className, String key)' для разблокировки, и все работает нормально. –

0

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

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; 
} 
+0

Это не сработает в кластере, я думаю: S, поэтому для меня это не возможное решение, которое я мог бы использовать. Я не упомянул в своем вопросе, что он сгруппирован, поэтому вы, теоретически, solutian, я думаю ... спасибо за ваш вклад! –

Смежные вопросы