0

我有一个线程正在更新声明所有可用文件存储的地图。要可用,文件存储必须是"online"并且他的大小必须是< 500MB. 如果文件存储达到 500MB 的限制,则轮到他"Read Only"创建一个新的。那部分没问题。

主线程根据地图上的可用文件将文件存储分配给每个新文档。但是,我想处理文档链接到文件存储的情况,比如说filestore_01,并且只是在属性和save()方法之间,filestore_01由第二个线程更新并转为"Read Only"

因此,我设置了一个 catch 并对错误代码进行测试,以便在发生该错误时为文档启动一个新的计算存储。问题是即使“新”文件存储似乎链接到我的文档,当我回忆起save()Documentum 重试将文档保存在原始文件存储中的方法时,filestore_01.

我通过 DFC 做所有事情,我不能使用,MIGRATE_JOB因为我的文档是新的,暂时不保存。

有人有想法吗?

这是代码:

    //Save the document
try {
    doc.save();
    DfLogger.info(ListenerCreateDocumentOperation.class, "Created document with id '" + doc.getObjectId().getId() + "' and serie '" + serialId + "'", null, null);


     } catch (DfException e) {
                     //if filestore is readonly
        if(e.getErrorCode()==256) {
            StorageService.getInstance().updateFileStoresArray(); //force to update the filestores map

            try {                   
                doc.computeStorageType(); //recompute the filestore where the doc will be save
                doc.save(); //save the document

                DfLogger.info(ListenerCreateDocumentOperation.class, "Created document with id '" + doc.getObjectId().getId() + "'", null, null);
            } catch (Exception e2) {
                e.printStackTrace();
                throw new DfException("Error - Transaction aborted for XML : " + process.getXmlPath());
            }
        }
        e.printStackTrace();

第一个computeStorage()调用是在setFile()DFC 方法中,我将 PDF 链接到文档。

文件存储映射更新的第二个线程(大约每 5 秒运行一次)启动此功能:

    public void updateFileStoresArray() {       
        LOGGER.info(StorageService.class+" updating filestore array");
        IDfSession s0 = null;
        try {
            FILESTORE_ARRAY.clear();
            s0 = getDctmSessionManager().getSession(getRepository());               
            s0.addDynamicGroup("dm_superusers_dynamic");
            getAllFileStores(s0);
            for(int i=0; i<FILESTORE_ARRAY.size(); i++) {
                try {
                    IDfFileStore currentFileStore = FILESTORE_ARRAY.get(i);
                    if(currentFileStore.getCurrentUse()/1000000 >= max_size) {
                        LOGGER.info("Filestore "+currentFileStore.getName()+" is full, he'll be set in readonly mode and a new dm_filestore will be create");
                        FILESTORE_ARRAY.remove(i);
                        IDfQuery batchList = new DfQuery();
                        batchList.setDQL("execute set_storage_state with store = '"+currentFileStore.getName()+"', readonly=true");
                        batchList.execute(s0, IDfQuery.DF_QUERY);
                        IDfFileStore filestore = createNewFilestore(s0);
                        FILESTORE_ARRAY.add(filestore);                 
                    }
                } catch (Exception e) {
                    DfLogger.error(StorageService.class, "Error in execute()", null, e);
                    e.printStackTrace();
                }
            }
            if(FILESTORE_ARRAY.size()==0) {
                LOGGER.info("Recomputing");
                createNewFilestore(s0);
            }
        }
        catch (DfException e1) {

            e1.printStackTrace();
        } 
        finally {
            if (s0 != null) {
                getDctmSessionManager().release(s0);
            }
        }
    }

这是computeStorage()方法:

public void computeStorageType() throws DfException {
    if(getStorageType()==null || getStorageType().equals("filestore_01") || Utils.isNullString(getStorageType())) {
        getSession().addDynamicGroup("dm_superusers_dynamic");
        String storageType=null;
        StorageService.getInstance();
        storageType = StorageService.computeStorage(getSession(), this);        
        if(getStorageType()==null || !getStorageType().equals(storageType)) {
            setStorageType(storageType);    
        }
        getSession().removeDynamicGroup("dm_superusers_dynamic");
    }   
}

public static String computeStorage(IDfSession s0, IGenericAspect vfkGenericDocumentAspect) throws DfException {

    String result = null;

    try {
        if(FILESTORE_ARRAY.size()==0) {
            getAllFileStores(s0);
        }           
        if(FILESTORE_ARRAY.size()==0) {
            createNewFilestore(s0);
            getAllFileStores(s0);
        }

        IDfFileStore filestore = FILESTORE_ARRAY.get(currentFileStoreIndex);

        if(filestore.getStatus()==2 || filestore.getStatus()==1) {
            if(currentFileStoreIndex+1<FILESTORE_ARRAY.size() && FILESTORE_ARRAY.get(currentFileStoreIndex+1)!=null) {
                currentFileStoreIndex=currentFileStoreIndex+1;
                filestore = FILESTORE_ARRAY.get(currentFileStoreIndex);
            }

        }
        result= filestore.getName();

        LOGGER.info("Document "+vfkGenericDocumentAspect.getObjectId()+" will be store in filestore "+result);

        if(currentFileStoreIndex+1<FILESTORE_ARRAY.size())
            currentFileStoreIndex=currentFileStoreIndex+1;
        else
            currentFileStoreIndex=0;



    } catch(Exception e) {
        DfLogger.error(StorageService.class, "Error in execute()", null, e);
        e.printStackTrace();
    }

    return result;
}
4

0 回答 0