4

我目前正在运行 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. 在实际的事件处理程序例程中做的更少,并让一个单独的进程完成所有的艰苦工作

这似乎也不是正确的解决方案。我真的很想将我所有的事件处理程序代码保存在一个地方。我们为我们的 live 5.3 安装提供了这样的解决方案,维护起来简直就是一场噩梦(它非常陈旧而且写得不好)。

3. 让我的代码更高效

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

有任何想法吗?

4

5 回答 5

6

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

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

EventSystem.SubscribeAsync<IdentifiableObject,TcmEventArgs(....)
于 2012-09-07T11:16:11.503 回答
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=ConfiguringEventSystem.xml&docid=concept_48C53F76CBFD45A783A3975CA72ECC49&inner_id=&tid=&query=&scope=&resource= &eventType=lcContent.loadDocconcept_48C53F76CBFD45A783A3975CA72ECC49。它确实需要用户名和密码才能访问。

于 2012-09-13T08:12:47.123 回答
2

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

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

于 2012-09-09T11:46:54.333 回答
2

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

如果您真的只对字段感兴趣,那么只需使用.Content(and .Metadata) 属性,然后再次使用 Linq 或 XSLT 或您想要解析 xml 的任何技术(也许RegEx除外)。

于 2012-09-07T12:30:55.880 回答
0

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

于 2012-09-11T14:27:39.110 回答