4

我有一个计划脚本,它执行一些计算并更新销售订单上的自定义标题字段,它每 30 分钟运行一次。

随着 Netsuite 中订单数量的增加,我开始收到错误消息“发生意外错误”

执行时间:677.15s 脚本使用:75 错误:SSS_INSTRUCTION_COUNT_EXCEEDED" 脚本执行指令计数超出。堆栈跟踪:已调度

请帮助我摆脱这个错误。

ps:上述问题没有套件答案。

4

3 回答 3

5

NetSuite 已建立内部机制来检测包含无限循环的“失控脚本”。一旦被捕获,这些脚本将被终止并抛出 SSS_INSTRUCTION_COUNT_EXCEEDED 错误消息。如果您收到此错误,NetSuite 建议您检查脚本中的 for 循环,以确保它们包含终止条件或可以满足的条件。

您可能还需要考虑以下几点

NetSuite 管理 nlapiLogExecution(type, title, details)

治理模型旨在防止不合理的过度日志记录,这可能会对共享同一数据库的其他 NetSuite 客户的性能产生负面影响。治理模型并不意味着影响正在nlapiLogExecution()适当使用的公司(或脚本)。

治理模式如下:

在 60 分钟的时间段内,允许公司在其所有脚本中对 nlapiLogExecution() 进行多达 100,000 次调用。

如果在 60 分钟内 NetSuite 检测到给定脚本的日志记录过多(并将公司逼近 100,000 次 nlapiLogExecution() 调用限制),NetSuite 会将违规脚本的日志级别更改为更高的级别。有问题的脚本将继续执行,但是,其日志级别将从 Debug 变为 Audit,或 Audit 变为 Error,或 Error 变为 Emergency,具体取决于脚本。

脚本执行日志的容量由同一数据库上的客户共享。为了进一步防止过多的日志记录,脚本执行日志受 NetSuite 数据库每个实例的总存储限制控制。在每台 NetSuite 服务器上,如果存储日志的数据库表达到此限制,则会清除所有日志(该服务器上的所有客户)。因此,NetSuite 建议您使用自定义记录来存储信息。

例子

ABC 公司在 60 分钟内运行了 10 个脚本。如果 10 个脚本中的一个调用

 nlapiLogExecution('DEBUG', 'My log', x.getID()) 

在仅 20 分钟的时间内完成 70,000 次,NetSuite 将提升脚本的日志级别。

日志级别的更改将出现在脚本的脚本部署页面的日志级别字段中(见图)。在下图中,如果违规脚本的 Log Level 最初设置为 Debug,NetSuite 会将日志级别提高到 Audit。这意味着读取的代码行

nlapiLogExecution('DEBUG', 'My log', x.getID()) 

将继续执行,但不会记录任何内容,因为脚本的日志级别已提升到审核。

通知脚本所有者

如果 NetSuite 检测到某个脚本的日志记录过多,则会通知该脚本的所有者。脚本所有者被警告该脚本是其公司的主要贡献者,可能超过 100,000 个日志记录阈值(对于给定的 60 分钟时间段)。

NetSuite 通过电子邮件发送通知并将日志条目添加到脚本的执行日志中。电子邮件和 NetSuite 生成的日志都会提醒脚本所有者脚本的日志级别已提高。

参考:Netsuite帮助中心[脚本日志治理]

于 2016-02-19T05:17:28.053 回答
5

NetSuite 中没有适当的文档说明允许的脚本行数。正如@rockstar 所说

NetSuite 已建立内部机制来检测包含无限循环的“失控脚本”

我遇到了同样的错误,即使没有任何无限循环。

您应该采取的第一种方法是尝试通过减少循环数或不必要的脚本语句来优化您的脚本。

如果这不可能或仍然没有帮助,您可以yield在处理一定数量的数据后重新设置脚本语句的使用情况。

于 2016-02-19T05:41:03.167 回答
1

如果循环中有一些需要很长时间才能完成的逻辑,我通常会收到此错误。另一个常见的原因是无限循环。

于 2016-02-19T05:01:06.587 回答