:com.liferay.portal.kernel.backgroundtask.SerialBackgroundTaskExecutorを.acquireLock()
コードは
です
@Override
public BackgroundTaskResult execute(BackgroundTask backgroundTask)
throws Exception {
Lock lock = null;
String owner =
backgroundTask.getName() + StringPool.POUND +
backgroundTask.getBackgroundTaskId();
try {
if (isSerial()) {
lock = acquireLock(backgroundTask, owner);
}
BackgroundTaskExecutor backgroundTaskExecutor =
getBackgroundTaskExecutor();
return backgroundTaskExecutor.execute(backgroundTask);
}
finally {
if (lock != null) {
LockLocalServiceUtil.unlock(
BackgroundTaskExecutor.class.getName(),
backgroundTask.getTaskExecutorClassName(), owner);
}
}
}
protected Lock acquireLock(BackgroundTask backgroundTask, String owner)
throws DuplicateLockException {
Lock lock = null;
while (true) {
try {
lock = LockLocalServiceUtil.lock(
BackgroundTaskExecutor.class.getName(),
backgroundTask.getTaskExecutorClassName(), owner);
break;
}
catch (SystemException se) {
if (_log.isDebugEnabled()) {
_log.debug("Unable to acquire acquiring lock", se);
}
try {
Thread.sleep(50);
}
catch (InterruptedException ie) {
}
}
}
if (!lock.isNew()) {
throw new DuplicateLockException(lock);
}
return lock;
}
私のコードに大きな変化は
if (!lock.isNew()) {
throw new DuplicateLockException(lock);
}
基本的に2つのスレッドが(同時に2つのスケジューラを焼成することにより、私はテストがあった)ロック()メソッドを呼び出すことができている場合でも、一つだけをチェックしました新しいオブジェクトの作成に成功し、もう1つは既存のロックオブジェクトをフェッチするだけです。
したがってlock.isNew()は、実際のロックを保持しているスレッドを見つけるはずです。
おかげで、
Sibyマシューあなたが答えを取得したいと思い
?ここに?またはLiferayのフォーラムで?どこか? http://meta.stackexchange.com/questions/141823/why-is-cross-posting-wrong-on-an-external-siteを読み、それに応じて更新/リンク/削除してください –
私はliferayの私のポストへのリンクを追加しましたフォーラム – simplysiby