类
以下类支持 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 响应生成器类的名称 (此名称显示在“首选项管理”实用程序中的 > 下)。因此,如果要将类 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 工作流:
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 首选项“将 ESI Release Complete 事件与主要业务对象相关联”的值,确定要用于 ESI Release Complete 事件的目标对象。因此,通过将该首选项设置为 Yes,可将 postEvent() API 配置为将事件与主要业务对象关联,而不是与 ESIRelease 对象关联。在处理从 ESI 早期版本迁移而来的 ESI 失败时,此设置会很有用,其中 RTM 工作流模板预期与事件关联的目标对象是主要业务对象。此首选项不适用于具有基于对象的同步自动机的 RTM 工作流。 |
以下类提供 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 文件。 |