【问题标题】:Maximo Assetspec automation script slowness and errorMaximo Assetspec 自动化脚本缓慢和错误
【发布时间】:2015-10-14 20:54:52
【问题描述】:

下面是我的自动化脚本,它是资产加载过程的第二部分。第一部分在从外部系统创建资产时将属性数据加载到资产,但它还设置了 CLASSIFICATIONID,它在触发以下脚本的 ASSETSPEC 表中创建记录:

from psdi.mbo import MboConstants
from psdi.server import MXServer
from psdi.security import UserInfo

username = "maxadmin"

mxServer = MXServer.getMXServer()
userInfo = mxServer.getUserInfo(username)

if mbo != None:
    mxAssetSpec = mbo

    AssetNum = mxAssetSpec.getString("assetnum")
    SiteID = mxAssetSpec.getString("siteid")

    gisAssetSet = mxServer.getMboSet(FEATURECLASS, userInfo)
    gisAssetSet.setWhere("mxassetnum = '" + AssetNum + "' and mxsiteid = '" + SiteID + "'")
    gisAssetSet.reset()

    gis = gisAssetSet.getMbo(0)

    if FEATURECLASS == "GRAVITYSEWERLINES":
        if ASSETATTRID == 'MATERIAL':
            mxAssetSpec.setValue("alnvalue", gis.getString("material"))
            mxAssetSpec.setValue("startmeasure", '0')
            mxAssetSpec.setValue("endmeasure", gis.getString("length_"))
            mxAssetSpec.setValue("startmeasureunitid", 'FT')
            mxAssetSpec.setValue("endmeasureunitid", 'FT')
        if ASSETATTRID == 'LENGTH':
            mxAssetSpec.setValue("numvalue", gis.getString("length_"))
            mxAssetSpec.setValue("startmeasure", '0')
            mxAssetSpec.setValue("endmeasure", gis.getString("length_"))
            mxAssetSpec.setValue("startmeasureunitid", 'FT')
            mxAssetSpec.setValue("endmeasureunitid", 'FT')
        if ASSETATTRID == 'INSTALL':
            mxAssetSpec.setValue("alnvalue", gis.getString("instalyear"))
            mxAssetSpec.setValue("startmeasure", '0')
            mxAssetSpec.setValue("endmeasure", gis.getString("length_"))
            mxAssetSpec.setValue("startmeasureunitid", 'FT')
            mxAssetSpec.setValue("endmeasureunitid", 'FT')
        if ASSETATTRID == 'ESTYEAR':
            mxAssetSpec.setValue("alnvalue", gis.getString("est_year"))
            mxAssetSpec.setValue("startmeasure", '0')
            mxAssetSpec.setValue("endmeasure", gis.getString("length_"))
            mxAssetSpec.setValue("startmeasureunitid", 'FT')
            mxAssetSpec.setValue("endmeasureunitid", 'FT')
        if ASSETATTRID == 'PDIAM':
            mxAssetSpec.setValue("numvalue", gis.getString("diameter"))
            mxAssetSpec.setValue("startmeasure", '0')
            mxAssetSpec.setValue("endmeasure", gis.getString("length_"))
            mxAssetSpec.setValue("startmeasureunitid", 'FT')
            mxAssetSpec.setValue("endmeasureunitid", 'FT')

    mxAssetSpec.save()
    mxAssetSpec.close()
    mxAssetSpec.resetForRefreshOnSave()

else:
    raise UnboundLocalError

它循环遍历大约 8 个分类属性。脚本本身运行非常快,但每个分类属性之间有大约 3 秒的停顿。而且我还收到一个 oracle 错误:

java.sql.SQLException: ORA-00904: "ASSETNUM": 标识符无效

我引用 ASSETNUM 的唯一地方是当我从 ASSETSPEC MBO 检索字符串时,assetnum 是其属性,所以我很困惑为什么会收到此错误。

我的问题是,为什么我会收到无效标识符错误,为什么会有暂停,它们是否连接?

脚本大约需要 20 秒才能完成并且工作正常,但 20 秒大约 19 秒太长了。任何帮助,将不胜感激。任何关于如何改进代码的 cmets 都将不胜感激。

谢谢!

if mbo != None:
mxAssetSpec = mbo

mxAssetSet = mxAssetSpec.getMboSet("ASSET")
mxAsset = mxAssetSet.getMbo(0)
featureclass = mxAsset.getString("PLUSSFEATURECLASS")
assetattrid = mxAssetSpec.getString("ASSETATTRID")

print(featureclass)
print(assetattrid)

if featureclass == "GRAVITYSEWERLINES":
    gisAssetSet = mxAssetSpec.getMboSet("SPATIAL_GRAVITYSEWERLINES")
    gis = gisAssetSet.getMbo(0)
    length = gis.getString("length_")
    if assetattrid == 'MATERIAL':
        mxAssetSpec.setValue("alnvalue", gis.getString("material"))
        mxAssetSpec.setValue("startmeasure", '0')
        mxAssetSpec.setValue("endmeasure", length)
        mxAssetSpec.setValue("startmeasureunitid", 'FT')
        mxAssetSpec.setValue("endmeasureunitid", 'FT')
    if assetattrid == 'LENGTH':
        mxAssetSpec.setValue("numvalue", gis.getString("length_"))
        mxAssetSpec.setValue("startmeasure", '0')
        mxAssetSpec.setValue("endmeasure", length)
        mxAssetSpec.setValue("startmeasureunitid", 'FT')
        mxAssetSpec.setValue("endmeasureunitid", 'FT')
    if assetattrid == 'INSTALL':
        mxAssetSpec.setValue("alnvalue", gis.getString("instalyear"))
        mxAssetSpec.setValue("startmeasure", '0')
        mxAssetSpec.setValue("endmeasure", length)
        mxAssetSpec.setValue("startmeasureunitid", 'FT')
        mxAssetSpec.setValue("endmeasureunitid", 'FT')
    if assetattrid == 'ESTYEAR':
        mxAssetSpec.setValue("alnvalue", gis.getString("est_year"))
        mxAssetSpec.setValue("startmeasure", '0')
        mxAssetSpec.setValue("endmeasure", length)
        mxAssetSpec.setValue("startmeasureunitid", 'FT')
        mxAssetSpec.setValue("endmeasureunitid", 'FT')
    if assetattrid == 'PDIAM':
        mxAssetSpec.setValue("numvalue", gis.getString("diameter"))
        mxAssetSpec.setValue("startmeasure", '0')
        mxAssetSpec.setValue("endmeasure", length)
        mxAssetSpec.setValue("startmeasureunitid", 'FT')
        mxAssetSpec.setValue("endmeasureunitid", 'FT')

    mxAssetSpec.save()

其他: 引发 UnboundLocalError

【问题讨论】:

    标签: oracle automation jython maximo


    【解决方案1】:

    我尝试重写您的代码,删除 ifs 并改用 elifs 来减少冗余。不过,如果我在您的位置,我会使用 ASSET 作为主要 mbo,并使用自定义 getMboSets 来访问每个 ASSETSPEC mbo,以便不会针对每个 SPEC 记录对 ASSET 表运行 sql 命令 5 次。如果这两种方法都不起作用,最好在晚上使用升级和操作启动点运行您的代码。 顺便说一句,如果你使用 getMboSets,你也不需要运行 .save()。

    mxAssetSpec = mbo
    mxAsset = mxAssetSpec.getMboSet("ASSET").moveFirst()
    featureclass = mxAsset.getString("PLUSSFEATURECLASS")
    assetattrid = mxAssetSpec.getString("ASSETATTRID")
    
    if featureclass == "GRAVITYSEWERLINES" and assetattrid in ["MATERIAL","LENGTH","INSTALL","ESTYEAR","PDIAM"]:
        gis = mxAssetSpec.getMboSet("SPATIAL_GRAVITYSEWERLINES").moveFirst()
        if gis is not None:
            length = gis.getString("length_")
            if assetattrid == "MATERIAL":
                mxAssetSpec.setValue("alnvalue", gis.getString("material"))
            elif assetattrid == "LENGTH":
                mxAssetSpec.setValue("numvalue", length)
            elif assetattrid == "INSTALL":
                mxAssetSpec.setValue("alnvalue", gis.getString("instalyear"))
            elif assetattrid == "ESTYEAR":
                mxAssetSpec.setValue("alnvalue", gis.getString("est_year"))
            elif assetattrid == "PDIAM":
                mxAssetSpec.setValue("numvalue", gis.getString("diameter"))
            mxAssetSpec.setValue("startmeasure", "0")
            mxAssetSpec.setValue("endmeasure", length)
            mxAssetSpec.setValue("startmeasureunitid", "FT")
            mxAssetSpec.setValue("endmeasureunitid", "FT")
    

    【讨论】:

      【解决方案2】:

      这里有一些提高脚本性能的想法。我将把它们作为一般规则给出,然后举例说明如何应用它们。

      规则:不要在你的脚本中做你可以让 Java 做的事情,因为编译后的 Java 比你的脚本快。

      应用程序:我不会从 mxserver 获取 gisAssetSet,而是将关系放在 AssetSpec 上并通过 mbo.getMboSet("relationship") 使用它。这让 Java 进行字符串操作,而拥有事务进行保存。

      规则:设置和拆卸成本高昂,因此请尽可能减少并避免它们。

      应用程序 1:我假设您正在使用对象启动点。尽可能使用对象事件条件来防止脚本在不应该运行时运行。这样可以避免设置和拆卸。

      应用 2:不要在启动点上使用绑定变量,而是使用 mbo.get 方法。每个绑定的 Launch Point 变量会产生大约 5 个额外的相关变量,这会增加设置和拆卸时间。您可以在 Scripting with Maximo 中阅读有关隐式变量的更多信息。

      规则:不要为同一个属性调用 mbo.getWhatever() 两次。

      应用程序:在某些情况下,您会连续调用 getString("length_")。我认为如果您调用一次,将返回值缓存在变量中,然后多次使用该变量,您的代码会执行得更好。

      就您收到的 Oracle 错误而言,我觉得我没有足够的信息。是否有其他脚本或交叉等在起作用?换个说法,你怎么知道这个错误是由这个脚本引起的?

      希望对你有帮助。

      【讨论】:

      • 我在上面添加了新代码,但每个资产规范属性之间仍有大约 3 秒的暂停。如果在 16 毫秒内触发脚本本身,但每个资产规范属性的触发之间的时间约为 3 秒。此脚本是加载过程的第二部分。第一个脚本复制属性信息并设置 CLASSIFICATIONID,然后触发此脚本。
      • 不要调用 mxAssetSpec.save()。通常,如果您从 MXServer 获取 MboSet,您应该只在 MboSet 上调用 save()。
      • 另外,就编码风格而言,我倾向于不将 mbo 别名为 mxAssetSpec。对我来说,仅将其称为“mbo”会提醒我它是由 Maximo 提供的,并且可能指代不同的对象,具体取决于启动点。
      • 谢谢,但它仍然在每个资产属性之间暂停大约 3 秒。代码本身运行得非常快,但系统实际上似乎在每个属性之间暂停了大约 3 秒。它在每个assetspec 属性的代码中运行。我有一个演示系统,我也可以对其进行测试。我会试试看我是否得到相同的结果
      • 即使您的代码中没有 save() 调用,暂停仍然发生吗?
      猜你喜欢
      • 2015-06-10
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 2011-09-22
      • 1970-01-01
      相关资源
      最近更新 更多