Alfresco JavaScript/Rhino многопотоковая обработка и параллелизм

Давайте рассмотрим две отдельные задачи Alfresco Rhino-JavaScript, которые конкурируют за создание одной и той же папки:

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);
}

Если мы запустим первый скрипт с sleep (10 секунд) и второй скрипт без sleep, тогда:

  • второй скрипт создаст папку "folder-x"
  • первый сценарий вызовет исключение "Папка-файл или папка-x уже существует"

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

1 ответ

Решение

Извините, я понял, это было тривиально...

Метод 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);
}
Другие вопросы по тегам