Well, I got the thread pool working, but not the way you described,
yet. I found you don't have to make all those calls to the
CocoonComponentManager as long as the current request thread creates all
of the threads in its pool; InheritableThreadLocal gets set
automagically. I just set my thread pool to empty out on recycle(), and
it was happy (we use 1 pool per transformer). It's some extra Thread
object creation per request, though, so it's not ideal.
Carsten Ziegler wrote:
> Ok, it's a little bit difficult. First, the thread you create is not
> allowed to run longer than the original thread - but I guess that's
> not the case for you anyway.
> Second, the thread runs in the same environment as the original thread.
>
> Regarding the ThreadLocal variable, you have to clone it first
> from the original thread. The CocoonComponentManager has a private
> static variable:
> private static InheritableThreadLocal environmentStack;
> You have to set this in your "new" thread (taken from the pool)
> to a clone! of the parent thread. The clone() method can be used
> for this.
> And then something like this:
>
> public void run() {
>
>
> Environment env = CocoonComponentManager.getCurrentEnvironment();
> Object key = CocoonComponentManager.startProcessing(env);
>
> CocoonComponentManager.enterEnvironment(env);
> try {
> doStuff();
> } finally {
> CocoonComponentManager.leaveEnvironment();
> CocoonComponentManager.endProcessing(env, key);
> }
> }
>
This didn't work for me, but I may be missing something in setting the
ThreadLocal variable. I added the following method to my PooledThread
class, which I called from code run by the current request thread, when
it draws the thread from the pool:
public void setThreadLocal() {
Object local =
CocoonComponentManager.getCurrentEnvironmentStack().clone();
environmentStack.set(local);
}
> This should work...hopefully...
> >
> >As far as thread safety goes, I know my own code doesn't have ThreadLocals,
> but I don't know where >else in the Cocoon machinery they might lurk.
> >
> In Cocoon itself there are afaik no more ThreadLocals, but
> in theory you also have to check Xalan, Xerces, FOP and
> every other library you use - and that's impossible.
> So you can start with the ThreadLocal of Cocoon and
> hope that you don't get problems :) Isn't life easy?
You said it!
> HTH
> Carsten
All this has been very helpful, thanks.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]