2016-05-13 5 views
0

私はLR 6.2 CE GA4クラスタ環境で作業しています。 2つのノードは、portal-extクラスタ構成で共有キャッシュと同じDBを共有します。Liferayクラスタの並行処理について

processMe() 15分おきに、ユーザがページをクリックして呼び出すことができるスケジューラがあります。

私の要件は、このメソッドへの同時呼び出しを制限することです。 異なるJVMのために同期ブロックが動作しないことを理解します。

LiferayからOOTBを再利用できるものはありますか? JGroupsユニキャスト/マルチキャスト通信から何かを再利用することはできますか?

他の提案はありますか?

は、Liferayのフォーラムで掲示される:https://web.liferay.com/community/forums/-/message_boards/message/74168121

おかげで、私は方法を参照後の溶液を発見した

Sibyマシュー

+0

?ここに?またはLiferayのフォーラムで?どこか? http://meta.stackexchange.com/questions/141823/why-is-cross-posting-wrong-on-an-external-siteを読み、それに応じて更新/リンク/削除してください –

+0

私はliferayの私のポストへのリンクを追加しましたフォーラム – simplysiby

答えて

0

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マシューあなたが答えを取得したいと思い

関連する問題