Ah. What is a typical length of time for a report generation? I'm
inferring this is a serious resource constraint for your system.
Rizwan Merchant wrote:
I want the variable to be reset if the browser is closed. The browser could
be closed while the report generation is in process (which is a separate
thread). There seems to be no way for the server to know that the browser
was closed. If I do not reset the session variable then I cannot start
generating another report until the first report thread dies on the server.
-----Original Message-----
From: Brett Connor [mailto:[EMAIL PROTECTED]
Sent: Friday, July 23, 2004 10:06 AM
To: Struts Users Mailing List
Subject: Re: Intermediate loading page
Surely the session variable will be reset by the report generation process,
independent of any browser windows open, therefore no problem, you never
need to know if the browser has been closed or not. Or have I misunderstood?
Brett
Rizwan Merchant wrote:
Thanks for the previous input. I moved the report generation to a
thread and set a session variable which is a boolean indicating that a
report is currently being generated. Once the report generation is
complete that session variable is set to false again.
I have come across another problem though. Say a user starts generating
a report. The boolean session variable is set to true. If the user
tries to generate another report while the fist oneis not complete,
then the boolean variable is checked and the user is not allowed to
generate another report (until the first one is complete and the
boolean session variable is set to false).
In this scenario, if the user abruptly closes the intermediate page
which is supposed to load the report , then the session variable is
still set to true (indicating report is being generated) as the thread
on the server has not finished running. If the user now tries to create
another report then s/he will not be allowed to do so (until the thread
on the server is done running).
So I guess my question is : Is there any way to set a session variable
when the user closes a browser window abruptly?
Or is there another way to approach this problem?
Thanks,
-Riz.
-----Original Message-----
From: Craig McClanahan [mailto:[EMAIL PROTECTED]
Sent: Friday, July 16, 2004 5:23 PM
To: Struts Users Mailing List
Subject: Re: Intermediate loading page
Rizwan Merchant wrote:
Hi Craig,
Thanks for the reply. I came across this solution, but does this not
mean that the user will only be able to generate one report at a time
(since we are storing the flag in the user's session)? If the user
starts generating a second report which is much smaller than the first
then would this not create a problem?
You could accomodate such a thing in several different ways, but how
would the user even start requesting the second report? If they're
sitting on the auto-repeat "Please Wait" page, they won't have the
opportunity. If you want them to be able to go request a second report
while the first one is still generating, you'll probably be better off
just navigating back to the main menu (or something) after firing off
the first thread, then let them fire off a different thread (using a
different flag) for the second report
-- then have a screen where they can "pick up" their completed reports
and display them.
If the computational effort to produce reports becomes severe, you
might also consider using some sort of job queueing package so that a
single background thread could do the report generation for all your
users (one report at a time). If you go this way, the "pick up your
completed report"
page becomes an even better idea.
Thanks again for your input. Much appreciated.
-Riz.
Craig
-----Original Message-----
From: Craig McClanahan [mailto:[EMAIL PROTECTED]
Sent: Friday, July 16, 2004 3:37 PM
To: Struts Users Mailing List
Subject: Re: Intermediate loading page
Rizwan Merchant wrote:
I am working on a web application using the Struts framework. Using a
form on a jsp page, I generate a report which is displayed in pdf on
a new screen. The report is generated through an Action class method.
I would like to display a "Please wait" screen while the report is
being generated.
The action class method calls functions that generate a pdf file and
then redirects control to that file. So I cannot use the flush()
method to send html to the browser while the report is being
generated (once a response is committed it cannot be written to
again). Neither can I use the 'div' tag method as my new page is not
a jsp page (it is a new browser window with pdf file displayed inside
it).
One common strategy for this sort of thing is to refactor your action
into several, along the following lines:
* The Action that is currently creating the PDF should instead fire
off a background thread to do the report preparation. It will then
forward to a "Please Wait" page (see below).
* The background thread should do whatever is needed to prepare the
PDF file, and set a flag variable in the user's session when it's
done, followed by terminating the thread.
* The "Please Wait" page should say something like "Report generation
in progress", and use a meta-refresh tag to automatically submit
itself every few seconds, with the destination being a "Done Yet"
action.
* The "Done Yet" action will consult the flag variable in the user's
session.
If its not there, forward back to the "Please Wait" page again. If
it's done, forward to the URL to retrieve the PDF itself.
Craig
My code is shown below....
//the jsp code calling the action
<nested:form action="/reports.do?action=getTransactionReports"
target="_blank">
// The Action class
public ActionForward getTransactionReports(ActionMapping mapping,
ActionForm form, HttpServletRequest request, HttpServletResponse
response) throws Exception {
ICustomerAdministrationClient admin_impl =
getCustomerAdministrationService(request);
//enforce user permission
enforceFeaturePermissions(EMSConstants.FEATURE_REPORTS, request, 1);
EMSBaseAdminForm admin_form = (EMSBaseAdminForm)form; ReportsForm
reportsForm = admin_form.getReportsForm();
//cant do this as it creates an IllegalStateException // PrintWriter
html = response.getWriter(); // //
html.print("<html>\n<head><title>my
test</title></head>\n<body>"); // html.print("<p><img
src=\"images/dpt_logo.jpg\"></body></html>");
// html.flush();
// html.close();
//if details type is summary then output format can only be PDF
if(reportsForm.getDetailsType().equals(EMSConstants.REPORTS_SUMMARY))
reportsForm.setOutputFormat(EMSConstants.REPORTS_FORMAT_PDF);
//generate the reports using jasper reports
doJasperReports(reportsForm, request);
CustomerForm customer_form = (CustomerForm)getSessionObject(request,
"customerForm");
Collection all_region_list_forms =
(Collection)getSessionObject(request, "allRegionListForms");
admin_form.setCustomerForm(customer_form);
admin_form.setRegionListForms(all_region_list_forms);
request.setAttribute(EMSConstants.FORM_VIEW, admin_form);
String relativePath = File.separator + "temp_" +
request.getSession().getId(); String pdfFilePath = File.separator +
"temp" + relativePath + File.separator + "ReportinPDF.pdf"; String
csvFilePath = File.separator + "temp" + relativePath + File.separator
+ "ReportinCSV.dpt";
if(reportsForm.getOutputFormat().equals(EMSConstants.REPORTS_FORMAT_P
D
F)) return (new ActionForward(pdfFilePath, true));
return (new ActionForward(csvFilePath, true)); }
Any help would be appreciated. Thanks.
---------------------------------------------------------------------
-
--
<http://www.digitalpaytech.com/>
Rizwan Merchant - Software Developer
4105 Grandview Highway, Burnaby, BC, V5C 6B4, Canada
Email: [EMAIL PROTECTED]
<mailto:[EMAIL PROTECTED]>
Phone: 604-688-1959 x243 Fax: 604-687-4329
Toll Free: 1-888-687-6822
Website: www.digitalpaytech.com <outbind://11/www.digitalpaytech.com>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]