Solved

JSP (page direction) problem.

Posted on 2002-03-12
12
448 Views
Last Modified: 2008-03-10
Hi,
First, my set-up is.. weblogic, ejb backend, jsp front end, with a servlet brokering requests.

My problem is that I need to execute some serverside work, as a result of a POST request, that can take up to 2 hours to complete (legacy system). Therefore the browser times out b4 it's completed......

In "pseudocode" what I (the servlet) need to do is...

* recieve and handle POST request
* display a re-freshing "please wait" page/jsp to avoid
  the browser timing out the request.
* execute the work that can take hours.
* redirect to "finished" page & display details.

The main difficultly is that you seem to be only able to call HttpServletResponse::sendRedirect() *once*, it says so in the docs.

So I call it once to display the "please wait" page, but then can't call it again to show the "finished" page.

But also, weblogic seems to ignore my request to display the "please wait" page until *after* the 2-hour long method executes! I've tried flushing the buffers but it doesn't help.

any suggestions greatly appreciated!
thanks,
sd

0
Comment
Question by:somadude
  • 3
  • 2
  • 2
  • +5
12 Comments
 

Expert Comment

by:ph0rman
ID: 6857181
One possibility would be to use javascript to create a new window just before the submit is processed.  the new window would display the "please wait" and could do refreshing to avoid timeouts.  Once the initial window is finished processing it can close that secondary window via javascript.  The down-side is that you end up with two windows rather than one.

You could also do some shenanigans using frames and create the same type of behavior if keeping it one window is important.
0
 
LVL 18

Expert Comment

by:bobbit31
ID: 6857280
0
 
LVL 18

Expert Comment

by:bobbit31
ID: 6857326
use thread, something like this:

public class BackgroundProcessorServlet extends HttpServlet implements Runnable {

     private static final int NOT_WORKING = 0;    
     private static final int WORKING = 1;

     Thread runner; // this is the thread that does the work
     int status;
     String strStatus;
     
     public void init(ServletConfig config) throws ServletException
     {
          super.init(config);
     
          status = NOT_WORKING;
          strStatus = "Not working";
     }


     public void doGet(HttpServletRequest req, HttpServletResponse res)
                         throws ServletException, IOException {

          res.setContentType("text/html");
          PrintWriter out = res.getWriter();

          if (status != WORKING) {
               runner = new Thread(this);
               runner.setPriority(Thread.MIN_PRIORITY); // be nice ;)
               runner.start();

               strStatus = "Working";
               status = WORKING;
          }
         
          out.println(strStatus);
          return;
     }



     public void doPost(HttpServletRequest req, HttpServletResponse res)
                         throws ServletException, IOException {
          doGet(req,res);
          return;
     }    

     public void run() {

          // make the thread do whatever you need it to do

          // when your done, set strStatus and status back to not working
     }

}    


0
 
LVL 86

Expert Comment

by:CEHJ
ID: 6858704
Don't know if this would work, but you could try to add this to your headers of your 'wait' screen.
<META HTTP-EQUIV=Refresh CONTENT="180; URL=http://www.your-wait-page.jsp/"> This *should* cause is to refresh every three minutes in your browser. You could maybe then get the servlet to check a variable and redirect when the data is available, otherwise simply return.
0
 
LVL 1

Expert Comment

by:gigsvoo
ID: 6859164
Look at this website:

http://www.jdance.com
0
 

Author Comment

by:somadude
ID: 6859997
CEHJ - I actually tried a something almost exactly like that a few days ago. What I did was..

* redirect to wait page
* continue processing
* wait-page checks flag in session to see if processing is
  finished, if finished, redirect to finish-page.
* processing is finished, flag is set in session

I thought this was going to work, but there are 2 problems

1) you can only call response.sendRedirect once
2) alot of the time, weblogic won't even display the
   wait-page until the server-side processing is
   finished. ??
0
Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 
LVL 86

Expert Comment

by:CEHJ
ID: 6860016
As far as the problems are concerned:

1) Surely you only need to redirect once per page - once to the 'wait' page, then once to the 'finished' page (redirected *by* the wait page)?

2) You are doing the processing in another thread aren't you?

Of course, you really need messaging paradigms for this sort of thing...
0
 
LVL 3

Accepted Solution

by:
saxaboo earned 200 total points
ID: 6860119
Hi,

having faced this problem a number of times, I'm truly convinced that the solution is not such or such technical trick.
The real question is : do you really need synchronous processing ?

Imagine one of you users posting data to your app, which sends it to your back-end and manages to somewhat make the browser "wait" for the response. Your user is very unlikely to wait for the response doing nothing but looking at the browser screen. He or she will probably return back to Word or PowerPoint to do something else, maybe have a coffee break, and maybe every 15 minutes he or she will Alt-tab to IE to see if the result is here.

My point is : even if your system is synchronous, your end-user is probably not. I may be mistaken but the question is worth asking.

A more "conventional" solution would therefore be to launch the task as an asynchronous process, by starting a thread like bobbit31 suggested (better : use a Message-driven bean !), or using a MOM like MQSeries, and immediately returning a page saying "Your request is being processed. Check out <a href="/results_received.jsp">this page</a> for results every 2 hours or so !"

When you task completes, it writes something somewhere in your local DB (or in a file, or whatever ...) saying "the request submitted by user 'chandler' returned the following results : blah blah ...."

And your results_received.jsp questions your DB to check if any results have been received from the back-end.

As a conclusion, I suggest you to work on the functional side first

-S
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 6860147
I'd go along with Saxaboo on this one, as the last line of my previous message suggests.

You could even implement a quick and dirty email solution!
0
 

Author Comment

by:somadude
ID: 6861134
saxaboo - yeah I agree with you, I actually started checking out JMS this morning, looks like it could be the ticket.
0
 
LVL 9

Expert Comment

by:Venci75
ID: 7901842
No comment has been added lately, so it's time to clean up this TA.
I will leave a recommendation in the Cleanup topic area that this question is:
Answered by: saxaboo
Please leave any comments here within the next seven days.
 
PLEASE DO NOT ACCEPT THIS COMMENT AS AN ANSWER!
 
Venci75
EE Cleanup Volunteer
0
 
LVL 5

Expert Comment

by:Netminder
ID: 7962606
Per recommendation, force-accepted.

Netminder
EE Admin
0

Featured Post

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

Suggested Solutions

For beginner Java programmers or at least those new to the Eclipse IDE, the following tutorial will show some (four) ways in which you can import your Java projects to your Eclipse workbench. Introduction While learning Java can be done with…
Introduction This article is the first of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article explains our test automation goals. Then rationale is given for the tools we use to a…
Viewers learn about the scanner class in this video and are introduced to receiving user input for their programs. Additionally, objects, conditional statements, and loops are used to help reinforce the concepts. Introduce Scanner class: Importing…
Viewers will learn about the different types of variables in Java and how to declare them. Decide the type of variable desired: Put the keyword corresponding to the type of variable in front of the variable name: Use the equal sign to assign a v…

747 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

13 Experts available now in Live!

Get 1:1 Help Now