Netsuite 中的脚本执行指令计数超出错误

Vij*_*shi 4 javascript netsuite suitescript

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

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

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

请帮助我摆脱这个错误。

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

Roc*_*tar 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 公司有 10 个脚本在 60 分钟内运行。如果 10 个脚本中有一个调用

 nlapiLogExecution('DEBUG', 'My log', x.getID()) 
Run Code Online (Sandbox Code Playgroud)

在仅 20 分钟的时间内执行 70,000 次,NetSuite 将提高脚本的日志级别。

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

nlapiLogExecution('DEBUG', 'My log', x.getID()) 
Run Code Online (Sandbox Code Playgroud)

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

通知脚本所有者

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

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

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


pra*_*sun 5

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

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

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

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

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