【问题标题】:Why won't scheduled Notes Agent run为什么计划的 Notes 代理不运行
【发布时间】:2015-06-25 09:52:21
【问题描述】:

我开发了一个 Notes 代理,它可以根据某些标准交叉匹配数据库中的文档。我们有一个开发服务器、一个训练服务器和一个实时服务器,每个服务器都在运行相关应用程序的一个实例。当我们手动运行代理时,代理完全符合我们对所有三个实例的要求。当在开发和训练服务器上安排特定时间时,代理也可以正常运行。但是,当我们在 Live 服务器上调度代理时,它不会运行,并且日志仅说明以下内容;

“代理管理器:数据库'PBT\PBTLive.nsf'中的代理'MatchingAlert|MatchingAlert'超出执行时间限制。代理签名者'Application Development/IT/************** *'"

所有三台服务器的设置似乎完全相同。此外,我已将文档从 Live 转移到 Development 实例,它仍然按计划在 Development 实例上运行,因此它不可能在 Live 实例中处理更多文档。那么是什么原因造成的呢?

编辑:刚刚发生的事情值得一提。我们希望 Train 实例与 Live 实例具有完全相同的文档,因此我实际上删除了 Train 实例并使用 Live 实例作为模板制作了它的新副本,现在调度的代理没有运行并显示相同的输出日志作为 Live 实例,所以它必须与 Live 实例而不是 Live 服务器有关,但它会是什么?

【问题讨论】:

  • 到目前为止的答案是正确的 - 您的代理正在超时。你的任务是弄清楚是什么花费了这么多时间。代理是做什么的?它是否调用 NotesDatabase.search()?它是否通过视图访问文档?是否有任何视图在其公式中具有日期/时间依赖性?

标签: lotus-notes lotusscript


【解决方案1】:

根据日志条目,代理运行但需要很长时间才能完成任务。

也许

  • Server 文档中的“Max. LotusScript/Java execution time”太短或
  • 您没有足够的权限作为生产服务器上的“应用程序开发/IT/***************”签名者,代理浪费时间尝试再次访问某些内容,并且再次。

确保代理的签名者拥有执行代理所需的所有权利。

【讨论】:

  • 感谢您的回复。我们的基础架构团队表示,所有三台服务器上的 Max time 相同,并且当所有 Live 文档都放置在开发实例中时,时间表就会运行 - 尽管 Live 服务器中还有更多工作 - 但我们的基础架构人员坚持认为这不是问题。另外,我已经编辑了我的问题,因为发生了一些相关的事情
  • 使用 server-id 或 administrator-id 对代理和所有其他设计元素进行签名是否有效?
  • @KnutHermann 向 dubug 插入语句。代理处理三个视图。前两个视图似乎运行良好,因为正在处理的这两个视图中的每一个都输出了调试消息。第三个视图通过一个外循环和一个内循环交叉检查某些标准的文档。这第三个视图开始处理,因为在开始时输出调试但随后发生超时。认为我们可以排除签名和权限,因此将考虑增加 Live 服务器的“Max”。代理不使用 NotesDatabase.search() 或 ftsearch() 调用
  • 确保第三个视图在选择公式中没有 @Now 或 @Today 并使用 view.AutoUpdate = False 处理视图。
  • 不,我不在任何视图选择公式中使用“现在”或“今天”,实际上第三个视图只是基于字段。同样在代理代码中,我不使用 getnthDocument,我在循环开始之前使用 getFirstdocument,在每个循环结束时使用 getNextDocument。我会调查“view.AutoUpdate = False”。该参数是否会在代理询问视图期间停止修改视图?
【解决方案2】:

日志条目非常清楚地说明了问题所在:代理运行的时间超过了允许的运行时间。 最佳实践是向您的代理添加一些日志记录。

首先我会检查代理在您的测试环境中运行了多长时间(成功运行后右键单击代理并检查日志)。

如果该时间快到足以在时间限制内完成(例如,运行 12 分钟并且服务器配置为允许最多 15 分钟),那么在负载较重的服务器上运行代理可能足以超过时间限制。

另外:通常最大代理运行时间有两种不同的设置,“白天参数”和“夜间参数”。 如果一个代理在夜间运行,它通常比白天有更多的允许运行时间。

根据您使用的代码,代理在一个数据库实例上的运行时间比在另一个数据库实例上运行时间更长的原因可能有多种(即使在同一台服务器上)。

例如:

  • 如果您浏览视图,该视图可能不是最新的,必须先构建。这可能会在频繁使用的服务器上花费大量时间
  • 连接到另一个数据库可能曾经被认为是一个“本地”调用,而在另一台服务器上它是一个“远程”调用。同样,这可能会产生巨大的影响
  • 由于地址簿不同,在一种情况下,代理的签名者可能只看到很少的文档,而在另一种情况下可以看到所有文档
  • 在没有现有全文的情况下使用任何 FTSearch- 方法 ...
  • 使用NotesDocumentCollection.getNthDocument() 会导致巨大的性能问题 ...

这一切都是在不知道您的代码的情况下猜测。您的问题的原因很可能取决于您的代码。

同样的建议:在你的代码中建立一些“日志”:让它“告诉”你,它在哪里,它已经做了什么。让它输出运行时... 然后你会看到,你的生产环境在哪里浪费了时间。

【讨论】:

  • 具体来说,我建议在打开任何数据库、访问任何视图、执行任何 NotesDatabase.search() 或 ftsearch() 调用之前和之后立即添加一些日志记录。 LotusScript 中的 print 语句或 Java 中的 System.out.println 足以满足此目的),但请记住在解决问题后将它们注释掉。
  • 插入语句到 dubug。代理处理三个视图。前两个视图似乎运行良好,因为正在处理的这两个视图中的每一个都输出了调试消息。第三个视图通过一个外循环和一个内循环交叉检查某些标准的文档。这第三个视图开始处理,因为在开始时输出调试但随后发生超时。认为我们可以排除签名和权限,因此将考虑增加 Live 服务器的“Max”。代理不使用 NotesDatabase.search() 或 ftsearch() 调用
  • 所以这是我列表中的第一点。但是你不使用NotesDocumentCollection.getNthDocument()是吗?
  • @TorstenLink 不,我不在任何视图选择公式中使用“现在”或“今天”,实际上第三个视图只是基于字段。同样在代理代码中,我不使用 getnthDocument,我在循环开始之前使用 getFirstdocument,在每个循环结束时使用 getNextDocument。您在上一个列表中的第一点 - 避免这种情况会使代理代码比我假设的更高效吗?这与使用“view.AutoUpdate = False”的 Knuts 建议相同吗
  • 如果您在代理中操作文档,则必须使用 AutoUpdate = False,否则每次文档更改后视图都会更新,并且您可能会收到“条目不在视图中”之类的错误。 ..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
相关资源
最近更新 更多