我创建了两个代理,一个由Java组成,另一个由Lotusscript组成。java代理计划每5分钟运行一次,而lotusscript代理计划每15分钟运行一次。因此,它们将同时运行的时刻将会到来。当发生这种情况时,java代理必须暂停/等待,直到lotusscript代理完成。我尝试使用Profile、DOcuments和环境变量来模拟锁定,但是没有效果。有没有一种方法可以模拟这两个不同代理之间的锁定?请帮帮忙。非常感谢!
编辑:我忘了说这两个代理驻留在两个不同的数据库中,更复杂的是:(
发布于 2011-09-07 23:55:54
为什么不编写第三个代理(可能在额外的数据库中),它每五分钟定期运行一次,从而启动其他两个代理:
..。然后,您还可以控制运行顺序,而不需要任何复杂的锁定机制。
发布于 2011-09-07 15:20:52
这是我发现的一种几乎万无一失的方法,可以控制独立代理的执行顺序。我使用一个真实的notes文档作为一个psuedo-lock文档。
我以前做过的方法是保留一个表示“锁”的Notes文档。不要使用数据库配置文件文档,因为它容易出现复制/保存冲突问题,并且您无法在视图中查看它。
"lock“文档可以在其上有一个标志,该标志告诉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”)来链接多个代理,另一个好处是您还可以捕获执行开始时间、错误或任何您需要的东西……
发布于 2011-09-07 15:09:35
在数据库中启用文档锁定是可行的。如果可以在数据库本身中启用文档锁定,则可以让代理锁定特定的文档,并在文档运行代码之前/期间检查文档是否被锁定。
如果不能在数据库中启用文档锁定,可以考虑创建一个单独数据库来存储文档。
为什么这些代理不能同时运行?也许可以在允许代理同时运行的同时实现相同的结果。试图以这种方式控制代理通常会导致其他问题。如果数据库有副本,则解决方案可能会中断。
https://stackoverflow.com/questions/7329503
复制相似问题