自定义发布
目标
您想要从另一个产品区域或自定义代码启动发布。您可能还想要为系统预设发布机制 (即检入驱动和安排的发布) 定义替代输入来创建表示,例如命名、说明或配置规范。
背景
依预设,Windchill Visualization Services 可通过三种方式创建表示。分别是:从 Windchill 用户界面手动创建,检入可表示对象 (可以具有表示的对象,即 EPMDocument、WTPart、WTDocument),通过排程作业创建。本文档将帮助说明如何以其他方式启动发布,例如自定义工作流代码、自定义用户界面等。
本主题也将说明如何通过自定义此类现有机制 (如检入可表示对象或通过排程作业) 来实现表示创建的自定义。与手动创建不同,不存在用于指定待发布的特殊配置规范的预设方法,也未提供可能需要在表示的名称或说明中捕获的业务特定信息。
范围/适用性/假设
如果要求以非标准方式 (除检入、手动或排程以外的其他方式) 在 Windchill 中启动发布,或者需要修改表示的输入信息,则应该使用自定义发布。发布操作只能针对 wt.representation.Representable 对象 (即 EPMDocument、WTPart、WTDocument,包括可变类型和不可变类型的子项) 执行。
预期结果
借助本主题中的信息,最终用户可以在预设发布机制无法满足使用需求时,以符合其业务需求的方式执行发布操作。
解决方案
通过在自定义代码中实现公共 WVS API,并通过适当的 WVS 特性更改使 WVS 了解此自定义代码,从而自定义发布操作。
必备知识
要实现此目标,需要了解以下内容:
Java 开发
标准 WVS 发布设置和配置
WVS 概念,如可表示对象和表示
基本了解可发布业务对象 (如 EPMDocument、WTPart 和 WTDocument) 及其关系/结构
配置规范 (ConfigSpec) 的使用
* 
配置规范 (ConfigSpec) 更多资源的使用包括参考多个或所有这些主题。
解决方案元素
元素
类型
说明
Publisher.class
类文件
包含从代码调用发布所需的 doPublish API。
运行时位置:<Windchill>\codebase\com\ptc\wvs\common\ui
PublisherAction.class
类文件
用于创建要传递至 Publisher 中的 doPublish 方法的可选 actionString。有关详细信息,请参阅 JavaDoc。
运行时位置:<Windchill>\codebase\com\ptc\wvs\common\ui
VisualizationHelper.class
类文件
包含自定义代码中通常需要的帮助程序 API,如 findRepresentable 和 getRepresentation。
运行时位置:<Windchill>\codebase\com\ptc\wvs\common\ui
ScheduleJobs.class
类文件
包含编写自定义排程作业时所需的 getCurrentContainer 方法。
运行时位置:<Windchill>\codebase\com\ptc\wvs\server\schedule
wvs.properties
特性文件
包含与 Windchill Visualization Service 搭配使用的特定特性。
运行时位置:<Windchill>\codebase
过程 - 从自定义代码/工作流中调用发布
本节将详细介绍如何使用以下受支持的 API 和类:
来自 Publisher 类的 doPublish - 请参阅简单发布
适用于 doPublish 高级使用的 PublisherAction 类 - 请参阅高级发布
要从自定义代码或从工作流中的表达式自动机调用发布,需要了解和使用的关键方法是 com.ptc.wvs.common.ui.Publisher 类中的 doPublish 方法。
public boolean doPublish (boolean viewableLink,
boolean forceRepublish,
String objectReference,
ConfigSpec configSpec,
ConfigSpec partConfigSpec,
boolean defaultRep,
String repName,
String repDescription,
int structureType,
String actionString,
int jobSource)
有关此方法及其参数的更多详细信息,请参阅位于 <Windchill>\codebase\wt\clients\library\api\index.html 中的 JavaDoc。
简单发布
您有一个包含可发布数据的 EPMDocument 实例,并且希望创建一个默认表示。
String objRef =
ObjectReference.newObjectReference(myepmdoc).toString();
Publisher pub = new Publisher();
boolean result = pub.doPublish(false, true, objRef,
(ConfigSpec)null,
(ConfigSpec)null, true, null, null,
Publisher.EPM, null, 0);
此简单示例只会将发布作业添加到 myepmdoc 的发布队列中。产生的名为 "default" 的默认表示将使用在 wvs.properties (publish.configspec.default.useasstoredifavailable) 中定义的 As-Stored 或 Latest ConfigSpec 进行发布。由于 forceRepublish 参数为 true,因此将替换使用相同名称的现有表示。
如果要以编程方式为表示提供名称或将有用的业务信息插入到说明中,请修改参数。例如:
Publisher pub = new Publisher();
boolean result = pub.doPublish(false, true, objRef,
(ConfigSpec)null,
(ConfigSpec)null, true, “MyRep”,
(ConfigSpec)null, true, “MyRep”,
“My Description”, Publisher.EPM, null,
0);
这两个示例之间的唯一区别是,生成的默认表示的名称为 "MyRep",而说明为 "My Description"。
如果要检索对现有表示的参考,请将 viewableLink 参数设置为 true,将 forceRepublish 参数设置为 false。如果已存在具有与可表示对象关联的 repName 的现有表示,则可以先调用 getViewableObjRef(),接着调用 doPublish。如果已找到表示,则会提供一个字符串对象参考。否则将返回 null 值。
String repObjRef = null;
Publisher pub = new Publisher();
if (pub.doPublish(true, false, objRef, (ConfigSpec)null,
(ConfigSpec)null,
true, “MyRep”, “My Description”, Publisher.EPM,
null, 0)) {
repObjRef = pub.getViewableObjRef();
}
除了获取现有表示的对象参考外,还可以获取用于启动 Creo View 来查看表示的 HTML 片段,方法是先调用 getViewableLink() API,接着调用 doPublish。同样,viewableLink 必须为 true,forceRepublish 必须为 false,并且针对 repName 传入的名称的表示必须存在于由 objRef 参数提供的可表示对象中。
String repLink = null;
Publisher pub = new Publisher();
if (pub.doPublish(true, false, objRef, (ConfigSpec)null,
(ConfigSpec)null,
true, “MyRep”, “My Description”, Publisher.EPM,
null, 0)) {
repLink = pub.getViewableLink();
}
高级发布
您有一个包含可发布数据的 EPMDocument 实例,且想要创建一个包含您自己的配置规范的默认表示,并在高优先级发布队列中处理发布作业。
发布的更高级功能需要使用 PublisherAction 类。有关完整信息,请参阅 JavaDoc;下面展示了几个示例。
String objRef =
ObjectReference.newObjectReference(myepmdoc).toString();
PublisherAction pa = new
PublisherAction(PublisherAction.QUEUEPRIORITY, “H”);
ConfigSpec configSpec = <MyHelper.getBaselineConfigSpec()>;
Publisher pub = new Publisher();
boolean result = pub.doPublish(true, true, objRef, configSpec,
null, true,
null, null, Publisher.EPM,
pa.toString(), 0);
您拥有一个包含多个内容片段的 WTDocument。例如,WTDocument 的所有内容包括 doc1.doc、doc2.doc 和 doc3.doc,而您只想发布 doc3.doc (默认情况下将发布所有文档)。
String objRef = ObjectReference.newObjectRefer-
ence(mydoc).toString();
PublisherAction pa =
new PublisherAction(PublisherAction.DOCUMENTFILE, “doc3.doc”);
Publisher pub = new Publisher();
boolean result = pub.doPublish(true, true, objRef, (Config-
Spec)null,
(ConfigSpec)null, null, null,
Publisher.NONE, pa.toString(), 0);
* 
对于 WTDocument,未使用 ConfigSpec,且 structureType 为 Publisher.NONE。
如果您建立了以特定方式命名特定内容文件的业务实践且希望对其进行发布,则此类处理会很有用。
过程 - 获取可表示对象和表示
本节将详细介绍如何使用以下受支持的 API 和类:
来自 VisualizationHelper 类的 findReprentable - 请参阅 findRepresentable
来自 VisualizationHelper 类的 getRepresentation 和 getRepresentations - 请参阅 getRepresentable
可表示对象与表示的关联是一对多关系。查找这些关系时的重要概念是要了解:当您拥有 EPMDocument (即可表示对象) 时,其表示不一定会直接关联。当 EPMDocument 具有主动关联的 WTPart (即检入 EPMDocument 时在工作组管理器中使用的创建关联部件的选项) 时,表示会链接到 WTPart。在所有其他情况下,表示均直接关联至可表示对象 (即,非主动关联的 EPMDocument、DynamicDocument、WTPart、WTDocument 和 MPMLink 可表示对象)。
findRepresentable
为简化上文所述的概念,在 com.ptc.wvs.common.ui.VisualizationHelper 中提供了名为 findRepresentable 的方法。此方法允许传入可表示对象,并且在涉及主动关联的部件时,始终返回正确的可表示对象。在不存在主动关联的部件时,它仅返回您传入的对象。方法签名如下所示:public Representable findRepresentable(Persistable d)
public Representable findRepresentable(Persistable d)
如果您拥有处理可表示对象的自定义代码,则最好使用此方法,这样可确保将正确的可表示对象关联到表示。此外,请注意,如果传入可持续对象而非可表示对象,则此方法将返回 null 值。要使用此方法,您必须具有一个 VisualizationHelper 实例。例如:
VisualizationHelper vizHelper = new VisualizationHelper();
Representable repable = vizHelper.findRepresentable(d);
getRepresentation
com.ptc.wvs.common.ui.VisualizationHelper 中,还有一些便捷方法可用于从可表示对象中获取表示。
public Representation getRepresentation(Persistable d)
如上文所述,可表示对象与表示之间是一对多的关系。但是,其中一个表示可能被标注为 "default" 表示。将有 0 个或 1 个默认值。如果存在一个默认值,则上述方法将返回默认表示。否则,将返回 null。public Representation getRepresentation(Persistable d, String repName)
public Representation getRepresentation (Persistable d,
String repName)
上述方法将返回与名称已传入 repName 自变量的可持续对象相关联的表示。如果没有任何表示或使用所提供的名称无法找到表示,则将返回 null 值。
public QueryResult getRepresentations(Persistable d)
此方法将返回与传入的可持续对象关联的所有表示。如果没有表示,则将返回 null 值。
本小节中的所有三种方法都要求用户拥有 VisualizationHelper 的实例:
VisualizationHelper vizHelper = new VisualizationHelper();
Representation rep = vizHelper.getRepresentation(d);
* 
上述三种方法都使用了 findRepresentable 方法,因此在调用时无需担心主动关联的部件。此外,如果传入的可持续对象不是可表示对象,则将返回 null 值。
过程 - 创建自定义排程作业
本节将详细介绍如何使用以下受支持的 API 和类:
按步骤创建自定义排程作业并使用来自 ScheduleJobs 类的受支持 API getCurrentContainer,请参阅自定义排程作业基础
在自定义排程作业中合并使用来自 Publisher 类的 doPublish - 请参阅自定义安排作业的高级方法
自定义排程作业基础
除预设排程作业外,您还可以创建自己的自定义作业。要创建自定义作业,首先在 Windchill 代码库中创建或添加自定义类;例如 ext.wvs.CustomJobs。在此类中,创建具有以下签名的方法:
public static WTList <nameOfMethod>() or public static QuerySpec <nameOfMethod>() or public static QueryResult <nameOfMethod>()
方法可以使用任何名称,但重要的是:将方法设置为公用、静态、返回 WTList 且不接受任何自变量。
然后将以下内容添加到 wvs.properties.xconf 文件中 (可根据需要进行编辑):
<Property default="MyCustomJob" name="myJob.description"/>
<Property default="ext.wvs.CustomJobs" name=" myJob.class"/>
<Property default="myCustomJob" name=" myJob.method"/>
<Property default="true" name=" myJob.enableOnContainers"/>
<Property default="myJob" name="schedulejobs<N>"/>
第 1 行 (<Property default="MyCustomJob" name="myJob.description"/>) 是您在 Scheduler UI 中看到的内容,用于标识您的自定义作业。
第 2 行 (<Property default="ext.wvs.CustomJobs" name="myJob.class"/>) 是您的自定义方法所在的完全限定类。
第 3 行 (<Property default="myCustomJob" name="myJob.method"/>) 是自定义方法的名称。
第 4 行 (<Property default="true" name="myJob.enableOnContainers"/>) 定义作业代码是否有权访问从中启动排程作业的容器。例如,预设排程作业仅处理从中启动排程作业的容器 (即项目、产品、存储库或组织) 中找到的对象,因为此值已设置为 true。如果将该值设置为 false,则与从 Exchange 容器的上下文中执行作业相同,而无论从哪个容器启动排程作业。
第 5 行 (<Property default="myJob" name="schedulejobs<N>”/>) 是要在发布安排程序管理器中显示您的自定义作业。在名称字符串中,必须将 <N> 替换为紧跟在最后一个已定义 schedulejobsN 之后的整数。
以下是一个发布作业的示例:
public static WTlist myCustomJob() {
WTList wtl = new WTArrayList();
try {
QuerySpec qs = new QuerySpec(WTDocument.class);
WTContainerRef cr = ScheduleJobs.getCurrentContainer();
if (cr != null) {
ContainerSpec cs = new ContainerSpec();
cs.addSearchContainer(cr);
qs.setAdvancedQueryEnabled(true);
qs.appendWhere(
WTContainerHelper.getWhereContainerIn(cs, ,new Class[] {WTDocument.class}),
new int[]{0});
}
if (cr != null) qs.appendAnd();
qs.appendWhere(new SearchCondition(WTDocument.class,
Iterated.LATEST_ITERATION,
SearchCondition.IS_TRUE),
new int[]{0});
Representable doc = null;
int offset = 0;
BasicPageableQuerySpec bpqs = new BasicPageableQuerySpec();
bpqs.setPrimaryStatement(qs);
bpqs.setOffset(offset);
bpqs.setRange(1000);
PagingQueryResult qr =
(PagingQueryResult)PersistenceHelper.manager.find(bpqs);
long sessionId = qr.getSessionId();
int total = qr.getTotalSize();
while (true) {
while (qr.hasMoreElements()) {
doc = (Representable)((Object[])qr.nextElement())[0];
wtl.add(doc);
}
offset += qr.size();
if (offset >= total) break;
PageableQuerySpec pqs = new PagingSessionSpec(sessionId);
pqs.setOffset(offset);
pqs.setRange(1000);
qr = (PagingQueryResult)PersistenceHelper.manager.find(pqs);
}
if (sessionId > 0) PagingSessionHelper.closePagingSession(sessionId);
} catch(Exception e) {e.printStackTrace(); wtl = new WTArrayList ();}
return wtl;
}
* 
本示例包含为避免出现内存不足错误而使用的 BasicPageableQuerySpec 和 PagingSessions。有关详细信息,请参阅 wt.querywt.fc 包中的 JavaDoc。
此示例高效查询在当前容器中找到的任何 WTDocument 的所有最新小版本,以进行发布。
在示例的第六行中,将从 com.ptc.wvs.server.schedule.ScheduleJobs 中使用以下方法:
public static WTContainerRef getCurrentContainer()
如果排程作业是从 Exchange 容器 (站点) 启动的,或者如果作业定义中的 enableOnContainers 值为 false,则此方法的结果将为空 (请参阅上面示例之前所示的特性的第四行)。如果 enableOnContainers 的值为 true,则将返回从中启动排程作业的容器的 WTContainerRef。在示例代码中,它用于筛选组织或从中启动排程作业的产品/项目/存储库容器的查询范围。
* 
您可以有多个自定义排程作业。只需在同一类中使用另一个方法名称,或完全使用一个新类。例如:
public static WTList anotherCustomJob();
然后将以下内容添加到 wvs.properties.xconf 文件中 (可根据需要进行编辑):
<Property default="AnotherCustomJob"
name="anotherJob.description"/>
<Property default="ext.wvs.CustomJobs" name=" anotherJob.class"/>
<Property default="anotherCustomJob" name=" anotherJob.method"/>
<Property default="true" name=" anotherJob.enableOnContainers"/>
<Property default="anotherJob" name="schedulejobs<N>"/>
自定义排程作业的高级方法
使用自定义排程作业基础中的方法不允许您提供用于创建发布作业的输入以及指定表示的名称、表示的说明等。将过程 - 从自定义代码/工作流中调用发布自定义排程作业基础中的内容结合,可以给排程作业带来很大的灵活性。
该方法只需要您将 doPublish 方法的使用从 Publisher 类插入到 myCustomJob 方法中。由于 myCustomJob 必须返回一个 QueryResult,因此只需返回一个空 QueryResult,因为 doPublish 方法现在可使得发布作业排队等待执行。
public static WTList myCustomJob() {
WTList wt = new WTArrayList();
try {
QuerySpec qs = new QuerySpec(WTDocument.class);
WTContainerRef cr = ScheduleJobs.getCurrentContainer();
if (cr != null) {
ContainerSpec cs = new ContainerSpec();
cs.addSearchContainer(cr);
qs.setAdvancedQueryEnabled(true);
qs.appendWhere(
WTContainerHelper.getWhereContainerIn(cs, WTDocument.class),
new int[]{0});
}
if (cr != null) qs.appendAnd();
qs.appendWhere(new SearchCondition(WTDocument.class,
Iterated.LATEST_ITERATION,
SearchCondition.IS_TRUE),
new int[]{0});
Representable doc = null;
String objRef;
int offset = 0;
BasicPageableQuerySpec bpqs = new BasicPageableQuerySpec();
bpqs.setPrimaryStatement(qs);
bpqs.setOffset(offset);
bpqs.setRange(1000);
PagingQueryResult qr =
(PagingQueryResult)PersistenceHelper.manager.find(bpqs);
long sessionId = qr.getSessionId();
int total = qr.getTotalSize();
while (true) {
while (qr.hasMoreElements()) {
doc = (Representable)((Object[])qr.nextElement())[0];
objRef =
ObjectReference.newObjectReference(doc).toString();
Publisher pub = new Publisher();
pub.doPublish(false, true, objRef, (ConfigSpec)null,
(ConfigSpec)null, true, "My Rep",
"My Description", Publisher.NONE, null, 0)
;
}
offset += qr.size();
if (offset >= total) break;
PageableQuerySpec pqs = new PagingSessionSpec(sessionId);
pqs.setOffset(offset);
pqs.setRange(1000);
qr =
(PagingQueryResult)PersistenceHelper.manager.find(pqs);
}
if (sessionId > 0)
PagingSessionHelper.closePagingSession(sessionId);
} catch(Exception e) {e.printStackTrace();}
return new wtl;
}
这与在自定义排程作业基础中使用示例相同,但请注意使用粗体显示的 doPublish 方法。此自定义作业现在将创建名称为 "My Rep" 的表示以及 "My Description" 的说明。另请注意,从方法返回的 WTList 为空。
请参阅过程 - 从自定义代码/工作流中调用发布,以查看 doPublish 方法的其他有用方法。
过程 - 自定义基于检入的发布
本节将详细介绍以下特性驱动自定义挂接的使用方法:
publish.service.filterepmdocumentpublishmethod - 请参阅筛选 EPMDocument 检入的发布
publish.service.filterdocumentpublishmethod - 请参阅筛选 WTDocument 检入或上载的发布
在自定义挂接代码中合并使用来自 Publisher 类的 doPublish - 请参阅用于自定义基于检入的发布的高级方法
筛选 EPMDocument 检入的发布
创作应用程序 (即 Creo Parametric) 的发布配置完成后,依预设,将发布已检入的创作应用程序的所有 EPMDocument。有时,出于业务原因,需要根据某些条件从发布中筛选出某些 EPMDocument。例如,某个生命周期状态、EPMDocumentType、EPMDocSubType 等。Windchill Visualization Services 有一个可用代码挂接,您可以在其中插入代码以筛选此类条件。
在自定义类中,您可以使用以下签名定义方法:
public static Boolean epmFilterMethod(EPMDocument epmdoc)
可以使用任何名称代替 epmFilterMethod。请确保包含您的自定义方法的类可在 Windchill 代码库 (即 ext.wvs.MyFilterMethods) 中访问。
下一步是将类和方法添加到 wvs.properties.xconf。以下特性预设为空。将其更新为包含类和筛选器方法,格式为 "class/method"。
<Property default="ext.wvs.MyFilterMethods/epmFilterMethod"
name="publish.service.filterepmdocumentpublishmethod"/>
进行更改后,请使用 xconfmanager 将更改传播至 wvs.properties。
每次进行检入 (正常情况下会发布 EPMDocument) 时,都会立即调用此方法。如果方法返回 Boolean.TRUE,系统将尝试发布特定 EPMDocument。如果该方法返回 Boolean.FALSE,则不会尝试发布。
以下是有关如何筛选出特定 EPMDocumentType 的简单示例:
public static Boolean epmFilterMethod(EPMDocument epmdoc) {
if (epmdoc.getDocType().equals(
EPMDocumentType.toEPMDocumentType("MANIKIN_POSTURE"))) {
return Boolean.FALSE;
}
return Boolean.TRUE;
}
此处提供了另一个示例,用于筛选出处于 InWork 生命周期状态的 EPMDocument 的发布。
public static Boolean epmFilterMethod(EPMDocument epmdoc) {
if (epmdoc.getLifeCycleState() != State.INWORK) {
return Boolean.TRUE;
}
return Boolean.FALSE;
}
筛选 WTDocument 检入或上载的发布
与筛选 EPMDocument 的发布非常相似,还提供了一种用于筛选 WTDocument 发布的方法。例如,您可能希望根据特定文件名、生命周期状态、容器等来进行筛选。如果系统具有为发布特定 WTDocument 内容而配置的工作器,则可使用自定义筛选方法来保持某些内容不进行发布。
在自定义类中,您可以使用以下签名定义方法:
public static Boolean docFilterMethod(WTDocument doc, ContentItem ci)
可以使用任何名称代替 docFilterMethod。请确保包含您的自定义方法的类可在 Windchill 代码库 (即 ext.wvs.MyFilterMethods) 中访问。 请注意,此方法与 EPMDocument 筛选器方法签名的不同之处在于将 ContentItem 作为参数包括在内。在检入时,将为与 WTDocument 关联的每个 ContentItem 调用此方法。上载时,也会进行调用。例如,如果您有一个以 .doc 文件作为主要内容,.xls 文件作为附属内容的 WTDocument,则此方法将被调用两次;每个内容项调用一次 (待处理工作器将与这两种类型的内容关联)。
下一步是将类和方法添加到 wvs.properties.xconf。以下特性预设为空。将其更新为包含类和筛选器方法,格式为 "class/method"。
<Property default="ext.wvs.MyFilterMethods/docFilterMethod"
name="publish.service.filterdocumentpublishmethod"/>
进行更改后,请使用 xconfmanager 将更改传播至 wvs.properties。
每次进行检入或上载 (正常情况下会发布 WTDocument) 时,都会立即调用此方法。如果方法返回 Boolean.TRUE,系统将尝试发布特定 WTDocument ContentItem。如果该方法返回 Boolean.FALSE,则不会尝试发布。
以下示例将介绍 WTDocument 的说明为“不发布”,或者内容的文件名以 "donotpublish" 开头时将如何进行筛选。
public static Boolean docFilterMethod(WTDocument doc, ContentItem ci) {

if (doc.getDescription().equals("Do Not Publish")) {
return Boolean.FALSE;
}
if (ci instanceof ApplicationData) {
String filename = ((ApplicationData)ci).getFileName();
if (filename.startsWith("donotpublish") {
return Boolean.FALSE;
}
}
return Boolean.TRUE;
}
自定义基于检入的发布的高级方法
使用筛选 EPMDocument 检入的发布筛选 WTDocument 检入或上载的发布中的方法,无法在创建发布作业时提供输入来指定表示的名称、表示的说明等。将过程 - 从自定义代码/工作流中调用发布筛选 EPMDocument 检入的发布以及筛选 WTDocument 检入或上载的发布中的概念相结合,可为基于检入的发布带来很大的灵活性。
该方法只需要您将 Publisher 类中使用的 doPublish 方法使用插入到 epmFilterMethod 或上一小节中所示 docFilterMethod 中。由于两个筛选器方法必须返回布尔值,因此只需返回 Boolean.FALSE 并使用 doPublish 方法,即可使得发布作业排队等待执行。
public static Boolean epmFilterMethod(EPMDocument epmdoc) {

if (epmdoc.getDocType().equals(
EPMDocumentType.toEPMDocumentType("MANIKIN_POSTURE"))) {
return Boolean.FALSE;
}
String objRef = ObjectReference.newObjectReference(epmdoc).toString();
Publisher pub = new Publisher();
pub.doPublish(false, true, objRef, (ConfigSpec)null,
(ConfigSpec)null,
"My Rep", "My Description", Publisher.EPM, null, 0);

return Boolean.FALSE;
}
这与筛选 EPMDocument 检入的发布中使用的示例相同,但请注意,使用的 doPublish 方法以粗体显示。此自定义作业现在将创建名称为 "My Rep" 的表示以及 "My Description" 的说明。另请注意,从方法返回的布尔值为 Boolean.FALSE。
请返回并查看过程 - 从自定义代码/工作流中调用发布,以了解使用 doPublish 方法的其他有用方法。
过程 - 自定义常规发布
本节将详细介绍以下方法:
使用特性驱动的挂接:publish.service.filterpublishmethod - 请参阅筛选所有发布
在自定义挂接中合并使用来自 Publisher 类的 doPublish - 请参阅 自定义基于检入的发布的高级方法
筛选所有发布
除了过程 - 自定义基于检入的发布中所述专用于 EPMDocument 和 WTDocument 的筛选器外,Windchill Visualization Services 还有一个更常规的挂接,可在发布任何内容 (包括 EPM 和 WTDocument) 时进行调用。除了支持对所有可表示对象的筛选外,此挂接还包括对预先转换的数据的发布。
在自定义类中,您可以使用以下签名定义方法:
public static Boolean filterMethod(Persistable p, Boolean
publishFromDB)
可以使用任何名称代替 filterMethod。请确保包含您的自定义方法的类可在 Windchill 代码库 (即 ext.wvs.MyFilterMethods) 中访问。 此方法包括一个 publishFromDB 参数。如果针对存储在 Windchill 中的数据 (即 EPMDocument 或 WTDocument 对象的内容) 调用发布,则此布尔值将为 Boolean.TRUE。如果发布未存储在 Windchill 中的数据,即从文件系统中转换的本地数据或剪贴板中的数据,则值将为 Boolean.FALSE。您可以使用 publishFromDB 的值,使得自定义代码可根据您的意愿处理这两种情况。
下一步是将类和方法添加到 wvs.properties.xconf。以下特性预设为空。将其更新为包含类和筛选器方法,格式为 "class/method"。
<Property default="ext.wvs.MyFilterMethods/filterMethod"
name="publish.service.filterpublishmethod"/>
进行更改后,请使用 xconfmanager 将更改传播至 wvs.properties。
每次正常进行发布时,都将立即调用此方法。如果方法返回 Boolean.TRUE,系统将尝试发布可持续对象。如果该方法返回 Boolean.FALSE,则不会尝试发布。
以下是一个简单的示例,用于介绍在 Persistable 为 LifeCycleManaged 且处于其生命周期的最后阶段时,将如何筛选出发布内容:
public static Boolean filterMethod(Persistable p, Boolean publishFromDB) {
if (!publishFromDB) return Boolean.TRUE;
if (!(p instanceof LifeCycleManaged)) return Boolean.TRUE;
try {
if (LifeCycleHelper.service.isInFinalPhase((LifeCycleManaged)p)) {
return Boolean.FALSE;
}
} catch (WTException wte) {
wte.printStackTrace();
}
return Boolean.TRUE;
}
* 
在上述示例中,第二行说明:如果发布请求的数据不是来自 Windchill 数据库,则仅返回 true。例如,如果有人针对从本地磁盘上载的 WTPart 发布数据,我们指示不想对此进行筛选,则仅返回 Boolean.TRUE。
限制
自定义边界
PTC 不支持对预设 CadConvert 类 (a.k.a. Publishers)、工作器代理或 WVS 加载程序进行自定义。这些 WVS 组件的预期目的并非用于自定义,因此无法保证未来版本不会破坏使用这些组件尝试的自定义。
自定义排程作业性能
尽管排程作业通过队列在后台运行,但也可以创建在您的自定义代码中返回的大量资源密集型查询。创建自定义排程作业一节中的示例介绍了一个技巧,即通过分页的方法来帮助避免因处理大型结果集而导致的问题。请确保在与生产接近的数据集上测试您的自定义排程作业。结果为 100 时有效的设置,对于存在数万或数十万个结果的情况并不一定始终有效。
自定义检入筛选性能
请记住,在使用过程 - 自定义基于检入的发布中所示的检入筛选方法时,将针对每个发布候选对象的可表示对象运行您的方法。您的方法应该高效且尽可能减少需要确定返回 true 或 false 结果的情况。如果在筛选方法中需要出现一些重要的逻辑,请尽可能排除不必要的逻辑,然后再开始执行。
更多资源
Java 开发:http://java.sun.com
您的 <Windchill>\codebase 目录中的 wvs.properties.xconf 文件。
相关的包/类 Javadoc
com.ptc.wvs.common.ui
com.ptc.wvs.server.schedule
其他相关 Windchill 文档
Creo® View MCAD Adapters Installation and Configuration Guide (《Creo® View MCAD Adapter 安装和配置指南》)
Creo® View ECAD Adapters Installation and Configuration Guide (《Creo® View ECAD Adapter 安装和配置指南》)
这对您有帮助吗?