4

現在、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回の呼び出しですべてのプロパティを取得する方法があれば、これは便利です。

何か案は?

4

5 に答える 5

6

イベントを非同期で実行することを検討しましたか?これを行うには、次の行を変更します。

EventSystem.Subscribe<IdentifiableObject,TcmEventArgs(....)

EventSystem.SubscribeAsync<IdentifiableObject,TcmEventArgs(....)
于 2012-09-07T11:16:11.503 に答える
2

Tridion APIを使用する代わりに、コンポーネントの.ToXml()メソッドを使用してXMLDOMから値を取得することを検討してください。これは通常、かなり高速であり、XSLTまたはLinqを使用してフィールドを「ウォーク」できます。

本当にフィールドのみに関心がある場合は、.Content(および.Metadata)プロパティを使用し、LinqまたはXSLT、あるいはxmlを解析する任意のテクノロジ(おそらく正規表現を除くを使用します。

于 2012-09-07T12:30:55.880 に答える
2

あなたは単にたくさんの処理をしているだけで、それには時間がかかります。技術的な修正があるかもしれませんが、この状況で最初に行うことは、なぜ、何に戻るかです。ページの公開とは、基本的に、そのページに出力するHTMLとバイナリをレンダリングすることです。それにはどれくらい時間がかかりますか?

では、なぜこれをしているのか教えてください。おそらく、努力の一部は、優れた設計を損なうことなく、別の場所に移すことができます。目的がわかれば、もっと助けられるかもしれません。

于 2012-09-09T11:46:54.333 に答える
2

SDLカスタマーサポートから、タイムアウトを増やすようにアドバイスされました。優れたソリューションではありませんが、利用できるのはその唯一のソリューションです。これをする

  1. Tridion.ContentManager.configコンテンツマネージャーがインストールされているサーバーで、コンテンツマネージャーのルートロケーションのサブディレクトリにあるはずのサーバーを開きますconfig/。デフォルトは次のとおりです。C:\Program Files\Tridion\ or c:\Program Files (x86)\Tridion\
  2. <eventSystem>ノードを見つける
  3. threadtimeout値(これは秒単位です)をより高い値に増やします(120に設定します)
  4. を保存してサービスTridion.ContentManager.configを再起動しますTridion Content Manager Service Host

詳細なドキュメントが利用可能ですhttp://sdllivecontent.sdl.com/LiveContent/web/pub.xql?action=home&pub=SDL_Tridion_2011_SPONE&lang=en-US#addHistory=true&filename=ConfigureEventSystem.xml&docid=concept_48C53F76CBFD45A783A3975CA72ECC49&inner_id &eventType=lcContent.loadDocconcept_48C53F76CBFD45A783A3975CA72ECC49。アクセスするにはユーザー名とパスワードが必要です。

于 2012-09-13T08:12:47.123 に答える
0

本当に処理時間が必要な場合は、必要なアクションを実行するWebサービスを作成する必要があると思います。これは、イベントハンドラーから呼び出すことができます。これは、ユーザーエクスペリエンス(同期イベントハンドラーの場合)にもそれほど影響しません。

于 2012-09-11T14:27:39.110 に答える