Alfresco JavaScript/Rhino多线程处理和并发

Alfresco JavaScript/Rhino multi-thread processing and concurrency

本文关键字:并发 多线程处理 Rhino JavaScript Alfresco      更新时间:2023-09-26

让我们考虑两个独立的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"
  • 第一个脚本将触发"File or folder folder-x already exists"异常

让我们想象有很多线程试图创建随机文件夹。是否有类似信号量或原子操作的东西,只阻塞创建指定的文件夹(非阻塞其他文件夹)?

对不起,我明白了,这是微不足道的…

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