我目前正在运行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秒。如果有办法在一次调用中检索所有属性,这将非常有用。
有什么想法吗?
答案 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客户支持已建议我增加超时。虽然不是一个很好的解决方案,但它是唯一可用的。要做到这一点
Tridion.ContentManager.config
,该config/
应位于Content Manager根位置的C:\Program Files\Tridion\ or c:\Program Files (x86)\Tridion\
子目录中,默认为<eventSystem>
threadtimeout
节点Tridion.ContentManager.config
值(以秒为单位)增加到更高的值(我把它设置为120)Tridion Content Manager Service Host
并重新启动{{1}}服务答案 4 :(得分:0)
如果您确实需要处理时间,那么我认为您应该编写一个Web服务来执行您需要的操作,您可以从事件处理程序调用它。这也不会影响用户体验(在同步事件处理程序的情况下)。