1

在我的 Lotus Notes 工作流应用程序中,我有一个预定的服务器代理(每五分钟一次)。当用户对文档进行操作时,也会触发服务器端代理(该代理修改所述文档,服务器端)。在生产过程中,我们收到很多投诉说加工不完整或有时根本没有加工。我检查了服务器配置,发现只有 4 个代理可以同时运行。作为一个拥有超过 50,000 个用户的全球应用程序,我唯一可以归咎于这些问题的是代理运行的数量,但我不确定我是否正确(我是一名开发人员,对这些东西缺乏了解) . 有人可以帮我找出我的推理是否正确(在同时代理上)并帮助我了解如何解决这个问题吗?你能给我提供参考吗?先感谢您!

4

1 回答 1

4

重要的事情要记住。

服务器上的计划代理将在任何给定时间仅从同一数据库运行一个代理!

因此,如果您的数据库 A 带有代理 X(5 分钟)和 Y(10 分钟)。它将首先运行 X。一旦 X 完成,下一个计划(X 或 Y)将运行。如果它们在同一个数据库中,它将永远不会让您同时运行 X + Y。

这是旨在阻止数据库代理中可能出现的死锁的行为。

此外,您还有一个调度队列,该队列将对可以调度的代理数量进行限制。例如,如果您每 5 分钟有一次代理 X,但需要 10 分钟才能完成,您的计划队列将慢慢填满,然后用完空间。

那么如何解决这个问题呢?有几种方法。

选项 1:使用服务器上的程序文档。

将代理设置为计划的“从不”,并让程序文档使用命令执行代理。

tell amgr run "dir/database.nsf" 'agentName' 

亲:

  1. 您将能够在不到 5 分钟的时间内运行代理。
  2. 您可以在同一个数据库中运行多个代理。

缺点:

  1. 您必须了解代理正在与什么进行交互,并为其编写代码以处理同时运行的其他代理或自身。
  2. 这样做可能会对性能产生严重影响。您需要了解服务器中正在发生的事情以及它将如何影响它。
  3. 如果您有很多数据库,那么您的程序文档列表就会很混乱并且难以维护。
  4. 如果超过服务器上允许的代理执行时间,通过“Tell AMGR”的代理将不会被终止。他们必须被手动杀死。
  5. 有一种简单的方法可以确定哪些代理正在运行/运行。

选项 2:创建一个调用 Web 代理的代理。

亲:

  1. 您将能够在不到 5 分钟的时间内运行代理。
  2. 您可以在同一个数据库中运行多个代理。
  3. 您可以更好地控制通过另一个代理运行的内容。

缺点:

  1. 您需要在服务器上运行 HTTP。
  2. 这样做会影响性能,并且您需要再次了解如果运行多个实例或其他代理,它将如何与系统交互。
  3. 如果超过服务器上允许的代理执行时间,代理将不会被终止。
  4. 您将需要在服务器上允许并发 Web 代理/Web 服务,否则您可能会挂起服务器。

选项 3:从预定触发器更改为另一个触发器。

例如“当新邮件到达时”。总的来说,这是三者中更好的选择。

...

最后,我想说的是,如果可以的话,您应该很少使用“每 5 分钟执行一次”,除非它是一个不会由多个用户跨不同数据库执行的关键代理。

于 2013-01-17T15:22:35.347 回答