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

标签 javascript alfresco 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”
  • 第一个脚本会出现“文件或文件夹folder-x已存在”异常

让我们想象一下许多竞争线程试图创建随机文件夹。 是否有像信号量或原子操作之类的东西只阻止创建指定的文件夹(不阻止其他文件夹)?

最佳答案

抱歉,我明白了,这只是微不足道的......

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

关于javascript - Alfresco JavaScript/Rhino 多线程处理和并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40292876/

相关文章:

javascript - 如何将事件附加到新添加的 html 元素

javascript - 使用 focusMode 约束获取所需的媒体设备

java - Alfresco REST api 'groups/children?level="ALL"',是否存在类似的东西?

javascript - 通过 Web 脚本的 javascript Controller 访问 Alfresco 的 alfresco-global.properties 文件中的值?

java - 使用 Rhino 从评估的 JS 中获取函数名称及其参数

java - 如何在 OSX 10.6 Snow Leopard 上最好地安装 Rhino

javascript - 如何访问动态创建的对象

javascript - 如何在浏览器中跨页面保留 Cognito 身份

Maven Surefire 插件丢失?

javascript - 如何在防火墙后使用 mozilla Rhino?