这是我发现的一种近乎万无一失的方法,可用于控制独立代理的执行顺序。我使用真实的笔记文档作为伪锁定文档。
我之前这样做的方法是保留一个代表“锁”的 Notes 文档。不要使用数据库配置文件,因为它容易出现复制/保存冲突问题,并且您无法在视图中查看它。
“锁定”文档上可以有一个标志,告诉 java 代理现在是否允许运行。Java 代理只是在其中包含与此类似的代码
Session s = NotesFactory.createSession();
Database db = s.getDatabase("This Server", "This database");
View vw = db.getView("(lockView)");
Document docControl = vw.getFirstDocument();
String sRunStatus = docControl.getItemValueString("runStatus");
boolean bContinue = false;
if (sRunStatus =="Go"){
bContinue = true;
}
if(bContinue){
//do agent code here....
// reset the status to "wait". The lotusscript agent should then set it to "Go"
// the other agent will execute on "wait" and then update the status to "Go" on
// completion to prevent simulatenous execution. Can also use different state names
// instead of go/wait, like run0, run1, run2 etc
docControl.replaceItemValue("runStatus", "wait");
docControl.save(true);
}
请注意,您使用代理在控制文档的“runStatus”字段中设置“Go”/“wait”值。您只需要一个文档,因此您只需将第一个文档移出视图即可。
在 LotusScript 代理中添加等效逻辑也应该更简单。我能找到的唯一缺点是 java 代理可能不会执行代码,因为控制文档尚未设置为“go”并且“IF”测试在没有运行逻辑的情况下失败,所以它不是这样的暂停,而是防止Java 代理与 lotusscript 代理的执行顺序不一致。但是,如果 LotusScript 代理已释放它,它将在下一个计划实例上触发。
您还可以将此想法扩展为管理一组代理,甚至还可以通过使用“RunAgent1”、“RunAgent2”等特定值来链接多个代理,另一个好处是您还可以捕获执行开始时间、错误或任何内容你需要……