Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Tridion Event System Timeout

Tags:

tridion

I am currently running Tridion 2011 SP1.

I am writing some code that runs whenever a page is published. It loops through each component template in the page, gets the component and writes out various fields to an XML document. For pages with many component templates or components with many fields this process can take a while to run. If the process takes more than 30 seconds I get an error

The operation performed by thread "EventSystem0" timed out.

Component: Tridion.ContentManager
Errorcode: 0
User: NT AUTHORITY\NETWORK SERVICE

followed by another

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)

I believe I have three options.

1. Increase the timeout

This seems like a lazy solution and only hides the problem. There is no guarantee that the timeout problem won't reoccur. I'm also not sure where the timeout value is stored (I've tried changing a few values in the Tridion Content Manager.msc snap-in but no luck).

2. Do less in the actual event handler routine and have a separate process do all the hard work

This doesn't seem like the correct solution either. I would really like to keep all my event handler code in the one place. We have a solution like this in place for our live 5.3 installation and is a nightmare to maintain (it is very old and poorly written).

3. Make my code more efficient

My components have many fields and my code must delve deeper into each field if they are ComponentLinks. I guess because the properties of Tridion objects are lazy loaded there is one call to the API/database for each property I access. It takes on average 0.2 seconds to retrieve a property which soon stacks up when accessing multiple properties. If there was a way to retrieve all properties in one call this would be useful.

Any ideas?

like image 996
Kevin Brydon Avatar asked Dec 15 '22 19:12

Kevin Brydon


1 Answers

Have you considered running your event asynchronously? You can do this by changing the following line:

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

to

EventSystem.SubscribeAsync<IdentifiableObject,TcmEventArgs(....)
like image 96
Quirijn Avatar answered Jan 27 '23 10:01

Quirijn