3

我创建了 2 个代理,一个由 Java 制成,另一个由 Lotusscript 制成。java 代理每 5 分钟运行一次,而 lotusscript 代理每 15 分钟运行一次。因此,它们将同时运行。发生这种情况时,java 代理必须暂停/等待,直到 lotusscript 代理完成。我尝试使用 Profile DOcuments 和 Environment Variables 来模拟锁定,但无济于事。有没有一种方法可以模拟这两个不同代理之间的锁定?请帮忙。非常感谢!

编辑:我忘了说这两个代理驻留在两个不同的数据库中,使事情变得更加复杂:(

4

4 回答 4

6

为什么不编写第三个代理(可能在一个额外的数据库中),它每五分钟定期运行一次,它会启动其他两个代理:

  1. Lotus Script Agent 每次
  2. Java 代理每运行三次

...那么您也可以控制运行顺序,而无需任何复杂的锁定机制。

于 2011-09-07T15:55:53.517 回答
4

这是我发现的一种近乎万无一失的方法,可用于控制独立代理的执行顺序。我使用真实的笔记文档作为伪锁定文档。

我之前这样做的方法是保留一个代表“锁”的 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”等特定值来链接多个代理,另一个好处是您还可以捕获执行开始时间、错误或任何内容你需要……

于 2011-09-07T07:20:51.517 回答
1

在数据库中启用文档锁定可能会起作用。如果您可以在数据库本身中启用文档锁定,您可以让代理锁定特定文档并检查文档在运行代码之前/期间是否被锁定。

如果在该数据库中启用文档锁定不是一个选项,您可以考虑创建一个单独的数据库来存储文档。

为什么这些代理不能同时运行?也许可以在允许代理同时运行的同时实现相同的结果。试图以这种方式控制代理通常会导致其他问题。如果数据库有副本,则解决方案可能会中断。

于 2011-09-07T07:09:35.283 回答
0

你说它是两个数据库,但到目前为止,阻止代理同时运行的最简单方法是将它们放在同一个数据库中。我会经常创建一个仅包含代理和代理生成的日志文档的特殊数据库。代理可以打开任何数据库,因此它们在哪里并不重要。

曾经我还领导过一个项目,在该项目中,我们为代理建立了自己的控制机制,它结合了 giulio 和 spookycoder 的想法。只安排了一个“主”代理,它读取控制文档来决定接下来应该运行哪个代理。假设我们有代理 A、B 和 C。主机运行 A,它会立即更新控制文档以说“我正在运行”,然后它会使用其进度信息更新字段,最后当它完成时使用“B”更新控制文档,下次主运行时,它会查看控制文档。如果进度信息显示A已经完成,master会看到轮到B运行了。当然,A 可能会意识到 B 没有工作要做,所以它可能改写为“C”,

于 2011-09-21T21:09:53.157 回答