RE: Permanent servlet in TC7

2012-07-31 Thread Chip McVey
Thanks to all for the input - I am ending up doing some refactoring to follow 
Ben's advice wrt a POJO that does the heavy lifting stored in context, making 
the destroy() essentially a no-op rather than doing full shutdown, and using 
the ContextListener to really do final shutdown using the POJO when the context 
itself is destroyed.

-Original Message-
From: Ben Souther [mailto:b...@souther.us] 
Sent: Friday, July 27, 2012 1:56 PM
To: users@tomcat.apache.org
Subject: RE: Permanent servlet in TC7

On Thu, 2012-07-26 at 19:54 +0000, Chip McVey wrote:
> So I'm looking for a guarantee that no automatic destroys will happen 
> going forward just because Tomcat decides to do it on its own.  If it 
> is instructed to shutdown/undeploy/unload by some outside system or by 
> a human user, that's fine, I'm not worried about that.  But I don't 
> want these servlets to be destroyed just because Tomcat decides to do 
> so for whatever reason.

If I were looking for permanence, I would create POJO, bind it to context 
scope, and then call it from my servlets, passing it whatever it needs to 
function.





RE: Permanent servlet in TC7

2012-07-26 Thread Chip McVey
Hi Chris,

Thanks for the response.  Sorry, where I said "...unload a server any time" I 
should have said 'servlet'.

I have read that Tomcat does not unload servlets (even though it would be 
permissible to do so), but as you say, I have done some logging in the destroy 
method, and I see this behavior.

Here's the scenario:  I have 3 webapps, let's call them A, B, C.  They are all 
hosted in the same TC7 instance currently, but they could also all be hosted on 
different machines in different TC7 containers.

A certain servlet within app B & C (let's call them B1 and C1) upon init make a 
call to a servlet in app A (let's call it A1). What I see is A1, B1, and C1 all 
initialize. The init is done by a thread called " pool-2-thread-1", which seems 
like a system thread.  Ok no problem.

Then, for some reason, A1's destroy method is called, and it is called by a 
thread named " http-apr-8080-exec-3", making me think it is being called by a 
thread processing the request for either B1 or C1, since no other requests from 
anyone outside of B or C have happened yet.

After destroy winds down, then, A1's init method is called by a thread named " 
http-apr-8080-exec-11" - another request processing thread I assume.   
Everything all works out in the end, and after that I don't see A1, B1, or C1 
ever destroyed - but am I guaranteed that they won't ever be destroyed again 
unless TC is shutdown or they are manually unloaded?

I understand that given servlets can by spec go up & down, maybe using them was 
not the right choice for an application that needs permanency, but we're too 
late in development to make that switch now.

So I'm looking for a guarantee that no automatic destroys will happen going 
forward just because Tomcat decides to do it on its own.  If it is instructed 
to shutdown/undeploy/unload by some outside system or by a human user, that's 
fine, I'm not worried about that.  But I don't want these servlets to be 
destroyed just because Tomcat decides to do so for whatever reason.

Hope that helps clarify, and thanks for the feedback.

-Original Message-
From: Christopher Schultz [mailto:ch...@christopherschultz.net] 
Sent: Thursday, July 26, 2012 12:38 PM
To: Tomcat Users List
Subject: Re: Permanent servlet in TC7

-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

Chip,

On 7/26/12 3:19 PM, Chip McVey wrote:
> In TC7, is there a way to tell Tomcat to never unload a given servlet 
> unless Tomcat itself is being shutdown?  I want a single servlet 
> instance that I can know will exist for the life of the tomcat process 
> without being unloaded & reloaded (unless someone manually instructs 
> Tomcat to do so, of course).
> 
> Yes, I know I'm "not supposed to do this" and that the servlet spec 
> says a container is allowed to unload a server any time as long as a 
> request is not in process.  I still would like to know if there's some 
> Tomcat specific way to tell TC7 to never unload the servlet. And yes, 
> I realize even if there is such a way that future versions of Tomcat 
> may remove this capability.  :)

You have said both "servlet" and "server": which did you mean?

Do you need a particular web application to stay loaded? That's easy:
simply don't undeploy it.

Do you need a single (or multiple) servlet(s) to stay loaded all the time? 
That's also easy: I don't believe Tomcat ever actually unloads a servlet. (You 
can easily test this by implementing the destroy() method and emitting some 
kind of log).

What is it about the servlet that it needs to stay loaded? Servlets aren't 
really supposed to have any state, so unloading and re-loading the servlet 
shouldn't represent anything traumatic to your web application.

If you have to have some kind of data loaded all the time, consider moving that 
data into the ServletContext (aka "application")
attributes: then the servlet can be unloaded and re-loaded at will and the data 
will persist.

- -chris
-BEGIN PGP SIGNATURE-
Version: GnuPG/MacGPG2 v2.0.17 (Darwin)
Comment: GPGTools - http://gpgtools.org
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/

iEYEARECAAYFAlARnJ8ACgkQ9CaO5/Lv0PCaGQCgv7Kgkl04ElbBu5bkqNtuuX+v
5OsAn1MSf6i3CH9vIogXTb+aUKRYq0WN
=6vQK
-END PGP SIGNATURE-

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


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



Permanent servlet in TC7

2012-07-26 Thread Chip McVey
Hi,



In TC7, is there a way to tell Tomcat to never unload a given servlet unless 
Tomcat itself is being shutdown?  I want a single servlet instance that I can 
know will exist for the life of the tomcat process without being unloaded & 
reloaded (unless someone manually instructs Tomcat to do so, of course).



Yes, I know I'm "not supposed to do this" and that the servlet spec says a 
container is allowed to unload a server any time as long as a request is not in 
process.  I still would like to know if there's some Tomcat specific way to 
tell TC7 to never unload the servlet.  And yes, I realize even if there is such 
a way that future versions of Tomcat may remove this capability.  :)



Thanks in advance,

Chip