SunQuest
           Java Help
 
Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
User Name:
Password:
Remember me
Go Back   Dev Shed ForumsProgramming LanguagesJava Help

Reply
Add This Thread To:
  Del.icio.us   Digg   Google   Spurl   Blink   Furl   Simpy   Y! MyWeb 
Thread Tools Search this Thread Rate Thread Display Modes
 
Unread Dev Shed Forums Sponsor:
AT&T devCentral & BlackBerry(r) Webcast Series: BlackBerry and GPS -Build Location Awareness into your BlackBerry Applications, July 10th-1:00PM EST. Register Today!
  #1  
Old March 15th, 2002, 02:25 PM
harisk harisk is offline
Junior Member
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Mar 2002
Posts: 1 harisk User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: < 1 sec
Reputation Power: 0
Question Registering callback

Is it possible to register a "callback" function inside servlet which is then called when http connection is terminated. I a developing a servlet which do heavy processing which takes a time. I would like to have servlet stop and exit if user terminates connection.
Right now servlet is active (thread is alive) until it finishes and then generated output is discarded.
TIA
Haris

Reply With Quote
  #2  
Old March 16th, 2002, 09:07 AM
oscagne oscagne is offline
Java Developer
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Nov 2001
Posts: 5 oscagne User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: < 1 sec
Reputation Power: 0
Hi,

Interesting question....

On the client side I would try to do one of the following
1) have a button which is the first thing that loads on the page, and that is a close button, which will then submit back to the same servlet
2) Use javascript to capture the window close event and probably submit back to the serlet on that, or beriefly open another window to do the submission.

Neither of those are really the servlet bit of it though. What I suggest though is that you declare a static member variable boolean that is you processing switch. Then this variable can be checked at frequent intervals in your processing algorithm, and exit it if the processing is switched off.

I'll do a little walk through

1) your httprequest comes in to do you massive processing task.
2) you set processing to true
3) send your close mechanism to the browser (lets say for arguement the close button).
4) process away
5) if the close button is clicked you capture this in your servlet, and set your processing to false. This alerts the thread thats running the massive processing task to stop the loop next time it checks if it needs to continue processing

Is this clear? I could do some example code if this isn't detailed enough

Oscagne

Reply With Quote
  #3  
Old March 16th, 2002, 07:14 PM
harisk harisk is offline
Junior Member
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Mar 2002
Posts: 1 harisk User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: < 1 sec
Reputation Power: 0
Thanks for thoughts, but I need to keep things simple on client side. I found myself often impatient and just hit reload if the response text did not came soon enough, not to talk about other users.
The ideal situation would be if servlet could have knowledge of TCP socket assigned to the conneciton . "The callback" would be to the socket disconnect.
Haris

Reply With Quote
  #4  
Old March 17th, 2002, 07:22 AM
oscagne oscagne is offline
Java Developer
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Nov 2001
Posts: 5 oscagne User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: < 1 sec
Reputation Power: 0
Hi,

I haven't a clue whether this'd work, but why don't you try the following....

Instead of getting a printwriter for the servlet output why not get the output stream instead.

Then at frequent itervals write a space (assuming your outputing HTML then this has no visible effects) to the output stream, make sure you wrap a try catch (for IOException) around this, and if you get this exception then exit the algorithm

Any good?

Oscagne

Reply With Quote
  #5  
Old March 18th, 2002, 08:31 AM
harisk harisk is offline
Junior Member
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Mar 2002
Posts: 1 harisk User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: < 1 sec
Reputation Power: 0
Hi Oscagne
I tried your idea and it did not work.
print;flush to the ServletOutputSteam did not generate any exception. I made servlet to post status on the console screen and I could see it processing loop. After I disconnected browser nothing happened. Servlet itself just waited to finish processing and then normally exited.
Any new ideas?
I'll keep investigating
Thanks,
Haris

Reply With Quote
  #6  
Old March 18th, 2002, 04:53 PM
oscagne oscagne is offline
Java Developer
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Nov 2001
Posts: 5 oscagne User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: < 1 sec
Reputation Power: 0
Hi,

Ok, I've thought of a few things

1) I thought that the idea for the outputstream was only a vague possibility, but I just saw the IOException of outputstream and thought it might work...2 things about this before you abandon it
a) you might want to use the outputstream methods (write (byte [])) instead, as they might behave differently (i.e. not be quite as protected)
b) Try sending more stuff to the client when you do your checking, as although the flush is done, this doesn't guarentee it's gone. I think all it does is send it to the TCP/IP layer, which can behave how it wants... It might hang around waiting for a packet to be filled. So maybe you should try sending a lot of blanks down it...I recommend at least 2000 a byte [], but the more the better.

2) Another way could be to get an applet on the client side that can periodically be contacted to find out if the client is available. This wouldn't be too tricky to do I shouldn't think.

3) The javascript (although I hate the stuff with a passion), is probably still possible, you just have to catch the window close event and contact the server in some way when it occurs.

4) You could get the page being refreshed on a regular basis, which would keep the server informed that it was still there, and cancel the algorithm after a predetermined time out.

5) Periodically you could send javascript function calls to the browser to communicate back to the server (similar to 4), but this wouldn't be in timed intervals, only at the times when the check is being done.

Regarding 4 and 5...What sort of connection will there be betwen client and browser... is it reliable? (i.e. is it guarenteed that you can get end to end and back again communication in under 10 seconds for example)

If I had to choose I'd say that the applet in the browser was probably the best way to do it.

I'm quite tempted to give some of these a go to see which one is best, cos it's quite an intruiging idea, but at this very moment I haven't got the time.

Some other areas that I've had ideas in (but don't know to much about....yet) are server side push (think this doesn't work in IE though), DHTML, using a different mechanism (i.e. not using a servlet, but using a direct socket connection..which could work well I think), and a few other ideas, but they're kinda just floating about at the moment, so I'll have a think about them

Hope that helps

Oscagne

Reply With Quote
  #7  
Old March 19th, 2002, 07:21 AM
harisk harisk is offline
Junior Member
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Mar 2002
Posts: 1 harisk User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: < 1 sec
Reputation Power: 0
Hi ,
I found something at JDC discussion. Two solution offered: One the same as yours with Outout stream, the other one to use PrinterWriter and PrinterWriter.checkError function after write is done.
Neither worked in my case (it could be server implementation - I am trying to make things work on Domino 5.08)
Inspecting the source codefor checkError all it does is
to flush then check if output stream is null. If it is returns true.
Maybe it waits for packet to fills but sending a lot of spaces may use my bndwidth in case of number of connection. I'll try to see how things works with Webspehere.
Thanks

Reply With Quote
  #8  
Old March 19th, 2002, 03:37 PM
oscagne oscagne is offline
Java Developer
Dev Shed Newbie (0 - 499 posts)
 
Join Date: Nov 2001
Posts: 5 oscagne User rank is Just a Lowly Private (1 - 20 Reputation Level) 
Time spent in forums: < 1 sec
Reputation Power: 0
Hi,

Right curiosity beat me. I coded a little example of the outputstream version and ran it under tomcat, with IE 6 as the broswer and on WinXP.

It worked perfectly, and didn't work just on browser closure, but also on browser stops and refreshes.

Hope you get it working, otherwise give the forum a shout and I'll post my code

If you were worried about bandwith I wouldn't be, as 2000 bytes is very little, and even on a slow modem would take less than a second (particularly as with compression and it being all the same byte it'll be nothing)

Oscagne

Reply With Quote
Reply

Viewing: Dev Shed ForumsProgramming LanguagesJava Help > Registering callback


Thread Tools  Search this Thread 
Search this Thread:

Advanced Search
Display Modes  Rate This Thread 
Rate This Thread:


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off
View Your Warnings | New Posts | Latest News | Latest Threads | Shoutbox
Forum Jump


Forums: » Register « |  User CP |  Games |  Calendar |  Members |  FAQs |  Sitemap |  Support | 
  
 





© 2003-2008 by Developer Shed. All rights reserved. DS Cluster 2 hosted by Hostway