高度なカスタマイズ > ビジネスロジックのカスタマイズ > Windchill Visualization Services のカスタマイズ > カスタムパブリッシング > ソリューション > 手順 - カスタムスケジュールジョブの作成 > カスタムスケジュールジョブの基本
  
カスタムスケジュールジョブの基本
デフォルトのジョブのほかに、独自のカスタムジョブを作成することができます。これを行うには、Windchill codebase にカスタムクラスを作成または追加します。たとえば、ext.wvs.CustomJobs です。このクラスで、以下の署名でメソッドを作成します。
public static WTList <nameOfMethod>() or public static QuerySpec <nameOfMethod>() or public static QueryResult <nameOfMethod>()
任意のメソッド名を使用できますが、public、static であり、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"/>) は、スケジューラ 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 に設定されているため、スケジュールジョブが開始されたコンテナ (Project、Product、Library、または Organization) のオブジェクトのみを処理します。値が false に設定されている場合は、どのコンテナからスケジュールジョブが開始された場合でも、Exchange コンテナのコンテキストによるジョブの実行と同じになります。
行 5 (<Property default="myJob" name="schedulejobs<N>"/>) は、パブリッシュスケジューラアドミニストレータにカスタムジョブを表示します。name の文字列中の <N> は連番です。定義済みの最新の schedulejobsN の N に 1 を足したものを指定します。
パブリッシュジョブの例を以下に示します。
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.query および wt.fc パッケージで Javadoc を参照してください。
この例では、現在のコンテナで見つかったパブリッシングされる WTDocuments の最新の作業版数すべてを効果的に要求できます。
例の行 6 では、下記のメソッドが com.ptc.wvs.server.schedule.ScheduleJobs から使用されます。
public static WTContainerRef getCurrentContainer()
このメソッドの結果は、スケジュールジョブが Exchange コンテナ (サイト) から開始された場合、またはジョブ定義の enableOnContainers 値が false の場合 (上記例の前に示したプロパティの行 4 を参照) は null となります。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>"/>