Tridion事件系统超时

时间:2012-09-07 10:11:31

标签: tridion

我目前正在运行Tridion 2011 SP1。

我正在编写一些在发布页面时运行的代码。它遍历页面中的每个组件模板,获取组件并将各种字段写出到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)

我相信我有三种选择。

1。增加超时

这似乎是一个懒惰的解决方案,只能隐藏问题。无法保证超时问题不会再次发生。我也不确定超时值的存储位置(我尝试在Tridion Content Manager.msc管理单元中更改一些值,但没有运气)。

2。在实际的事件处理程序例程中做得更少,并有一个单独的过程完成所有艰苦的工作

这似乎也不是正确的解决方案。我真的想将所有事件处理程序代码保存在一个地方。对于我们的5.3安装,我们有一个这样的解决方案,这是一个难以维护的噩梦(这是一个非常古老而且写得不好)。

第3。让我的代码更有效

我的组件有很多字段,如果它们是ComponentLinks,我的代码必须深入研究每个字段。我想因为Tridion对象的属性是延迟加载的,所以我访问的每个属性都会调用API /数据库。检索在访问多个属性时很快堆积的属性平均需要0.2秒。如果有办法在一次调用中检索所有属性,这将非常有用。

有什么想法吗?

5 个答案:

答案 0 :(得分:6)

您是否考虑过异步运行事件?您可以通过更改以下行来执行此操作:

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

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

答案 1 :(得分:2)

您可能考虑做的一件事是使用Component的.ToXml()方法并从XML DOM获取您的值,而不是使用Tridion API。这通常要快得多,您可以使用XSLT或Linq“遍历”您的字段。

如果您真的只对字段感兴趣,那么只需使用.Content(和.Metadata)属性,再次使用Linq或XSLT或您想要解析xml的任何技术({ {3}}或许)。

答案 2 :(得分:2)

您只是在进行大量处理,这需要时间。也许有一个技术修复,但在这种情况下要做的第一件事是回到为什么和什么?发布页面基本上是关于呈现要为该页面输出的HTML和二进制文件。这需要多长时间?

那么请你告诉我们你为什么这样做?也许可以将其中一部分工作转移到其他地方,而不会影响良好的设计。如果我们知道目的是什么,也许我们可以提供更多帮助。

答案 3 :(得分:2)

SDL客户支持已建议我增加超时。虽然不是一个很好的解决方案,但它是唯一可用的。要做到这一点

  1. 在安装了内容管理器的服务器上,打开Tridion.ContentManager.config,该config/应位于Content Manager根位置的C:\Program Files\Tridion\ or c:\Program Files (x86)\Tridion\子目录中,默认为<eventSystem>
  2. 找到threadtimeout节点
  3. Tridion.ContentManager.config值(以秒为单位)增加到更高的值(我把它设置为120)
  4. 保存Tridion Content Manager Service Host并重新启动{{1}}服务
  5. 可提供进一步的文件http://sdllivecontent.sdl.com/LiveContent/web/pub.xql?action=home&pub=SDL_Tridion_2011_SPONE&lang=en-US#addHistory=true&filename=ConfiguringEventSystem.xml&docid=concept_48C53F76CBFD45A783A3975CA72ECC49&inner_id=&tid=&query=&scope=&resource=&eventType=lcContent.loadDocconcept_48C53F76CBFD45A783A3975CA72ECC49。它确实需要用户名和密码才能访问。

答案 4 :(得分:0)

如果您确实需要处理时间,那么我认为您应该编写一个Web服务来执行您需要的操作,您可以从事件处理程序调用它。这也不会影响用户体验(在同步事件处理程序的情况下)。