AdvancedTimer.jws Sample

This topic inludes the source code for the AdvancedTimer.jws Sample.

Sample Location

This sample is located in the following directory in your WebLogic Workshop installation:

BEA_HOME/weblogic81/samples/workshop/SamplesApp/WebServices/timer/

Sample Source Code


001 package timer; 
002 
003 import com.bea.control.JwsContext;
004 import com.bea.control.TimerControl;
005 import java.util.Date;
006 
007 /**
008  <p>A web service that demonstrates an asynchronous interface on a legacy system that
009  * does not support asynchrony.  It does so by "polling" the legacy system:  calling
010  * it repeatedly to see if it's done.</p>
011  *
012  <p>To use this service, call <b>start</b> to create a new conversational instance and invoke
013  * the operation on the legacy system.  After the legacy system completes it's 
014  * operation, we will invoke the client's <b>onDone</b> callback.  If the legacy system does
015  * not complete in 15 seconds, we will invoke the <b>onDone</b> callback, but with a failure
016  * result.</p>
017  
018  * @common:target-namespace namespace="http://workshop.bea.com/AdvancedTimer"
019  */
020 public class AdvancedTimer implements com.bea.jws.WebService
021 
022     /**
023      * @common:context
024      */
025     JwsContext context;    
026     
027     /**
028      * @common:control
029      */
030     private timer.LegacySystemControl legacySystem;
031 
032 
033     /**
034    <p>This is the timer that we use to poll the legacy system.  Each time the timer
035      * calls us back, we will poll the legacy system again.</p>
036      *
037      <p>The timer will expire in 10 seconds the first time, then every second after
038      * that.</p>
039      *
040      * @jc:timer repeats-every="1 seconds" timeout="10 seconds"
041      * @common:control
042      */
043     private TimerControl timer;
044 
045     /**
046      <p>This variable counts how many times the timer has called us back.  Once it
047      * has called us 6 times, then 15 seconds have elapsed.</p>
048      *
049      <p>Note that this member variable is made persistent by the presence of
050      * the <b>@jws:conversation</b> tags.</p>
051      */
052     private int alarmCount;
053 
054     public Callback callback; 
055 
056     public interface Callback 
057     
058         /**
059          <p>This callback will be invoked when the legacy system completes successfully
060          * or if it does not complete in 15 seconds.</p>
061          *
062          @param succeeded  Indicates whether the legacy system completed its
063          *                   operation successfully in time.
064          
065          * @jws:conversation phase="finish"
066          */
067         public void onDone(boolean succeeded);
068     
069 
070     /**
071      <p>Starts a new conversation.  This will result in an <b>onDone</b> callback in
072      * 10 to 15 seconds.</p>
073      *
074      @throws Exception  As thrown by TimerControl.start().
075      *
076      * @common:operation
077      * @jws:conversation phase="start"
078      */
079     public void start() throws Exception
080     {
081         // Start the legacy system working on this operation.
082         legacySystem.start();
083         
084         // Start the timer going.  It will call us back after 10 seconds, and then
085         // once a second after that.
086         timer.start();
087         
088         // Record that we have not received any onTimeout events yet.
089         alarmCount = 0;
090     }
091 
092     /**
093      <p>This will be called each time the timer alarm goes off.  Each time we get
094      * invoked, we will "poll" the legacy system to see if it has completed.
095      * If it has not completed after 15 seconds (6 calls to this method), then
096      * we will send back a failure result.</p>
097      *
098      @throws Exception  This can be thrown by the timer.
099      */
100     private void timer_onTimeout(long timethrows Exception
101     {
102         // Poll the legacy system to see if it has completed.
103         if (legacySystem.isDone())
104         {
105             // Notify our client that the operation completed successfully.
106             callback.onDone(true);
107             
108             // Turn the timer off since we no longer need it.
109             timer.stop();
110             
111             // terminate the conversation since we no longer need it.
112             context.finishConversation();
113         }
114         else
115         {
116             // Increment the count of times we have received onTimout events.
117             alarmCount += 1;
118             
119             // If we have been called 6 times, then 15 seconds have elapsed.
120             // In that case, send the operation has failed.
121             if (alarmCount == 6)
122             {
123                 // Notify our client that the operation failed.
124                 callback.onDone(false);
125                 
126                 // Turn off the timer since we no longer need it.
127                 timer.stop();
128             }
129         }
130     }
131   
132