以下类支持 ESI 响应生成功能:
ESIResponseGenerator
此类用来实现接口 java.lang.Runnable。此类的 run() 方法提供了为给定版本创建所需数量的 ESITransaction 对象、根据需要链接各种对象、生成 ESI 响应消息并将这些消息传送到相应目标位置所需的全部逻辑。此类是 com.ptc.windchill.esi.txn 包的一部分。
当用户从 Windchill PDMLink 发布对象时,启动的 RTM 工作流会执行发布前验证,然后调用 StandardESIService 的 release() 方法。此方法可创建 wt.session.SessionThread 实例以封装 ESIResponseGenerator 实例。ESIRelease 对象的句柄是 ESIResponseGenerator 的属性之一 - 该对象要么是 (首次发布对象时) 新创建的对象,要么是 (重新提交 "ESI failure" 时) 已与发布中的主要业务对象关联的对象。然后,发布方法会启动新创建的线程,并将 ESIRelease 对象返回到工作流。然后,暂停的工作流等待从 ESIReleaseUtility 的 postEvent() API 中分配的 "ESI Release Complete" 事件。
* 
默认情况下,RTM 工作流监听与 ESIRelease 对象关联的 ESI release complete 事件。有关详情,请参阅 ESIResultEvent 和 ESIRelease 各节。
在新启动的线程中执行的 run() 方法可执行所有有用工作,比如创建 ESITransaction 对象、根据需要将这些对象关联到其他对象、为发布中的每个目标位置生成 ESI 响应以及将 ESI 响应发送至相应的目标位置。如果已知发布中的某个事务处理已失败,或发布中的所有事务处理均已成功完成,则调用 postEvent() API。此 API 会激发 "ESI Release Complete" 事件,由此导致暂停的 RTM 工作流继续然后正常终止,并标记发布结束。
此类可由自定义者扩展。发布新类型的对象时,扩展特别有用。
在创建 ESIResponseGenerator 的自定义扩展以满足新对象类型时,需要注意如下要点:
1. release(obj : Persistable, userName : String, locale : Locale) API ofStandardESIService 从 Windchill ESI 首选项 ESI Response Generator 获取 ESI 响应生成器类的名称 (此名称显示在“首选项管理”实用程序中的 ESI > “响应设置”下)。因此,如果要将类 ESIResponseGenerator 的扩展用于生成 ESI 响应,则应将此首选项设置为扩展的完全限定名称。
2. 该扩展应至少提供以下方法的替代版本 - setType()generateResponse()。还应创建 getXXX() 方法,以用于呈现新对象类型。
3. setType() 的替代版本会确保将实例变量 type 设置为新对象类型的相应值。
4. generateResponse() 的替代版本将调用为呈现新对象类型而创建的 getXXX() API。
5. getXXX() API 只会调用 StandardESIService 的同名方法,进而调用适合新对象类型的呈现器实例的 getXXX() API。
* 
对于预设支持的对象,setType() 和 generateResponse() 的替代版本应保留现有行为。此外,上述步骤仅概述了类 ESIResponseGenerator 的扩展的创建方法。除了以下几点外,自定义者还需要关注其他几个方面,比如实施新的呈现器、关联分布目标、将相关响应设置 (以及其他可能适用的属性) 添加到分布目标、为新对象类型自定义中间件中的业务逻辑等。
ESIResponseSender
此类是 com.ptc.windchill.esi.txn 包的一部分,用于实现接口 java.lang.Runnable。为表示给定目标位置的分布目标生成 ESI 响应消息时,ESIResponseGenerator 的 run() 方法将创建此类的实例,将其封装到新的 wt.session.SessionThread 实例中并启动线程。在新启动的线程中执行的 run() 方法可执行所有有用的工作,比如获取正在处理的分布目标的 taskURI 属性值、使用获取的 URI 创建新的 com.infoengine.SAK.Task 实例、将任务的 VDB 设置为响应 IeCollection、根据需要设置任务参数以及最后调用任务。此类不可由自定义者扩展。但是,可将分布目标的 taskURI 属性设置为指向 Info*Engine 任务的自定义版本,所述任务用来将响应消息传送至所需目标位置。默认情况下,该属性设置为 <Windchill>/tasks/com/ptc/windchill/esi/ExportTo<XXX>.xml 中任务的 URI,其中 <XXX> 为文件、FTP 或 SMTP,具体视目标位置类型是文件、FTP 还是 SMTP 而定。
* 
ESIResponseGenerator 的 run() 方法会在按照上述方式启动 ESIResponseSender 线程 (针对当前处理的目标位置中的分布目标) 后不久,为列表中下一个出现的目标位置中的分布目标生成响应消息。
以下类支持变更通告自动生成功能:
变更通告自动生成支持类
ESIECNFactory
此接口用于定义变更通告工厂类必须实现的方法。在 Windchill 环境中未使用变更处理,但目标企业系统需要变更处理的情况下,变更通告工厂会自动生成 Windchill 变更单。
createChangeOrder(item : Changeable2) : WTChangeOrder2
将给定的可变更项封装在变更单中。
ESIStandardECNFactory
此类是 ESIECNFactory 的默认实施。在 Windchill 环境中未使用变更处理,但目标企业系统需要变更处理的情况下,此类会自动生成 Windchill 变更单。此类可由自定义者扩展。以下是此类的可用方法:
createChangeOrder(item : Changeable2) : WTChangeOrder2
创建变更请求、变更单和变更活动,并将自变量与变更活动相关联。如果首选项 Change Notice without Change Request 设置为 Yes,则不会创建任何变更请求。
1. 如果首选项 Change Notice without Change Request 的值设置为 No,则从 ESIChangeRequestFactory 的实例获取 WTChangeRequest2 的实例。
2. 从 ESIChangeOrderFactory 的实例获取 WTChangeOrder2 的实例。如果未在 (1) 中创建变更请求,则将空值传入到 ESIChangeOrderFactory 的 create() API;否则传入已创建的 WTChangeRequest2 对象。
3. 从 ESIChangeActivityFactory 的实例获取 WTChangeActivity2 的实例。
4. 调用 associateChangeableToChangeActivity()。
associateChangeableToChangeActivity(changeActivity : ChangeActivity2, item : Changeable2)
保留给定变更活动与给定可变更项之间的关联。
getChangeRequestFactory() : ESIChangeRequestFactory
返回能够创建变更请求的对象。
getChangeOrderFactory() : ESIChangeOrderFactory
返回能够创建变更单的对象。
getChangeActivityFactory() : ESIChangeActivityFactory
返回能够创建变更活动的对象。
ESIChangeRequestFactory
此类用于创建和保存变更请求。此类可由自定义者扩展。以下是此类的可用方法:
create() : WTChangeRequest2
创建并保存新的变更请求。
getName() : String
返回要为新变更请求指定的名称。值从 EsiResource.ESI_CHANGE_REQUEST_NAME 本地化。
getDescription() : String
返回要为新变更请求指定的说明。值从 EsiResource.ESI_CHANGE_REQUEST_DESC 本地化。
getPriority() : RequestPriority
返回要分配给新变更请求的优先级。值始终为 RequestPriority.LOW。
getCategory() : Category
返回要分配给新变更请求的类别。值始终为 Category.OTHER。
getComplexity() : Complexity
返回要分配给新变更请求的复杂性。值始终为 Complexity.SIMPLE。
ESIChangeOrderFactory
此类用于创建和保存变更单。此类可由自定义者扩展。以下是此类的可用方法:
create(changeRequest : WTChangeRequest2) : WTChangeOrder2
创建并保存新的变更单;如果输入自变量不为空,则变更单也会与输入变更请求关联。
getName() : String
返回要为新变更单指定的名称。值从 EsiResource.ESI_CHANGE_ORDER_NAME 本地化。
getDescription() : String
返回要为新变更单指定的说明。值从 EsiResource.ESI_CHANGE_ORDER_DESC 本地化。
ESIChangeActivityFactory
此类用于创建和保存变更活动。此类可由自定义者扩展。以下是此类的可用方法:
create(changeOrder : WTChangeOrder2) : WTChangeActivity2
创建并保存与自变量关联的新变更活动。
getName() : String
返回要为新变更活动指定的名称。值从 EsiResource.ESI_CHANGE_ACTIVITY_NAME 本地化。
getDescription() : String
返回要为新变更活动指定的说明。值从 EsiResource.ESI_CHANGE_ACTIVITY_DESC 本地化。
以下类支持 Windchill ESI Windchill 工作流:
Windchill ESI 工作流支持
ESIResultEvent
Windchill ESI 工作流可能会暂停,直到外部进程完成。如果外部进程完成,则 ESIResultEvent (也称为 ESI release complete 事件) 触发器会通知工作流恢复。此类的对象会将外部请求是否 Windchill ESI 成功传达给工作流。此类可由自定义者扩展;但是,Windchill ESI 工作流不可用于查找 ESIResultEvent 的子类。
如果自定义者想要扩展类 ESIResultEvent,则自定义者需要修改 Windchill ESI 工作流模板。以下属性具有 public getters 和 setters:
successful : Boolean
定义外部进程是否成功。
errorMessage : String = ""
要提供给工作流的可选消息。
targetUfid : String
表示给定版本的 ESIRelease 对象的 UFID。
* 
ESIRelease 对象预设用作 ESI 结果事件的目标对象。
esiReleaseUfid : String
表示给定版本的 ESIRelease 对象的 UFID。这与 targetUfid 相同。
txUfid : String
与此结果关联的 ESITransaction 的 UFID。当前未使用。
consumed : boolean
定义 RTM 工作流是否接收和使用由 PostEvent RPC 发布的 "ESI release complete" 事件。
以下是此类的公用方法:
ESIResultEvent(eventTarget : Persistable)
仅此类的构造函数。确保对象始终处于正确的状态。
getTarget() : Persistable
返回与此事件关联的事件目标。
* 
类 ESIReleaseUtility 的 postEvent() API 使用 Windchill ESI 首选项 Associate ESI Release Complete Event To Primary Business Object 中的值来确定要用于 "ESI release complete" 事件的目标对象。因此,通过将该首选项设置为 Yes,可将 postEvent() API 配置为将事件与主要业务对象关联,而不是与 ESIRelease 对象关联。在处理从 ESI 早期版本迁移而来的 ESI 失败时,此设置会很有用,其中 RTM 工作流模板预期与事件关联的目标对象是主要业务对象。
以下类提供了 Windchill ESI 服务的公用功能:
Windchill ESI 服务
ESIService
此接口用于定义适用于远程客户端的 Windchill ESI 方法。此接口具有 wt.method.RemoteInterface 注释,该接口通过 ServiceFactory 实用程序提供对此接口的方法的远程访问。此接口不可扩展。以下是此接口的方法:
assignTarget(object : Persistable, target : ESITarget)
向 ESITarget 分配对象,以确定分布目标系统的目标位置。将所有工作都委派给 ESITargetUtility 的实例。
assignTarget(object : Persistable, targets : Group)
向 ESITarget 对象的 Info*Engine 组分配对象,以确定分布目标系统的目标位置。将所有工作都委派给 ESITargetUtility 的实例。
deleteTarget(tgt : ESITarget)
从数据库中删除 ESITarget。将所有工作都委派给 ESITargetUtility 的实例。
removeTargetAssignment(object : Persistable, target : ESITarget)
移除 ESITarget 与可持续对象之间的关系。将删除操作委派给 ESITargetUtility 的实例。
removeTargetAssignment(ufid : String)
从数据库中删除由自变量标识的 ESITargetAssignmentLink。将所有工作都委派给 ESITransactionUtility 的实例。
getTransaction(id : String, object : Persistable
返回 idNumber 属性与给定 Persistable 的方法自变量相匹配的 ESITransaction。如果不存在匹配的事务处理,则抛出 ESIException。将所有工作都委派给 ESITransactionUtility 的实例。
getTarget(system : String) : ESITarget
返回编号属性与自变量相匹配的分布目标。如果存在匹配的 ESITarget,则抛出 ESIException。将所有工作都委派给 ESITargetUtility 的实例。
createTransaction(object : WTObject)
在数据库中创建链接到 WTObject 的新 ESITransaction 并进行保存。将所有工作都委派给 ESITransactionUtility 的实例。
findESITargets(anObject : Persistable) : Collection
返回给定对象的 ESITarget 对象的集合。如果对象为 WTChangeOrder2,则返回与变更单的可变更项关联的分布目标。
isWfLaunched(anObject : LifeCycleManaged) : boolean
检查给定对象是否存在处于 OPEN_RUNNING 状况的工作流进程。
ESIHelper
提供对 ESIService 实施的访问,并提供几种通用的实用程序方法。此类不可扩展。
以下是此类的公用方法:
<<Static>> getTxStatusURL(txUfid : String) : String
此方法仅返回由 getReleaseStatusURL(releaseUfid : String) 返回的 URL。只有在使用 ESI 早期版本中的 RTM 工作流模板时 (例如,重新提交从早期版本迁移而来的 ESI 失败时) 才会调用此方法。ESIRelease 对象的 UFID 会被传入。
* 
此方法已被避免使用,不应在上述场景以外的任何其他情况下调用。
<<Static>> getReleaseStatusURL(releaseUfid : String) : String
返回一个与 Windchill 企业系统事务处理管理用户界面的输入 ESIRelease UFID 关联的 URL。
<<Static>> hasESITargets(anObject : Persistable) : boolean
如果给定对象分配有分布目标,则返回 true。
<<Static>> isOnWfProcess(anObject : LifeCycleManaged) : boolean
如果 Windchill ESI 工作流为 OPEN_RUNNING,则返回 true,因此处理给定对象。
<<Static>> isReleaseNeeded(persistable : Persistable) : boolean
如果首选项 Enforce Changes 的值设置为 No,则返回 true。如果该首选项的值设置为 Yes,且输入的对象为变更通告,则仅当 (i) 对象尚未发布且 (ii) 该首选项 Enforce Changes To Resulting Objects 的值设置为 Yes,以及变更通告中至少有一个产生的对象尚未发布时,该方法才会返回 true;如果输入的 Persistable 为任何其他对象,则在对象尚未发布时,该方法返回 true,否则返回 false。
<<Static>> isTxActive(obj : Persistable) : boolean
如果事务处理状况为 pending 或 processing,则返回 true。此类具有公用静态属性。
service: ESIService
此最终静态属性被初始化为远程接口实施 (默认实施为 StandardESIService) 的新实例,由此提供对此接口的所有远程方法的访问。
* 
以上初始化是通过调用 wt.services.ServiceFactory.getService(serviceClass : Class<T>) 来实现的。
ESISvrHelper
提供对 ESISvrService 实施的访问。此类不可扩展。此类具有公用静态属性。
service: ESISvrService
此最终静态属性被初始化为 ESISvrService 实施的新实例。
ESISvrService
定义 Windchill ESI 服务中可用的非客户端方法。此接口不可扩展。以下是此接口的方法:
postResult(objectID : String, description : String, txnID : String, successful : boolean, subtransaction : boolean, targetSystem : String, message : String, timestamp : String, action : String, cls : String, user : String)
PostResult RPC 处理器。将所有工作都委派给 ESITransactionUtility 的实例。
postEvent(objectID : String, transaction : String, successful : boolean, message : String)
PostEvent RPC 处理器。将所有工作都委派给 ESITransactionUtility 的实例。当前未使用此方法。
getPart(objectID : String, alternates : boolean, documents : boolean, auth : String, wcAdapter : String, transactionID : String) : IeCollection
GetPart RPC 处理器。将所有工作都委派给 ESIWTPartRenderer 的实例。当前未使用此方法。
getBOM(objectID : String, delta : boolean, parts : boolean, alternates : boolean, substitutes : boolean, referenceDesignators : boolean, lineNumbers : boolean, mulitLevel : String, documents : boolean, configSpec : String, auth : String, wcAdapter : String, transactionID : String) : IeCollection
此方法为 GetBOM RPC 处理器。将所有工作都委派给 ESIBOMRenderer 的实例。当前未使用此方法。
getECN(objectID : String, delta : boolean, componentParts : boolean, alternates : boolean, substitutes : boolean, referenceDesignators : boolean, lineNumbers : boolean, mulitLevel : String, documents : boolean, configSpec : String, auth : String, wcAdapter : String, transactionID : String) : IeCollection
当前未使用此方法。
adjustTargetAssignments(ufids : String, targetInfo : Group)
在给定一组合并的 UFID (针对 WTPart 对象) 和 ESITarget UFID 集合的情况下,可执行 (或移除) 任何必需的分配。
ufids 自变量包含一组定义非操作耗用部件的 UFID。
targetInfo 自变量是一个组。组中的每个元素都具有属性,这些属性用于定义:
ESITarget 的 ufid
要对部件执行的操作。如果操作为 "add",则将为所有未分配分布目标的部件分配分布目标。如果操作为 "remove",则将移除此分布目标到任何现有部件的所有现有分配。
将所有操作都委派给 ESITargetUtility 的实例。
getTargetAssociations(ufids : String, groupName : String) : Group
在给定合并 UFID 字符串的情况下,返回与这些对象关联的 ESITarget 对象。如果将 ESITarget 分配给所有由 UFID 标识的对象,则表明值为完全分配;否则,表明值为部分分配。将所有工作都委派给 ESITargetUtility 的实例。
getTargetsWithHistory(objects : Collection) : Group
返回映射的 ESITargetHistory 对象的 Info*Engine 组。ESITargetHistory 对象包含以下内容:
目标属性是可用分布目标之一。
persistableObject 是此方法的自变量中的对象之一。
如果可持续对象已发布到分布目标,则 releaseAttribute 将包含相应的 ReleaseActivity。
结果通过 Windchill ESI 映射到一组 Info*Engine 元素对象的逻辑进行序列化。所有工作均由此方法调用的 ESITransactionUtility 来完成。
getTargetsWithHistory(ufid : String) : Group
返回映射的 ESITargetHistory 对象的 Info*Engine 组。ESITargetHistory 对象包含以下内容:• 目标属性为可用分布目标之一。• persistableObject 是此方法的自变量中的对象之一。• 如果可持续对象已发布到分布目标,则 releaseAttribute 将包含相应的 ReleaseActivity。结果通过 Windchill ESI 映射到一组 Info*Engine 元素对象的逻辑进行序列化。所有工作均由此方法调用的 ESITransactionUtility 来完成。
getTargetsWithHistory(object : Persistable) : Collection
返回映射的 ESITargetHistory 对象的集合。ESITargetHistory 对象包含以下内容:
目标属性是可用分布目标之一。
persistableObject 是此方法的自变量中的对象之一。
如果可持续对象已发布到分布目标,则 releaseAttribute 将包含相应的 ReleaseActivity。
结果通过 Windchill ESI 映射到一组 Info*Engine 元素对象的逻辑进行序列化。所有工作均由此方法调用的 ESITransactionUtility 来完成。
getHistory(ufid : String, groupOut : String) : Group
返回一组映射的 ReleaseActivity 对象,这些对象与自变量所标识的对象关联。对于不具有 ESITargetAssignmentLinks 但具有 ReleaseActivity 关联的对象,此方法的作用等同于 getTargetsWithHistory()。此方法用于执行以下操作:
从 ESIObjectHistoryRendererFactory 获取 ESIObjectHistoryRenderer 的实例和 ESIObjectHistoryBuilder 的实例
调用呈现器的 render() 方法
返回 builder.getGroup() 的结果
getActivities(ufid : String) : ReleaseActivity[]
在给定 ESITransaction 的 UFID 的情况下,返回与 ESITransaction 关联的所有 ReleaseActivity 对象的数组。将实施委派给 ESITransactionUtility。
hideTransaction(ufid : String)
在用户界面中隐藏 ESITransaction。
recordExport(objectID : String, targetSystem : String, releaseClass : String)
RecordExport RPC 处理器。此方法将对象标识为已发布到 ESITarget。此方法用于执行以下操作:
1. 使用 objectID 自变量从 TaskHelper 的实例获取可持续对象。
2. 使用 targetSystem 自变量从 ESITargetUtility 的实例获取分布目标。
3. 将分布目标、可持续对象和 releaseClassargument 传递至 ESITransactionUtility 的实例。
getReleaseActivities(ufid : String) : Group
在给定 ESITransaction 对象的 UFID 的情况下,返回映射的 ESIReleaseActivity 对象的 Info*Engine 组。
getTransactions(elements : Group) : Group
返回与自变量中的对象关联的 ESITransaction 对象的 Info*Engine 组。自变量是一个 Info*Engine 组,其中包含已由 Query-Objects webject 创建 (或与其输出类似) 的元素。将所有工作都委派给 ESITransactionUtility 的实例。
getReleaseActivitiesMessage(ufid : String) : Group
在给定 ReleaseActivity 对象的 UFID 的情况下,返回映射的 ReleaseActivityMessage 对象的 Info*Engine 组。
getTransactionLogMessage(ufid : String) : Group
在给定 ESITransaction 对象的 UFID 的情况下,返回映射的 ESITransactionMessage 对象的 Info*Engine 组。
getECN(objectID : String, delta : boolean, componentParts : boolean, alternates : boolean, substitutes : boolean, referenceDesignators : boolean, lineNumbers : boolean, mulitLevel : String, documents : boolean, processPlanPart : boolean, resource : boolean, sequence : boolean, standardProcedure : boolean, suboperationDepth : String, operatedOnPart : boolean, bomPart : boolean, workInstructions : boolean, configSpec : String, auth : String, wcAdapter : String, transactionID : String) : IeCollection
此方法为 GetECN RPC 处理器。从 VdbBuilder 工厂获取 VdbBuilder。
从 ESIRendererFactory 实例获取 ESIWTChangeOrder2Renderer。
根据此方法中的自变量向呈现器提供必要的数据。
调用呈现器的 render() 方法。
返回 VdbBuilder asVDB() 的结果。当前未使用此方法。
* 
有关此版本中使用的各种 getXXX() API,请参阅 Javadoc。
StandardESIService
StandardESIService 是 ESIService 和 ESISvrService 的具体实施。此类可以扩展。以下是此类的其他模型化方法:
registerEvents(ms : ManagerService)
此方法没有实施。
dispatchVetoableEvent(eventType : String, obj : Persistable)
此方法没有实施。
performStartupProcess()
准备 Windchill 服务以开始操作。这是一种用于启动处理的受保护方法,由基类 StandardManager 调用。此方法会注册事件监听程序,如下所示:
监听部件、文档、变更通告和工艺计划的标识变更事件,并根据需要对其进行验证。
在创建部件或工艺计划的新小版本、版本和视图版本,或者创建文档的新小版本和版本时,复制分布目标分配。
创建新的 WTPartSubstituteLink 对象时,复制替换项组。
或者,根据 Windchill ESI 首选项设置,在生命周期状态发生更改时启动 Windchill ESI 工作流。
先验证用户通过“首选项管理”UI 为某些 Windchill ESI 首选项输入的值,然后再更新数据库中的这些首选项。
可根据需要,在 ESIpreference 更改时初始化某些工作流属性或区域设置相关映射。
* 
1. 有关此版本中使用的类所提供的各种 getXXX() API,请参阅 Javadoc。
2. 如果将此类扩展为提供自定义行为,则应在 esi.wt.properties.xconf 中设置相关特性,并根据需要将其传播到 wt.properties 文件。
这对您有帮助吗?