Issue Details (XML | Word | Printable)

Key: JAVAEETUTORIAL-154
Type: Improvement Improvement
Status: Resolved Resolved
Resolution: Fixed
Priority: Minor Minor
Assignee: Ian Evans
Reporter: swiss-chris
Votes: 0
Watchers: 0
Operations

If you were logged in you would be able to see more operations.
javaeetutorial

unecessary "while(!mailStatus.isDone())"

Created: 15/Feb/13 05:31 PM   Updated: 19/Feb/13 08:48 PM   Resolved: 19/Feb/13 08:48 PM
Component/s: examples
Affects Version/s: 6.0.8
Fix Version/s: 7.0.0

Time Tracking:
Original Estimate: 5 minutes
Original Estimate - 5 minutes
Remaining Estimate: 5 minutes
Remaining Estimate - 5 minutes
Time Spent: Not Specified
Time Spent - Not Specified

Tags:
Participants: Ian Evans and swiss-chris


 Description  « Hide

In the async EJB example (doc: http://docs.oracle.com/javaee/6/tutorial/doc/gkiez.html) the async.web.MailerManagedBean's send() method contains the following code:

while (!mailStatus.isDone()) {       // line x+1
    this.setStatus("Processing..."); // line x+2
}                                    // line x+3

This seems problematic to me on various levels.

  1. We are unnecessarily setting the status to "Processing..." numerous times.
  2. We are unnecessarily occupying the processor until mailStatus.isDone().
  3. Immediately after this code, we call mailStatus.get(), which has the same effect as the while-loop (here too we wait for mailStatus.isDone())


My proposal would be to delete the first and last line from the three lines of code pasted above, leaving only the middle line (which never produces any visible result, by the way):

this.setStatus("Processing..."); // line x+2

---------

Furthermore, in my local code I reworked the example a bit,

  • using @ManagedBean @SessionScoped instead of @Named @RequestScoped.
  • making Future<String> mailStatus a class member instead of a local variable.
  • removing the try-catch block containing this.setStatus(mailStatus.get() out of the send() method and into the getStatus() method, protected by an additional if (mailStatus.isDone()) check.
  • changing the response value of the send() method from "response" to "response?faces-redirect=true"

This allows me to actually see the "Processing..." status in the browser as well as to refresh the page manually until the status changes. Personally, I find this gives me more of a feeling for the asynchronous nature of the code underneath, rather than experiencing a simple long-running synchronous response in the browser.



swiss-chris added a comment - 15/Feb/13 05:40 PM

I ran a quick test with the while-loop, counting the number of times it ran: 2,561,715,398 times !


Ian Evans added a comment - 18/Feb/13 09:09 PM

If you email me a ZIP containing your code changes, I'll integrate them into the trunk for Java EE 7.0.
ian period evans at oracle period com


swiss-chris added a comment - 18/Feb/13 09:32 PM

Great! I'll send you the ZIP tomorrow. Thanks.


Ian Evans added a comment - 19/Feb/13 08:48 PM

I merged in Chris's changes. I kept MailerManagedBean as a CDI bean, but changed the scope to SessionScoped.