脚本编制最佳实践
脚本语言使您能够使用 Python JavaScript, 或任何其他JSR223-compliant脚本语言扩展 Maximo® Manage业务逻辑。 所有脚本代码都编译为 Java™ 字节码,并作为 Maximo Manage 运行时高速缓存的一部分进行高速缓存。 启动脚本时,它是 Java 虚拟机使用 JSR223 网桥运行的高速缓存字节码。 由于脚本代码与其他以 Java 编写的 Maximo Manage 业务逻辑在同一线程中运行,因此编写不好的脚本代码会对系统性能产生负面影响。 遵循 Maximo Manage 性能准则,因为脚本编制等同于 Maximo Manage 定制代码。 我们不支持在脚本中导入任何 Python 模块(.py)。 我们建议改用内置的 Java 库和 Maximo SDK。
选择正确的启动点和活动
thisvalue 是当前属性 init 值:if priority is not None:
thisvalue=2*priority仅当代码或用户界面引用此属性时, MBO 框架才会启动此脚本。
if service.getMbo().getString("status")=="APPR":
evalresult=False
evalresult=True如果从 "列表" 选项卡调用,请避免代价高昂的对象初始化事件
from psdi.common.context import UIContext
if UIContext.getCurrentContext() is not None and UIContext.isFromListTab()==False:
..costly initialization..注意有冲突的启动点事件脚本
脚本编制框架允许您将多个脚本附加到同一启动点事件。 如果脚本代码期望在同一启动点事件中的某些其他脚本之前或之后按特定顺序运行该脚本,那么这会产生问题。 由于 Maximo 事件主题是无序映射,因此将在没有固定顺序的情况下触发事件。 如果未正确管理订单依赖关系,那么这可能会导致问题。 您应该评估为同一启动点事件附加多个脚本的原因,并评估将这些脚本组合到一个脚本中是否更有意义。 另一个选项是确保脚本之间没有依赖关系。
避免在事务中间调用保存
mbo.getMXTransaction().add(<newly created a mboset>)多次调用 MboSet.count ()
cnt = mboset.count()
if cnt<=1:
service.log(“skipping this as count is “+cnt)if mboset.count()<=1:
service.log(“skipping this as count is “+mboset.count())关闭 MboSet
try:
..some code..
finally:
mboset.cleanup()如果不清除 MboSets, ,可能会出现内存不足的错误。
避免使用 Nashorn 的 Mozilla 兼容性脚本
出于性能原因,建议从 Rhino 和 Java 7 移至 Nashorn 和 Java 8。 与 Rhino 相比, Nashorn 在 Java 8 中的性能更好。 将 Mozilla 兼容性脚本与 Nashorn 配合使用可能会导致 Java 8 性能低下。
在日志记录之前检查是否启用了日志记录
service.log("count of mbos "+mboset.count())不幸的是,此代码会导致调用 mboset.count() ,即使已禁用脚本日志记录也是如此。
from psdi.util.logging import MXLoggerFactory
logger = MXLoggerFactory.getLogger("maximo.script");
debugEnabled = logger.isDebugEnabled()
if debugEnabled:
service.log("count of mbos "+mboset.count())service 变量中的以下函数使您能够检查是否启用了日志记录:if service.isLoggingEnabled():
service.log(“count of mbos “+mboset.count())避免访问脚本缓存
从自动化脚本代码访问脚本缓存会导致循环依赖,并导致脚本缓存加载(即部分加载)时不稳定。 编写脚本时,请使用库脚本进行模块化脚本开发,从而避免从缓存中访问脚本。