現在、Tridion2011SP1を実行しています。
ページが公開されるたびに実行されるコードを書いています。ページ内の各コンポーネントテンプレートをループし、コンポーネントを取得して、さまざまなフィールドをXMLドキュメントに書き込みます。多くのコンポーネントテンプレートを含むページまたは多くのフィールドを含むコンポーネントの場合、このプロセスの実行には時間がかかることがあります。プロセスに30秒以上かかる場合、エラーが発生します
The operation performed by thread "EventSystem0" timed out.
Component: Tridion.ContentManager
Errorcode: 0
User: NT AUTHORITY\NETWORK SERVICE
続いて別の
Thread was being aborted.
Component: Tridion.ContentManager
Errorcode: 0
User: NT AUTHORITY\NETWORK SERVICE
StackTrace Information Details:
at System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
at System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
at System.Delegate.DynamicInvokeImpl(Object[] args)
at Tridion.ContentManager.Extensibility.EventSubscription.DeliverEvent(IEnumerable`1 subjects, TcmEventArgs eventArgs, EventPhases phase)
私には3つの選択肢があると思います。
1.タイムアウトを増やします
これは怠惰な解決策のようであり、問題を隠すだけです。タイムアウトの問題が再発しないという保証はありません。タイムアウト値がどこに保存されているかもわかりません(Tridion Content Manager.mscスナップインでいくつかの値を変更しようとしましたが、うまくいきませんでした)。
2.実際のイベントハンドラルーチンで行う作業を減らし、別のプロセスにすべてのハードワークを実行させます
これも正しい解決策ではないようです。すべてのイベントハンドラーコードを1か所にまとめたいと思います。ライブ5.3のインストールには、このようなソリューションが用意されており、維持するのは悪夢です(非常に古く、記述も不十分です)。
3.コードをより効率的にする
私のコンポーネントには多くのフィールドがあり、それらがComponentLinksである場合、コードは各フィールドをより深く掘り下げる必要があります。Tridionオブジェクトのプロパティは遅延ロードされるため、アクセスするプロパティごとにAPI/データベースへの呼び出しが1つあると思います。複数のプロパティにアクセスするとすぐにスタックするプロパティを取得するのに平均0.2秒かかります。1回の呼び出しですべてのプロパティを取得する方法があれば、これは便利です。
何か案は?