2016-10-27 12 views
2

は同じフォルダを作成するためのが競う二つの別々のAlfrescoはRhinoの-JavaScriptのタスクを考えてみましょう:AlfrescoはJavaScriptを/ Rhinoのマルチスレッド処理と並行処理

var shared = companyhome.childByNamePath("shared"); 
var newFolderName = "folder-x"; 
var newFolder = shared.childByNamePath(newFolderName); 
if (newFolder==null) { 
    java.lang.Thread.sleep(10000);//remove this line in second thread 
    newFolder = shared.createFolder(newFolderName); 
    if (newFolder==null){ 
     logger.error("error: "+newFolderName); 
    } else { 
     logger.info("success: "+newFolderName); 
    } 
} else { 
    logger.info("already exists: "+newFolderName); 
} 

我々は睡眠(10秒)との最初のスクリプトを実行した場合と、その後、睡眠なしで2番目のスクリプト:

  • は、2番目のスクリプトは、最初のスクリプトが例外
  • 「ファイルまたはフォルダのフォルダ-xがすでに存在している」上昇するフォルダ「フォルダ-X」
  • を作成します。

多くの競合するスレッドがランダムなフォルダを作成しようとしています。 セマフォやアトミック操作のように、指定されたフォルダの作成のみをブロックするものがありますか(他のフォルダの非ブロック化)?

+0

前の代わりに睡眠... – dandavis

答えて

2

申し訳ありませんが、私はそれを得る、それは...方法createFolder()

些細た原子であり、我々はちょうどフォルダが既に作成された場合に例外を処理する必要があります:あなただけの後にチェックする必要があり

var getOrCreateFolder = function(parent, newFolderName){ 
    var newFolder = parent.childByNamePath(newFolderName); 
    if (newFolder==null) { 
     try { 
      java.lang.Thread.sleep(10000);//remove this line in second thread 
      newFolder = parent.createFolder(newFolderName); 
      return {folder:newFolder,isNew:true}; 

     } catch (e) { 
      newFolder = parent.childByNamePath(newFolderName); 
      if (newFolder!=null){ 
       return {folder:newFolder,isNew:false}; 
      } else { 
       throw e; 
      } 
     } 
    } else { 
     return {folder:newFolder,isNew:false}; 
    } 
}; 

var shared = companyhome.childByNamePath("shared"); 
var newFolderName = "folder-x"; 
var folderDto = getOrCreateFolder(shared,newFolderName); 
if (folderDto.folder==null) { 
    logger.error("error: "+newFolderName); 
} else { 
    logger.info("done: "+newFolderName+", new: "+folderDto.isNew); 
}