You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@wicket.apache.org by Ernesto Reinaldo Barreiro <re...@gmail.com> on 2015/01/05 10:38:21 UTC

Re: What is the proper way to start a secondary process in Wicket 6

Dear All,

With the invaluable help of Martin Grigorov, I have summarized the
discussion on this thread on a small Wicket in Action article [1]. The
complete sample project can be found at [2].

1- http://wicketinaction.com/2014/07/working-with-background-jobs/
2-https://github.com/reiern70/antilia-bits/tree/master/bgprocess


On Tue, Nov 25, 2014 at 6:30 AM, Ernesto Reinaldo Barreiro <
reiern70@gmail.com> wrote:

> @Martin,
>
> Many thanks! I will try to have a look today at the PR and see if I find
> the time to write the blogs article during this week.
>
> Thanks again!
>
> On Mon, Nov 24, 2014 at 5:46 PM, Martin Grigorov <mg...@apache.org>
> wrote:
>
>> Hi Ernesto,
>>
>> See https://github.com/reiern70/antilia-bits/pull/1
>> I've moved the code that exports the Application thread local to
>> TasksRunnable. This way it is possible to export the Session too.
>>
>> The code looks good (after removing all annoying whitespaces :-) ). Now it
>> needs some explanation (i.e. blog article) ;-)
>>
>> Martin Grigorov
>> Wicket Training and Consulting
>> https://twitter.com/mtgrigorov
>>
>> On Sun, Nov 23, 2014 at 8:13 AM, Ernesto Reinaldo Barreiro <
>> reiern70@gmail.com> wrote:
>>
>> > Warren,
>> >
>> > ThreadContext.detach(); seems to be more proper than...
>> > ThreadContext.setApplication(null); I will update demo.
>> >
>> > On Sat, Nov 22, 2014 at 10:58 PM, Warren Bell <wa...@gmail.com>
>> > wrote:
>> >
>> > > Ernesto,
>> > >
>> > > That’s kind of what I ended up doing except with a different
>> > > ThreadPoolExecutor implementation.
>> > >
>> > > ExecutorService executorService = new ScheduledThreadPoolExecutor(20)
>> > >         {
>> > >             @Override
>> > >             protected void beforeExecute(Thread t, Runnable r) {
>> > >                 ThreadContext.setApplication(MyApplication.this);
>> > >             }
>> > >
>> > >             @Override
>> > >             protected void afterExecute(Runnable r, Throwable t) {
>> > >                 ThreadContext.detach();
>> > >             }
>> > >         };
>> > >
>> > > No particular reason why I picked ScheduledThreadPoolExecutor other
>> than
>> > > it looked a little easier to use. I need to look more into the
>> different
>> > > types of Thread pools and such.
>> > >
>> > > I used:
>> > >
>> > > ThreadContext.detach();
>> > >
>> > > instead of:
>> > >
>> > > ThreadContext.setApplication(null);
>> > >
>> > > Warren Bell
>> > >
>> > >
>> > > On Nov 22, 2014, at 11:18 AM, Ernesto Reinaldo Barreiro <
>> > > reiern70@gmail.com> wrote:
>> > >
>> > > > pushed a new version including injecting a Guice managed service
>> class
>> > > >
>> > > > On Sat, Nov 22, 2014 at 8:08 PM, Ernesto Reinaldo Barreiro <
>> > > > reiern70@gmail.com> wrote:
>> > > >
>> > > >> Warren,
>> > > >>
>> > > >> Something like:
>> > > >>
>> > > >> ExecutorService executorService =  new ThreadPoolExecutor(10, 10,
>> > > >>            0L, TimeUnit.MILLISECONDS,
>> > > >>            new LinkedBlockingQueue<Runnable>()) {
>> > > >>   @Override
>> > > >>           protected void beforeExecute(final Thread t, final
>> Runnable
>> > > r) {
>> > > >>   ThreadContext.setApplication(BgProcessApplication.this);
>> > > >>           };
>> > > >>           @Override
>> > > >>           protected void afterExecute(final Runnable r, final
>> > Throwable
>> > > >> t) {
>> > > >>           ThreadContext.setApplication(null);
>> > > >>           }
>> > > >> };
>> > > >>
>> > > >> seems to work.
>> > > >>
>> > > >> On Thu, Nov 20, 2014 at 8:33 PM, Warren Bell <
>> > > warrenb@clarksnutrition.com>
>> > > >> wrote:
>> > > >>
>> > > >>> I have seen this from a 2010 post:
>> > > >>>
>> > > >>> final Application app = Application.get();
>> > > >>>          final ExecutorService service = new
>> > > >>> ScheduledThreadPoolExecutor(1) {
>> > > >>>            @Override
>> > > >>>            protected void beforeExecute(final Thread t, final
>> > Runnable
>> > > >>> r) {
>> > > >>>              Application.set(app);
>> > > >>>            };
>> > > >>>            @Override
>> > > >>>            protected void afterExecute(final Runnable r, final
>> > > Throwable
>> > > >>> t) {
>> > > >>>              Application.unset();
>> > > >>>            }
>> > > >>>          };
>> > > >>>
>> > > >>> But there is no more Application#set(app) and Application#unset()
>> in
>> > > >>> Wicket 6. Does Wicket 6 have some built in way of creating
>> secondary
>> > > >>> processes, maybe an internal thread pool that can be set-up ?
>> > > >>>
>> > > >>> Warren Bell
>> > > >>>
>> > > >>> On Nov 20, 2014, at 10:03 AM, Warren Bell <
>> > warrenb@clarksnutrition.com
>> > > >>> <ma...@clarksnutrition.com>> wrote:
>> > > >>>
>> > > >>> Ernesto, great job putting all that code together so quickly. I
>> > cloned
>> > > >>> your project and cherry picked out the code that I needed, I don’t
>> > > need all
>> > > >>> the process progress code you have. I don’t really care what the
>> > > process
>> > > >>> progress is or even if it completes ok, just don’t want it
>> holding up
>> > > my
>> > > >>> response.
>> > > >>>
>> > > >>> I ended up using your ExecutionBridge, TasksRunnable, and ITask
>> > classes
>> > > >>> and interfaces. But I still don’t know where and how to inject my
>> > > service
>> > > >>> into this new task/thread or ExecutionBridge without getting this
>> > > exception:
>> > > >>>
>> > > >>> Exception in thread "pool-1-thread-1"
>> > > >>> org.apache.wicket.WicketRuntimeException: There is no application
>> > > attached
>> > > >>> to current thread pool-1-thread-1
>> > > >>>
>> > > >>> Do I need to get the application attached to my new threads
>> somehow
>> > so
>> > > I
>> > > >>> can use my injected service, and if so, how do I do that ?
>> > > >>>
>> > > >>> Warren
>> > > >>>
>> > > >>> On Nov 20, 2014, at 5:47 AM, Ernesto Reinaldo Barreiro <
>> > > >>> reiern70@gmail.com<ma...@gmail.com><mailto:
>> > > reiern70@gmail.com>>
>> > > >>> wrote:
>> > > >>>
>> > > >>> Martin,
>> > > >>>
>> > > >>> I have created
>> > > >>>
>> > > >>> https://github.com/reiern70/antilia-bits/tree/master/bgprocess
>> > > >>>
>> > > >>> My only caveats are
>> > > >>>
>> > > >>>
>> > > >>>
>> > >
>> >
>> https://github.com/reiern70/antilia-bits/blob/master/bgprocess/src/main/java/com/antilia/panel/TasksListPanel.java#L50
>> > > >>>
>> > > >>> and
>> > > >>>
>> > > >>>
>> > > >>>
>> > >
>> >
>> https://github.com/reiern70/antilia-bits/blob/master/bgprocess/src/main/java/com/antilia/panel/TasksListPanel.java#L70
>> > > >>>
>> > > >>> I had to re-add Timer behavior: I do not see yet why? It is as if
>> the
>> > > >>> timer
>> > > >>> is not re-rendered: they are not isTemporar :-( I will check when
>> I
>> > > have
>> > > >>> more time.
>> > > >>>
>> > > >>> I would appreciate if you can review the code... before I write
>> > > anything
>> > > >>> on
>> > > >>> my fork  of Wicket in Action. This probably could be done in a
>> leaner
>> > > way
>> > > >>> mounting a resource to serve JSON for task states and building
>> the UI
>> > > at
>> > > >>> client side... But example illustrates how to do it with "plain
>> > > Wicket".
>> > > >>>
>> > > >>>
>> > > >>> On Thu, Nov 20, 2014 at 8:40 AM, Ernesto Reinaldo Barreiro <
>> > > >>> reiern70@gmail.com<ma...@gmail.com><mailto:
>> > > reiern70@gmail.com>>
>> > > >>> wrote:
>> > > >>>
>> > > >>> Ok. Let me see what I can do this weekend while I wait for my son
>> to
>> > > >>> finish he's shower after he's football match  ;-)
>> > > >>>
>> > > >>> On Thu, Nov 20, 2014 at 8:30 AM, Martin Grigorov <
>> > mgrigorov@apache.org
>> > > >>> <ma...@apache.org>>
>> > > >>> wrote:
>> > > >>>
>> > > >>> Sure! Thanks!
>> > > >>> It could be as fancy as you wish.
>> > > >>>
>> > > >>> Martin Grigorov
>> > > >>> Wicket Training and Consulting
>> > > >>> https://twitter.com/mtgrigorov
>> > > >>>
>> > > >>> On Thu, Nov 20, 2014 at 10:17 AM, Ernesto Reinaldo Barreiro <
>> > > >>> reiern70@gmail.com> wrote:
>> > > >>>
>> > > >>> Can I give it a try? Something event showing some progress at
>> client
>> > > >>> side?
>> > > >>>
>> > > >>> On Thu, Nov 20, 2014 at 7:54 AM, Martin Grigorov <
>> > mgrigorov@apache.org
>> > > >
>> > > >>> wrote:
>> > > >>>
>> > > >>> Hi,
>> > > >>>
>> > > >>> Someday I'll write a blog (with a demo) about this at
>> > > >>> http://wicketinaction.com.
>> > > >>> The question is being asked regularly.
>> > > >>>
>> > > >>> Actually anyone can send a Pull Request at
>> > > >>> https://github.com/dashorst/wicketinaction.com with such article.
>> > > >>>
>> > > >>> Martin Grigorov
>> > > >>> Wicket Training and Consulting
>> > > >>> https://twitter.com/mtgrigorov
>> > > >>>
>> > > >>> On Thu, Nov 20, 2014 at 7:26 AM, Ernesto Reinaldo Barreiro <
>> > > >>> reiern70@gmail.com> wrote:
>> > > >>>
>> > > >>> Hi Warren,
>> > > >>>
>> > > >>>
>> > > >>> On Thu, Nov 20, 2014 at 12:46 AM, Warren Bell <
>> > > >>> warrenbell2@gmail.com>
>> > > >>> wrote:
>> > > >>>
>> > > >>> I am using Wicket 6 REST annotations and want to asynchronously
>> > > >>> start a
>> > > >>> process that writes some logging data to a db. I don’t need the
>> > > >>> response
>> > > >>> to
>> > > >>> wait for this process. I have tried using threads, but I get the
>> > > >>> “App
>> > > >>> not
>> > > >>> attached to this thread” exception when I try to use an injected
>> > > >>> service.
>> > > >>> This logging process is a little more complicated than what log4j
>> > > >>> or
>> > > >>> loopback can do. The bottom line is that I do not want the
>> > > >>> request/response
>> > > >>> process to have to wait for the logging process to complete. What
>> > > >>> is
>> > > >>> the
>> > > >>> proper way of doing this in Wicket 6 using an injected service.
>> > > >>>
>> > > >>> Sometimes  what I do is I create a context class ServiceHolder,
>> > > >>> inject
>> > > >>> what I need on this class (e.g. services) and pass this to the non
>> > > >>> web
>> > > >>> thread (e.g as an argument to the runnable). Injector.inject will
>> > > >>> have
>> > > >>> WicketApp in context.
>> > > >>>
>> > > >>>
>> > > >>> 1) Get request
>> > > >>> 2) Log some data (Do not wait for this to complete)
>> > > >>> 3) Process request
>> > > >>> 4) Return response
>> > > >>>
>> > > >>>
>> > > >>> You could use the same ServiceHolder as a bridge to pass info to
>> the
>> > > >>> WEB
>> > > >>> layer. 1) keep a reference to it 2) in another (polling) request
>> > > >>> use it
>> > > >>> to
>> > > >>> see how back-ground job is progressing. Sometimes I also use it to
>> > > >>> control
>> > > >>> the Job: e.g. stop/pause it, cancel it. Once Job finishes just let
>> > > >>> service
>> > > >>> holder "go".
>> > > >>>
>> > > >>>
>> > > >>> Thanks,
>> > > >>>
>> > > >>> Warren Bell
>> > > >>>
>> > > >>>
>> ---------------------------------------------------------------------
>> > > >>> To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>> > > >>> For additional commands, e-mail: users-help@wicket.apache.org
>> > > >>>
>> > > >>>
>> > > >>>
>> > > >>>
>> > > >>> --
>> > > >>> Regards - Ernesto Reinaldo Barreiro
>> > > >>>
>> > > >>>
>> > > >>>
>> > > >>>
>> > > >>>
>> > > >>> --
>> > > >>> Regards - Ernesto Reinaldo Barreiro
>> > > >>>
>> > > >>>
>> > > >>>
>> > > >>>
>> > > >>>
>> > > >>> --
>> > > >>> Regards - Ernesto Reinaldo Barreiro
>> > > >>>
>> > > >>>
>> > > >>>
>> > > >>>
>> > > >>> --
>> > > >>> Regards - Ernesto Reinaldo Barreiro
>> > > >>>
>> > > >>> --
>> > > >>> This email was Virus checked by Clark's Nutrition's Astaro
>> Security
>> > > >>> Gateway.
>> > > >>>
>> > > >>>
>> > > >>
>> > > >>
>> > > >> --
>> > > >> Regards - Ernesto Reinaldo Barreiro
>> > > >>
>> > > >
>> > > >
>> > > >
>> > > > --
>> > > > Regards - Ernesto Reinaldo Barreiro
>> > >
>> > >
>> > > ---------------------------------------------------------------------
>> > > To unsubscribe, e-mail: users-unsubscribe@wicket.apache.org
>> > > For additional commands, e-mail: users-help@wicket.apache.org
>> > >
>> > >
>> >
>> >
>> > --
>> > Regards - Ernesto Reinaldo Barreiro
>> >
>>
>
>
>
> --
> Regards - Ernesto Reinaldo Barreiro
>



-- 
Regards - Ernesto Reinaldo Barreiro

Re: What is the proper way to start a secondary process in Wicket 6

Posted by Ernesto Reinaldo Barreiro <re...@gmail.com>.
De rien!

2015-01-05 9:54 GMT+00:00 Francois Meillet <fr...@gmail.com>:

> Thanks Ernesto !
>
> François Meillet
>
>
>
>
> Le 5 janv. 2015 à 10:38, Ernesto Reinaldo Barreiro <re...@gmail.com> a
> écrit :
>
> > Martin
>
>


-- 
Regards - Ernesto Reinaldo Barreiro

Re: What is the proper way to start a secondary process in Wicket 6

Posted by Francois Meillet <fr...@gmail.com>.
Thanks Ernesto !

François Meillet




Le 5 janv. 2015 à 10:38, Ernesto Reinaldo Barreiro <re...@gmail.com> a écrit :

> Martin