You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by "Campbell, Lance" <la...@illinois.edu> on 2017/07/18 13:56:42 UTC

run thread from servlet

Tomcat 8.0.x
Question:
I am wanting to know the proper way to start a thread from a servlet.

Use Case:
A batch process will call a URL that is a servlet.  The servlet will call a processes that will trigger a thread to run to do a particular job.  The thread will run for a while.  The servlet will not wait on the thread to finish running.  Also the thread that is started is running a processes that requires there to only be one of these processes running at any given time.

What I have done:
I created a class I call EmailProcess.  I have a static Boolean flag in the class called isWorking that indicates if the process is running.  The class extends Runnable.  The class also has a static method to start the thread if isWorking flag is false.  I have a servlet that will call the static method in EmailProcess to start the thread if possible.

Note: If the Tomcat container decides to clean up the servlet that is called that triggers the thread I don't want it to mess with the thread.  I want it to keep on running.

Thanks for your advice.

Lance


Re: run thread from servlet

Posted by Christopher Schultz <ch...@christopherschultz.net>.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Lance,

On 7/19/17 7:35 AM, Campbell, Lance wrote:
> Thanks for your information.  So when I have a process that I want
> to run as a thread I would assume I need to implement the
> interface ServletContextListener.   I would also assume that the
> servlet that creates the process will call the following method:
> 
> this.getServletContext().addListener(myProcess)
> 
> That way the Tomcat container can send a message to myProcess to
> tell it to end itself because Tomcat is trying to stop.
> 
> Did I understand that correctly?

I'm not entirely sure I understand what /you/ are saying above. I'll
explain.

During context ("webapp") startup, Tomcat will call init() on any
registered ServletContextListeners. You can register them either via
configuration in web.xml or via code annotations.

During context shutdown, Tomcat will call destroy() on those same
listeners.

Your servlets do not need to do anything to interact with those
listeners: no need to call addListener or anything like that.

You can do anything you want in those two methods.

Here's my recommendation:

1. Write a ServletContextListener that does the following:
  a. on init(), creates an ExecutorService with as many threads as you
want (you want one-at-a-time semantics, so that would be only a single
thread).

  b. places itself into the ServletContext ("application") under a
well-known attribute name (e.g. "MyJobRunnerService").

  c. on destroy(), shuts-down the ExecutorService, potentially
cancelling any in-progress operations it's performing (in order to
shut-down quickly)

2. In your servlet that accepts jobs, grab the JobRunnerService from
the ServletContext and call a method like "submit" on the job and
stop. The ExecutorService will handle things from there.

This should give you a solution that nicely-separates your work into
two operations: submitting jobs (the servlet) and actually running the
jobs (the JobRunnerService). The ExecutorService handles the
heavy-lifting of managing threads and actually running the jobs.

Makes sense?

- -chris
-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - http://gpgtools.org
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQIcBAEBCAAGBQJZb28OAAoJEBzwKT+lPKRYc/8P/i3LnqPe/SNFPPqbhcK6o557
9ZmP4n2n8Ywt8hs4MOf2Oe+2E1Xxr46Pj73jxfpJgRkpXfCt7yRHLIRteCa5Vxt3
/aecIn7yxM3bfGJUHr8OnAnAipnN+80sUKLvjnov5lO2Mj0+GOomqtWKkSkoZGvr
itGIYuOYFBT8eYIhEaOoVgXCIBuK0s0qpNlTMxfyTnLZ6TWZSOsM8unDSWTpeHUs
G8ut9fJ8tp8Xi0seMAu4crMLEg7d3FiALhtGFrDIS8UzB9xYCWuY797D2+s8673u
u9bIWtIXwjrEzmAuIWRZm7MEO7R0IY8a5iMK+qvNMPNEVIAglMZPI2//YllmNwq+
tQDrvsS6zKzgMgSS1GCa45OoKphOl2ea7bR7Y7rmf1zT1UviKqIJ9EBFXUliE9dQ
zub87m7aRdQNovgU2h/ZGUYoTjFPW2WJzyAA7/hGFlsXSzMPAs3OeVNOL11EY1Pb
g97/+fkG2uY5eVTORdSvEgPulOZ0TOBc79i80hn9Kz7fG1svbSwC4F/z41Yi/rsP
K4yx2c6T+0+7DWwhxVy8Pn4vSbBAof0Vhj51jdpYYfJGExcNrmxSKsgxKftrrPOt
pjZymykGnpKzt6lNXMUseX9UOLpn1vAXzRSXIXWgno7AXNbpWfhwfuICy0f4eeq+
TrFpAV4NJdTklAZtImBm
=QyVQ
-----END PGP SIGNATURE-----

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


RE: run thread from servlet

Posted by "Campbell, Lance" <la...@illinois.edu>.
Chris,
Thanks for your information.  So when I have a process that I want to run as a thread I would assume I need to implement the interface ServletContextListener.   I would also assume that the servlet that creates the process will call the following method:

this.getServletContext().addListener(myProcess)

That way the Tomcat container can send a message to myProcess to tell it to end itself because Tomcat is trying to stop.

Did I understand that correctly?

Thanks,

Lance

-----Original Message-----
From: Christopher Schultz [mailto:chris@christopherschultz.net] 
Sent: Tuesday, July 18, 2017 4:30 PM
To: users@tomcat.apache.org
Subject: Re: run thread from servlet

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Lance,

On 7/18/17 9:56 AM, Campbell, Lance wrote:
> Tomcat 8.0.x Question: I am wanting to know the proper way to start a 
> thread from a servlet.
> 
> Use Case: A batch process will call a URL that is a servlet.  The 
> servlet will call a processes that will trigger a thread to run to do 
> a particular job.  The thread will run for a while.  The servlet will 
> not wait on the thread to finish running.  Also the thread that is 
> started is running a processes that requires there to only be one of 
> these processes running at any given time.
> 
> What I have done: I created a class I call EmailProcess.  I have a 
> static Boolean flag in the class called isWorking that indicates if 
> the process is running.  The class extends Runnable.  The class also 
> has a static method to start the thread if isWorking flag is false.  I 
> have a servlet that will call the static method in EmailProcess to 
> start the thread if possible.
> 
> Note: If the Tomcat container decides to clean up the servlet that is 
> called that triggers the thread I don't want it to mess with the 
> thread.  I want it to keep on running.

You want an ExecutorService (provided by the Java standard library), and you can limit the number of simultaneous jobs to 1. Submit the jobs to the service as they arrive, and then make sure you call
service.shutdown() when the servlet (or better yet, context) is being taken out of service. You might want to provide a way to cancel in-process jobs, otherwise you may stall container shutdown which might be inconvenient for you.

- -chris
-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - http://gpgtools.org
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQIcBAEBCAAGBQJZbn3uAAoJEBzwKT+lPKRYCTUP/1Ho+5z49FntCBrEevVxnYiO
He331XbbPN7x6XLzO8nqf82pZcjnH1DGPtZXhPdZ2DKOjqPKmSeoI3az1+s1gu6X
Igff6xoHpARdyWdVElIxHYO93QOJdIa0DtuaSgaO4HXwpZYgwxs/QwbuN9VWLK5f
4afXp0gE5VaUxZoLHb9TTVIV8t0IABXdq+m9tuKZtrihfVwyc79w0HTwDCzqHlYH
39p70KQEagzhj/ZNqUHZENvFZ+2vMHD8zGcnWtAoVzOaseNth0FtZY5aqO+2WThl
k1VpcCGIK6hsytcBXuYAtfp/H6o2ircpwa66+O1nbNuP3OLT9x4IHqe5I0KoG/zG
hPOA/ydauaTps4xoYVLPjIVfVLx4D3+Rcrsti2tlo80hRK4Mv3SEeZu5eH1Zxz/N
W1MSLrVa5QOdWQ1rLMUbfWyNFXbm3xT8DrlQ3WvsAlMsRCrHkBIPqihnN7cPdRKp
m7QsQGYk/QNJ4U45ZeF/n5e/P62Dw34dHEbsefXNozvAOzykRSmwSG+6guCVXiiL
tfxC72zOiPxHUFMO8+mfXUrbsODNUjAUQA8O5dphwHGkTIni9xAL3/38dxkyaVy3
1jU2CFGaou5rdvjeL/Ixwqs4LzsY4Li0DrA5MwJVjEJG62MGK9x65NcpQ/3AtvZ4
T6lRQ5ZjJH99h9b2/ijL
=SVOd
-----END PGP SIGNATURE-----

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: run thread from servlet

Posted by Christopher Schultz <ch...@christopherschultz.net>.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

Lance,

On 7/18/17 9:56 AM, Campbell, Lance wrote:
> Tomcat 8.0.x Question: I am wanting to know the proper way to start
> a thread from a servlet.
> 
> Use Case: A batch process will call a URL that is a servlet.  The
> servlet will call a processes that will trigger a thread to run to
> do a particular job.  The thread will run for a while.  The servlet
> will not wait on the thread to finish running.  Also the thread
> that is started is running a processes that requires there to only
> be one of these processes running at any given time.
> 
> What I have done: I created a class I call EmailProcess.  I have a
> static Boolean flag in the class called isWorking that indicates if
> the process is running.  The class extends Runnable.  The class
> also has a static method to start the thread if isWorking flag is
> false.  I have a servlet that will call the static method in
> EmailProcess to start the thread if possible.
> 
> Note: If the Tomcat container decides to clean up the servlet that
> is called that triggers the thread I don't want it to mess with the
> thread.  I want it to keep on running.

You want an ExecutorService (provided by the Java standard library),
and you can limit the number of simultaneous jobs to 1. Submit the
jobs to the service as they arrive, and then make sure you call
service.shutdown() when the servlet (or better yet, context) is being
taken out of service. You might want to provide a way to cancel
in-process jobs, otherwise you may stall container shutdown which
might be inconvenient for you.

- -chris
-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - http://gpgtools.org
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQIcBAEBCAAGBQJZbn3uAAoJEBzwKT+lPKRYCTUP/1Ho+5z49FntCBrEevVxnYiO
He331XbbPN7x6XLzO8nqf82pZcjnH1DGPtZXhPdZ2DKOjqPKmSeoI3az1+s1gu6X
Igff6xoHpARdyWdVElIxHYO93QOJdIa0DtuaSgaO4HXwpZYgwxs/QwbuN9VWLK5f
4afXp0gE5VaUxZoLHb9TTVIV8t0IABXdq+m9tuKZtrihfVwyc79w0HTwDCzqHlYH
39p70KQEagzhj/ZNqUHZENvFZ+2vMHD8zGcnWtAoVzOaseNth0FtZY5aqO+2WThl
k1VpcCGIK6hsytcBXuYAtfp/H6o2ircpwa66+O1nbNuP3OLT9x4IHqe5I0KoG/zG
hPOA/ydauaTps4xoYVLPjIVfVLx4D3+Rcrsti2tlo80hRK4Mv3SEeZu5eH1Zxz/N
W1MSLrVa5QOdWQ1rLMUbfWyNFXbm3xT8DrlQ3WvsAlMsRCrHkBIPqihnN7cPdRKp
m7QsQGYk/QNJ4U45ZeF/n5e/P62Dw34dHEbsefXNozvAOzykRSmwSG+6guCVXiiL
tfxC72zOiPxHUFMO8+mfXUrbsODNUjAUQA8O5dphwHGkTIni9xAL3/38dxkyaVy3
1jU2CFGaou5rdvjeL/Ixwqs4LzsY4Li0DrA5MwJVjEJG62MGK9x65NcpQ/3AtvZ4
T6lRQ5ZjJH99h9b2/ijL
=SVOd
-----END PGP SIGNATURE-----

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: run thread from servlet

Posted by Mark Thomas <ma...@apache.org>.
On 18/07/17 18:07, Campbell, Lance wrote:
> Also if tomcat is shut down and a thread is running how does tomcat communicate with my software to end a thread?

It can't. The thread will either just stop if it is a Daemon thread or
the Java process won't exit until your thread does.

>  Is this where you were referring to the servlet context listener? 

Yes. That is a good way to start/stop threads.

> 
> -----Original Message-----
> From: Campbell, Lance [mailto:lance@illinois.edu] 
> Sent: Tuesday, July 18, 2017 12:00 PM
> To: Tomcat Users List <us...@tomcat.apache.org>
> Subject: RE: run thread from servlet
> 
> Basically I have batch jobs that I need to run on many different web applications.  The batch jobs call servlets that then create threads to do whatever task I need done behind the scenes.  The servlets immediately return a message after starting the batch threaded job.    However my understanding is that there can be issues with Tomcat detecting memory leaks if you have a thread spawned by a servlet.  So I was wondering if there was a better way to trigger a thread.

Memory leaks are likely because the Thread will almost certainly load
classes from the web application.

A (possibly single threaded) Executor started and stopped via a
ServletContextListener is the solution that springs to mind.

Mark


> 
> -----Original Message-----
> From: Pradip Bhattacharya [mailto:pradip.bhattacharya@gmail.com] 
> Sent: Tuesday, July 18, 2017 9:10 AM
> To: Tomcat Users List <us...@tomcat.apache.org>
> Subject: Re: run thread from servlet
> 
> Hello,
> I hope I understood the requirement correctly. I believe you can start EmailProcess thread by the context listener. This thread can wait on an object. And the servlet can enque the data in a concurrent queue, and then notify the object, on which EmailProcess thread is waiting.
> Is this EmailProcess is an asynchronous service to send emails ?
> Regards
> Pradip.B
> 
> On Jul 18, 2017 7:27 PM, "Campbell, Lance" <la...@illinois.edu> wrote:
> 
> Tomcat 8.0.x
> Question:
> I am wanting to know the proper way to start a thread from a servlet.
> 
> Use Case:
> A batch process will call a URL that is a servlet.  The servlet will call a processes that will trigger a thread to run to do a particular job.  The thread will run for a while.  The servlet will not wait on the thread to finish running.  Also the thread that is started is running a processes that requires there to only be one of these processes running at any given time.
> 
> What I have done:
> I created a class I call EmailProcess.  I have a static Boolean flag in the class called isWorking that indicates if the process is running.  The class extends Runnable.  The class also has a static method to start the thread if isWorking flag is false.  I have a servlet that will call the static method in EmailProcess to start the thread if possible.
> 
> Note: If the Tomcat container decides to clean up the servlet that is called that triggers the thread I don't want it to mess with the thread.  I want it to keep on running.
> 
> Thanks for your advice.
> 
> Lance
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


RE: run thread from servlet

Posted by "Campbell, Lance" <la...@illinois.edu>.
Also if tomcat is shut down and a thread is running how does tomcat communicate with my software to end a thread?  Is this where you were referring to the servlet context listener? 

-----Original Message-----
From: Campbell, Lance [mailto:lance@illinois.edu] 
Sent: Tuesday, July 18, 2017 12:00 PM
To: Tomcat Users List <us...@tomcat.apache.org>
Subject: RE: run thread from servlet

Basically I have batch jobs that I need to run on many different web applications.  The batch jobs call servlets that then create threads to do whatever task I need done behind the scenes.  The servlets immediately return a message after starting the batch threaded job.    However my understanding is that there can be issues with Tomcat detecting memory leaks if you have a thread spawned by a servlet.  So I was wondering if there was a better way to trigger a thread.  

-----Original Message-----
From: Pradip Bhattacharya [mailto:pradip.bhattacharya@gmail.com] 
Sent: Tuesday, July 18, 2017 9:10 AM
To: Tomcat Users List <us...@tomcat.apache.org>
Subject: Re: run thread from servlet

Hello,
I hope I understood the requirement correctly. I believe you can start EmailProcess thread by the context listener. This thread can wait on an object. And the servlet can enque the data in a concurrent queue, and then notify the object, on which EmailProcess thread is waiting.
Is this EmailProcess is an asynchronous service to send emails ?
Regards
Pradip.B

On Jul 18, 2017 7:27 PM, "Campbell, Lance" <la...@illinois.edu> wrote:

Tomcat 8.0.x
Question:
I am wanting to know the proper way to start a thread from a servlet.

Use Case:
A batch process will call a URL that is a servlet.  The servlet will call a processes that will trigger a thread to run to do a particular job.  The thread will run for a while.  The servlet will not wait on the thread to finish running.  Also the thread that is started is running a processes that requires there to only be one of these processes running at any given time.

What I have done:
I created a class I call EmailProcess.  I have a static Boolean flag in the class called isWorking that indicates if the process is running.  The class extends Runnable.  The class also has a static method to start the thread if isWorking flag is false.  I have a servlet that will call the static method in EmailProcess to start the thread if possible.

Note: If the Tomcat container decides to clean up the servlet that is called that triggers the thread I don't want it to mess with the thread.  I want it to keep on running.

Thanks for your advice.

Lance

RE: run thread from servlet

Posted by "Campbell, Lance" <la...@illinois.edu>.
Basically I have batch jobs that I need to run on many different web applications.  The batch jobs call servlets that then create threads to do whatever task I need done behind the scenes.  The servlets immediately return a message after starting the batch threaded job.    However my understanding is that there can be issues with Tomcat detecting memory leaks if you have a thread spawned by a servlet.  So I was wondering if there was a better way to trigger a thread.  

-----Original Message-----
From: Pradip Bhattacharya [mailto:pradip.bhattacharya@gmail.com] 
Sent: Tuesday, July 18, 2017 9:10 AM
To: Tomcat Users List <us...@tomcat.apache.org>
Subject: Re: run thread from servlet

Hello,
I hope I understood the requirement correctly. I believe you can start EmailProcess thread by the context listener. This thread can wait on an object. And the servlet can enque the data in a concurrent queue, and then notify the object, on which EmailProcess thread is waiting.
Is this EmailProcess is an asynchronous service to send emails ?
Regards
Pradip.B

On Jul 18, 2017 7:27 PM, "Campbell, Lance" <la...@illinois.edu> wrote:

Tomcat 8.0.x
Question:
I am wanting to know the proper way to start a thread from a servlet.

Use Case:
A batch process will call a URL that is a servlet.  The servlet will call a processes that will trigger a thread to run to do a particular job.  The thread will run for a while.  The servlet will not wait on the thread to finish running.  Also the thread that is started is running a processes that requires there to only be one of these processes running at any given time.

What I have done:
I created a class I call EmailProcess.  I have a static Boolean flag in the class called isWorking that indicates if the process is running.  The class extends Runnable.  The class also has a static method to start the thread if isWorking flag is false.  I have a servlet that will call the static method in EmailProcess to start the thread if possible.

Note: If the Tomcat container decides to clean up the servlet that is called that triggers the thread I don't want it to mess with the thread.  I want it to keep on running.

Thanks for your advice.

Lance

RE: run thread from servlet

Posted by "Tran, Dung Minh" <mi...@emoryhealthcare.org>.
Hello Pradip,
   Thanks for the comments. Could you please clarify the statement "the servlet can enque the data in a concurrent queue, and then
notify the object " ? Would you assume that there would be two threads in the servlet ? One is context listener thread, and the other is enqueue data thread ?
Thanks,
Tom
________________________________________
From: Pradip Bhattacharya [pradip.bhattacharya@gmail.com]
Sent: Tuesday, July 18, 2017 10:09 AM
To: Tomcat Users List
Subject: Re: run thread from servlet

Hello,
I hope I understood the requirement correctly. I believe you can start
EmailProcess thread by the context listener. This thread can wait on an
object. And the servlet can enque the data in a concurrent queue, and then
notify the object, on which EmailProcess thread is waiting.
Is this EmailProcess is an asynchronous service to send emails ?
Regards
Pradip.B

On Jul 18, 2017 7:27 PM, "Campbell, Lance" <la...@illinois.edu> wrote:

Tomcat 8.0.x
Question:
I am wanting to know the proper way to start a thread from a servlet.

Use Case:
A batch process will call a URL that is a servlet.  The servlet will call a
processes that will trigger a thread to run to do a particular job.  The
thread will run for a while.  The servlet will not wait on the thread to
finish running.  Also the thread that is started is running a processes
that requires there to only be one of these processes running at any given
time.

What I have done:
I created a class I call EmailProcess.  I have a static Boolean flag in the
class called isWorking that indicates if the process is running.  The class
extends Runnable.  The class also has a static method to start the thread
if isWorking flag is false.  I have a servlet that will call the static
method in EmailProcess to start the thread if possible.

Note: If the Tomcat container decides to clean up the servlet that is
called that triggers the thread I don't want it to mess with the thread.  I
want it to keep on running.

Thanks for your advice.

Lance

________________________________

This e-mail message (including any attachments) is for the sole use of
the intended recipient(s) and may contain confidential and privileged
information. If the reader of this message is not the intended
recipient, you are hereby notified that any dissemination, distribution
or copying of this message (including any attachments) is strictly
prohibited.

If you have received this message in error, please contact
the sender by reply e-mail message and destroy all copies of the
original message (including attachments).

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: run thread from servlet

Posted by Pradip Bhattacharya <pr...@gmail.com>.
Hello,
I hope I understood the requirement correctly. I believe you can start
EmailProcess thread by the context listener. This thread can wait on an
object. And the servlet can enque the data in a concurrent queue, and then
notify the object, on which EmailProcess thread is waiting.
Is this EmailProcess is an asynchronous service to send emails ?
Regards
Pradip.B

On Jul 18, 2017 7:27 PM, "Campbell, Lance" <la...@illinois.edu> wrote:

Tomcat 8.0.x
Question:
I am wanting to know the proper way to start a thread from a servlet.

Use Case:
A batch process will call a URL that is a servlet.  The servlet will call a
processes that will trigger a thread to run to do a particular job.  The
thread will run for a while.  The servlet will not wait on the thread to
finish running.  Also the thread that is started is running a processes
that requires there to only be one of these processes running at any given
time.

What I have done:
I created a class I call EmailProcess.  I have a static Boolean flag in the
class called isWorking that indicates if the process is running.  The class
extends Runnable.  The class also has a static method to start the thread
if isWorking flag is false.  I have a servlet that will call the static
method in EmailProcess to start the thread if possible.

Note: If the Tomcat container decides to clean up the servlet that is
called that triggers the thread I don't want it to mess with the thread.  I
want it to keep on running.

Thanks for your advice.

Lance