2016-10-27 4 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 сек) и второй сценарий без сна, то:

  • второй скрипт создаст папку «папку-х»
  • первый сценарий будет расти «файл или папка папка-х уже существует» исключение

Давайте представим себе множество конкурирующих потоков, пытающихся создать случайные папки. Есть ли что-то вроде семафоров или атомных операций, которые блокируют только создание указанной папки (неблокирование для других папок)?

+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); 
} 
Смежные вопросы