我创建了2个代理,一个由Java构成,另一个由Lotusscript构成。 java代理程序计划每5分钟运行一次,而lotusscript代理程序计划每15分钟运行一次。因此,有一段时间他们将同时运行。当发生这种情况时,java代理必须暂停/等待,直到lotusscript代理完成。我尝试使用Profile DOcuments和Environment Variables来模拟锁定,但无济于事。有没有办法可以模拟这两种不同代理之间的锁定?请帮忙。非常感谢!
编辑:我忘了说两个代理商驻留在两个不同的数据库中,使事情变得更复杂:(
答案 0 :(得分:6)
为什么不编写第三个代理(可能在额外的数据库中),每五分钟定期运行一次,启动另外两个代理:
...然后你也可以控制运行顺序,没有任何复杂的锁定机制。
答案 1 :(得分:4)
这是一种近乎万无一失的方法,我发现它可用于控制独立代理的执行顺序。我使用真正的笔记文档作为伪锁文件。
之前我这样做的方法是保留一个表示“锁定”的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”值。您只需要1个文档,因此您只需要从视图中获取第一个文档。
在LotusScript代理中添加等效逻辑应该更简单。我能找到的唯一不足之处是java代理可能无法执行代码,因为控制文档尚未设置为“go”而“IF”测试在没有运行逻辑的情况下失败,因此它不是暂停,而是阻止Java代理使用lotusscript代理执行它所需的顺序。但是如果LotusScript代理已经发布它,它将在下一个计划实例上触发。
您还可以通过使用特定值(如“RunAgent1”,“RunAgent2”)来扩展此想法以管理一组代理甚至链接多个代理,另一个好处是您还可以捕获执行开始时间,错误以及或者你需要的任何东西......
答案 2 :(得分:1)
在数据库中启用文档锁定可能有效。如果您可以在数据库本身中启用文档锁定,则可以让代理程序锁定特定文档,并在运行代码之前/期间检查文档是否已锁定。
如果在该数据库中启用文档锁定不是一个选项,您可以考虑创建一个单独的数据库来存储该文档。
为什么这些代理不能同时运行?也许可以在允许代理同时运行的同时实现相同的结果。试图以这种方式控制代理通常会导致其他问题。如果数据库具有副本,则解决方案可能会中断。
答案 3 :(得分:0)
你说这是两个数据库,但到目前为止,阻止代理同时运行的最简单方法是将它们放在同一个数据库中。我经常会创建一个特殊的数据库,它只包含代理生成的代理和日志文档。代理可以打开任何数据库,因此无论它们在哪里都无关紧要。
我还领导了一个项目,我们为代理构建了自己的控制机制,这是giulio和spookycoder的想法的结合。只安排了一个“主”代理,它读取控制文档以决定下一个应运行的代理。假设我们有代理A,B和C.主服务器运行A,它立即更新控制文档以说“我正在运行”,然后它随着进程信息更新字段,最后完成时使用“B”更新控制文档。下次主控运行时,它会查看控制文档。如果进度信息显示A已完成,则主人将看到轮到B运行。当然,A可能会意识到B没有工作要做,所以它可能会写“C”,在这种情况下,主机将运行C.如果进度信息显示,主机也可以选择重新运行A.它没有完成这项工作。