Agreed - I use pools for stuff like this.  But, it's not broken for pools - 
nothing functionally changed, right? 

Jeremy Thomerson
http://www.wickettraining.com
-- sent from a wireless device


-----Original Message-----
From: James Carman <ja...@carmanconsulting.com>
Sent: Wednesday, May 19, 2010 9:28 PM
To: dev@wicket.apache.org
Subject: Re: WICKET-2846 - Store Application in InheritableThreadLocal instead 
of ThreadLocal

It solves that one particular usecase, but I doubt folks would be
starting threads like that.  Most folks, if they're smart, would use a
thread pool for something like that.  For the pooled thread case, it
doesn't work.

On Wed, May 19, 2010 at 9:29 PM, Jeremy Thomerson
<jer...@wickettraining.com> wrote:
> It solves this problem, which is specifically why it was requested:
>
> onClickOrSomethingSimilar() {
>    new Thread(new Runnable() {
>        void run() {
>            doSomethingWith(Application.get());
>        }
>    }).start();
> }
>
> --
> Jeremy Thomerson
> http://www.wickettraining.com
>
>
>
> On Wed, May 19, 2010 at 6:28 PM, James Carman 
> <ja...@carmanconsulting.com>wrote:
>
>> Sure this might work, but then again you wouldn't need the
>> InheritableThreadLocal for this.  The question is, does the
>> InheritableThreadLocal really solve anything?  Is it really addressing
>> the problem?  Or, would you have to do code like this to manage it
>> properly anyway?  And, if so, then why implement the
>> InheritableThreadLocal, especially since we've shown that it will fail
>> in more cases than it will work?
>>
>> On Wed, May 19, 2010 at 6:28 PM, Johan Compagner <jcompag...@gmail.com>
>> wrote:
>> > If you where using threads in your application
>> > Then i would do it this way:
>> >
>> > Your WebApplication class has a method:
>> > getExecutor() that returns a ThreadPoolExecutor
>> >
>> > That threadpoolexecutor (that you extend) overrides 2 methods
>> >
>> > protected void beforeExecute(Thread t, Runnable r) { }
>> >
>> > that sets the thread locals (so the application instance that has the
>> > executor) and
>> >
>> >   protected void afterExecute(Runnable r, Throwable t) { }
>> >
>> > to release all thread locals.
>> >
>> > this way you use a pool (way better to control your web application) and
>> all
>> > the resources you need are set just before and release right after.
>> >
>> > johanm
>> >
>> >
>> >
>> > On Wed, May 19, 2010 at 23:41, James Carman <ja...@carmanconsulting.com
>> >wrote:
>> >
>> >> Will the inheritance of the application really work correctly?  For
>> pooled
>> >> threads that are created at application startup, the threadlocal will be
>> >> null, because the parent thread is the thread that starts the container.
>> >> For threads that are created within the context of the request thread,
>> they
>> >> will get the current application object, which would be fine if that
>> thread
>> >> executes and finishes.  But, for threads that are going to be reused
>> >> (executor threads in a pool), they will see the original application
>> object
>> >> because the value is set at thread creation time.  If you have multiple
>> >> wicket filters in the same context, that could be incorrect, meaning a
>> >> request thread for a different application submitted a task to be
>> executed.
>> >>
>> >> On May 19, 2010 4:13 PM, "Adriano dos Santos Fernandes" <
>> >> adrian...@gmail.com>
>> >> wrote:
>> >>
>> >> On 19/05/2010 17:03, Jeremy Thomerson wrote:
>> >> >>
>> >> >>
>> >> >> To clarify this, I use Application.set and App...
>> >> Well, forgetting to unset it would not leak any more than have it
>> >> implicitly
>> >> set like it's going to be. And I do think forgetting this is developer
>> >> fault.
>> >>
>> >> What you all do not want to understand is what I said about Java library
>> >> spawning its own threads, and that is not documented, as its for cleanup
>> in
>> >> the case I shown.
>> >>
>> >>
>> >> Adriano
>> >>
>> >
>>
>

Reply via email to