サービスポータルでのレコード監視の微調整Issue サービスポータルでレコード監視を微調整して、ウィジェットがサーバーに対して行う呼び出しの回数を減らす方法は 2 つあります。これらの方法を理解することで、レコード監視の更新を大量に処理することで生じる不必要なオーバーヘッドをアプリケーションサーバーに追加することを避けることができます。 この微調整が重要である理由の詳細については、次の記事を参照してください。 KB0635134:サービスポータルウィジェットでレコード監視 (recordWatch) の呼び出しが適切に定義されていないために発生する「デフォルトセマフォの枯渇」に関するエラーを解決するKB0634655 - ウィジェットを自動リフレッシュするとセマフォが枯渇する フィルターを改善する パフォーマンス上の問題を回避するためには、レコード監視に適したフィルターを用意することが重要です。 フィルターは、次の呼び出しの 3 番目のパラメーターとして渡す必要があります spUtil.recordWatch(Object $scope, String table, String filter, Function callback) このフィルターは、エンコードされたクエリを文字列として受け入れます。製品ドキュメントのトピック「フィルターとクエリに使用できる演算子」で説明されている任意の JavaScript 演算子を使用できます。これにより、特定のフィールドの変更を監視することができます。 たとえば、アクティブな P1 インシデントをすべて表示するウィジェットがある場合、P1 インシデントは非常に頻繁に更新されるため、それらの更新をすべて監視すると、システムにオーバーヘッドが発生する可能性があることを考慮する必要があります。たとえば、レコード監視は、P1 インシデントのステータスの変更のみを監視する必要がある場合があります。これは、フィルターで次のように実行できます。 "priority=1^stateCHANGES^EQ" 代わりに CHANGESTO 演算子を使用して、P1 の状態が解決済みに変更されたかどうかを確認することもできます。 "priority=1^stateCHANGESTO6^EQ". 更新するタイミングを選択する ポータルのレコード監視に関連するパフォーマンスの問題のほとんどは、ウィジェットが spUtil.update() や server.update() を短時間に何度も呼び出すために発生します。これらの呼び出しは通常、更新があることをクライアントに通知するレコード監視への応答として行われます。 デフォルトでは、レコード監視にコールバックを渡さない場合、更新のたびに server.update() が呼び出され、ウィジェットデータが更新されます。これにより、ウィジェットを更新するための呼び出しが大量に発生する可能性があります。代わりに、コールバック関数を定義し、レコード更新イベントから得られる情報を使用して、ウィジェットを更新する必要があるかどうかを判断します。 たとえば、同じ P1 ウィジェットで、ステータスフィールドの変化だけを監視するのではなく、より広範なフィルターを使用して、すべてのアクティブな P1 を監視し、コールバック関数にデータを更新するかどうかを判断させます。 var q = "priority=1^active=true^EQ"; spUtil.recordWatch($scope, "incident", q, function(event, data) { if (data.changes.includes("state")) { // only update if state was updated. spUtil.update($scope); } }); この例では、フィルターによって監視対象が絞り込まれ、コールバック関数によってデータを更新するかどうかが決定されます。コールバック関数はイベントとデータを渡します。舞台裏では、これは単なる angularjs イベントハンドラーです。データオブジェクトには、更新されたレコードの情報が含まれます。そのデータ変数をコンソールに記録して、内容を確認することもできますが、最も便利なプロパティはおそらく「変更」です。Data.changes には、更新で変更されたすべてのフィールドのアレイが含まれます。この情報を使用して、変更されたフィールドを確認し、ウィジェット内のデータを更新する必要があるかどうかを判断できます。 Jakarta リリースでの変更点: Jakarta では、データオブジェクトはレコード監視コールバックで定義されず、単純な angularjs イベントハンドラーではなくなりました。引き続き同じ方法で使用することはできますが、更新されるレコードに関する情報はイベントオブジェクトそのものに移動されました。 したがって、レコードに加えられた変更を調べる場合は、代わりに event.data.changes を使用して変更されたフィールドにアクセスする必要があります。