我有一个线程正在更新声明所有可用文件存储的地图。要可用,文件存储必须是"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;
}