无法使用 DFC 删除 Documentum 应用程序中的文档
Unable to delete documents in documentum application using DFC
我用《EMC DFC 7.2开发指南》中给出的方法编写了以下代码。使用此代码,即使有更多记录,我也只能删除 50 个文档。在删除之前,我正在处理对象 ID 的转储。我不确定 IDfDeleteOperation 是否有任何限制。由于这只删除了 50 个文档,我尝试使用 DQL 删除命令,即使它被限制为 50 个文档。我尝试使用文档具有的 destory() 和 destroyAllVersions() 方法,即使这对我不起作用。我已经用 main 方法编写了所有内容。
import com.documentum.com.DfClientX;
import com.documentum.com.IDfClientX;
import com.documentum.fc.client.*;
import com.documentum.fc.common.DfException;
import com.documentum.fc.common.DfId;
import com.documentum.fc.common.IDfLoginInfo;
import com.documentum.operations.IDfCancelCheckoutNode;
import com.documentum.operations.IDfCancelCheckoutOperation;
import com.documentum.operations.IDfDeleteNode;
import com.documentum.operations.IDfDeleteOperation;
import java.io.BufferedWriter;
import java.io.FileWriter;
public class DeleteDoCAll {
public static void main(String[] args) throws DfException {
System.out.println("Started...");
IDfClientX clientX = new DfClientX();
IDfClient dfClient = clientX.getLocalClient();
IDfSessionManager sessionManager = dfClient.newSessionManager();
IDfLoginInfo loginInfo = clientX.getLoginInfo();
loginInfo.setUser("username");
loginInfo.setPassword("password");
sessionManager.setIdentity("repo", loginInfo);
IDfSession dfSession = sessionManager.getSession("repo");
System.out.println(dfSession);
IDfDeleteOperation delo = clientX.getDeleteOperation();
IDfCancelCheckoutOperation cco = clientX.getCancelCheckoutOperation();
try {
String dql = "select r_object_id from my_report where folder('/Home', descend);
IDfQuery idfquery = new DfQuery();
IDfCollection collection1 = null;
try {
idfquery.setDQL(dql);
collection1 = idfquery.execute(dfSession, IDfQuery.DF_READ_QUERY);
int i = 1;
while(collection1 != null && collection1.next()) {
String r_object_id = collection1.getString("r_object_id");
StringBuilder attributes = new StringBuilder();
IDfDocument iDfDocument = (IDfDocument)dfSession.getObject(new DfId(r_object_id));
attributes.append(iDfDocument.dump());
BufferedWriter writer = new BufferedWriter(new FileWriter("path to file", true));
writer.write(attributes.toString());
writer.close();
cco.setKeepLocalFile(true);
IDfCancelCheckoutNode cnode;
if(iDfDocument.isCheckedOut()) {
if(iDfDocument.isVirtualDocument()) {
IDfVirtualDocument vdoc = iDfDocument.asVirtualDocument("CURRENT", false);
cnode = (IDfCancelCheckoutNode)cco.add(iDfDocument);
} else {
cnode = (IDfCancelCheckoutNode)cco.add(iDfDocument);
}
if(cnode == null) {
System.out.println("Node is null");
}
if(!cco.execute()) {
System.out.println("Cancel check out operation failed");
} else {
System.out.println("Cancelled check out for " + r_object_id);
}
}
delo.setVersionDeletionPolicy(IDfDeleteOperation.ALL_VERSIONS);
IDfDeleteNode node = (IDfDeleteNode)delo.add(iDfDocument);
if(node == null) {
System.out.println("Node is null");
System.out.println(i);
i += 1;
}
if(delo.execute()) {
System.out.println("Delete operation done");
System.out.println(i);
i += 1;
} else {
System.out.println("Delete operation failed");
System.out.println(i);
i += 1;
}
}
} finally {
if(collection1 != null) {
collection1.close();
}
}
} catch(Exception e) {
e.printStackTrace();
} finally {
sessionManager.release(dfSession);
}
}
}
我不知道我在哪里犯了错误,每次尝试时,程序都会在第 50 次迭代时停止。你能帮我以正确的方式删除所有文件吗?非常感谢!
您可以直接从您的代码中执行此操作:
删除 my_report 个文件夹中的对象('/Home', descend)
无需再次获取您丢弃的信息 ;-)
首先select将所有文档ID例如List<IDfId>
并关闭集合。不要在打开的集合中执行其他昂贵的操作,因为这样你就不必要地阻塞了它。
这就是为什么它只做了 50 个文件的原因。因为您有一个主要打开的集合,每次执行删除操作都会打开另一个集合,它可能达到了某个限制。所以正如我所说,最好先使用集合,然后进一步处理这些数据:
List<IDfId> ids = new ArrayList<>();
try {
query.setDQL("SELECT r_object_id FROM my_report WHERE FOLDER('/Home', DESCEND)");
collection = query.execute(session, IDfQuery.DF_READ_QUERY);
while (collection.next()) {
ids.add(collection.getId("r_object_id"));
}
} finally {
if (collection != null) {
collection.close();
}
}
之后您可以遍历列表并对您需要的文档执行所有操作。但是不要在每次迭代中都执行删除操作——这是无效的。而不是将所有文档添加到一个操作中并在最后执行一次。
IDfDeleteOperation deleteOperation = clientX.getDeleteOperation();
deleteOperation.setVersionDeletionPolicy(IDfDeleteOperation.ALL_VERSIONS);
for (IDfId id : ids) {
IDfDocument document = (IDfDocument) session.getObject(id);
...
deleteOperation.add(document);
}
deleteOperation.execute();
IDfCancelCheckoutOperation
也是如此。
还有一件事 - 当您使用 FileWriter
时,请在 finally
块中使用 close()
或像这样使用 try-with-resources:
try (BufferedWriter writer = new BufferedWriter(new FileWriter("file.path", true))) {
writer.write(document.dump());
} catch (IOException e) {
throw new UncheckedIOException(e);
}
使用StringBuilder
是个好主意,但只在开始时创建一次,在每次迭代中追加所有属性,然后在最后将StringBuilder
的内容写入文件,不是在每次迭代期间 - 它很慢。
您可能面临 DFC 客户端的结果集限制。
尝试将这些行添加到 dfc.properties 并重新运行您的代码以查看是否可以删除超过 50 行,然后根据您的需要进行调整。
dfc.search.max_results = 100
dfc.search.max_results_per_source = 100
我用《EMC DFC 7.2开发指南》中给出的方法编写了以下代码。使用此代码,即使有更多记录,我也只能删除 50 个文档。在删除之前,我正在处理对象 ID 的转储。我不确定 IDfDeleteOperation 是否有任何限制。由于这只删除了 50 个文档,我尝试使用 DQL 删除命令,即使它被限制为 50 个文档。我尝试使用文档具有的 destory() 和 destroyAllVersions() 方法,即使这对我不起作用。我已经用 main 方法编写了所有内容。
import com.documentum.com.DfClientX;
import com.documentum.com.IDfClientX;
import com.documentum.fc.client.*;
import com.documentum.fc.common.DfException;
import com.documentum.fc.common.DfId;
import com.documentum.fc.common.IDfLoginInfo;
import com.documentum.operations.IDfCancelCheckoutNode;
import com.documentum.operations.IDfCancelCheckoutOperation;
import com.documentum.operations.IDfDeleteNode;
import com.documentum.operations.IDfDeleteOperation;
import java.io.BufferedWriter;
import java.io.FileWriter;
public class DeleteDoCAll {
public static void main(String[] args) throws DfException {
System.out.println("Started...");
IDfClientX clientX = new DfClientX();
IDfClient dfClient = clientX.getLocalClient();
IDfSessionManager sessionManager = dfClient.newSessionManager();
IDfLoginInfo loginInfo = clientX.getLoginInfo();
loginInfo.setUser("username");
loginInfo.setPassword("password");
sessionManager.setIdentity("repo", loginInfo);
IDfSession dfSession = sessionManager.getSession("repo");
System.out.println(dfSession);
IDfDeleteOperation delo = clientX.getDeleteOperation();
IDfCancelCheckoutOperation cco = clientX.getCancelCheckoutOperation();
try {
String dql = "select r_object_id from my_report where folder('/Home', descend);
IDfQuery idfquery = new DfQuery();
IDfCollection collection1 = null;
try {
idfquery.setDQL(dql);
collection1 = idfquery.execute(dfSession, IDfQuery.DF_READ_QUERY);
int i = 1;
while(collection1 != null && collection1.next()) {
String r_object_id = collection1.getString("r_object_id");
StringBuilder attributes = new StringBuilder();
IDfDocument iDfDocument = (IDfDocument)dfSession.getObject(new DfId(r_object_id));
attributes.append(iDfDocument.dump());
BufferedWriter writer = new BufferedWriter(new FileWriter("path to file", true));
writer.write(attributes.toString());
writer.close();
cco.setKeepLocalFile(true);
IDfCancelCheckoutNode cnode;
if(iDfDocument.isCheckedOut()) {
if(iDfDocument.isVirtualDocument()) {
IDfVirtualDocument vdoc = iDfDocument.asVirtualDocument("CURRENT", false);
cnode = (IDfCancelCheckoutNode)cco.add(iDfDocument);
} else {
cnode = (IDfCancelCheckoutNode)cco.add(iDfDocument);
}
if(cnode == null) {
System.out.println("Node is null");
}
if(!cco.execute()) {
System.out.println("Cancel check out operation failed");
} else {
System.out.println("Cancelled check out for " + r_object_id);
}
}
delo.setVersionDeletionPolicy(IDfDeleteOperation.ALL_VERSIONS);
IDfDeleteNode node = (IDfDeleteNode)delo.add(iDfDocument);
if(node == null) {
System.out.println("Node is null");
System.out.println(i);
i += 1;
}
if(delo.execute()) {
System.out.println("Delete operation done");
System.out.println(i);
i += 1;
} else {
System.out.println("Delete operation failed");
System.out.println(i);
i += 1;
}
}
} finally {
if(collection1 != null) {
collection1.close();
}
}
} catch(Exception e) {
e.printStackTrace();
} finally {
sessionManager.release(dfSession);
}
}
}
我不知道我在哪里犯了错误,每次尝试时,程序都会在第 50 次迭代时停止。你能帮我以正确的方式删除所有文件吗?非常感谢!
您可以直接从您的代码中执行此操作:
删除 my_report 个文件夹中的对象('/Home', descend)
无需再次获取您丢弃的信息 ;-)
首先select将所有文档ID例如List<IDfId>
并关闭集合。不要在打开的集合中执行其他昂贵的操作,因为这样你就不必要地阻塞了它。
这就是为什么它只做了 50 个文件的原因。因为您有一个主要打开的集合,每次执行删除操作都会打开另一个集合,它可能达到了某个限制。所以正如我所说,最好先使用集合,然后进一步处理这些数据:
List<IDfId> ids = new ArrayList<>();
try {
query.setDQL("SELECT r_object_id FROM my_report WHERE FOLDER('/Home', DESCEND)");
collection = query.execute(session, IDfQuery.DF_READ_QUERY);
while (collection.next()) {
ids.add(collection.getId("r_object_id"));
}
} finally {
if (collection != null) {
collection.close();
}
}
之后您可以遍历列表并对您需要的文档执行所有操作。但是不要在每次迭代中都执行删除操作——这是无效的。而不是将所有文档添加到一个操作中并在最后执行一次。
IDfDeleteOperation deleteOperation = clientX.getDeleteOperation();
deleteOperation.setVersionDeletionPolicy(IDfDeleteOperation.ALL_VERSIONS);
for (IDfId id : ids) {
IDfDocument document = (IDfDocument) session.getObject(id);
...
deleteOperation.add(document);
}
deleteOperation.execute();
IDfCancelCheckoutOperation
也是如此。
还有一件事 - 当您使用 FileWriter
时,请在 finally
块中使用 close()
或像这样使用 try-with-resources:
try (BufferedWriter writer = new BufferedWriter(new FileWriter("file.path", true))) {
writer.write(document.dump());
} catch (IOException e) {
throw new UncheckedIOException(e);
}
使用StringBuilder
是个好主意,但只在开始时创建一次,在每次迭代中追加所有属性,然后在最后将StringBuilder
的内容写入文件,不是在每次迭代期间 - 它很慢。
您可能面临 DFC 客户端的结果集限制。 尝试将这些行添加到 dfc.properties 并重新运行您的代码以查看是否可以删除超过 50 行,然后根据您的需要进行调整。
dfc.search.max_results = 100
dfc.search.max_results_per_source = 100