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