# HelloWorldAsyncControl.jcx Sample

This topic inludes the source code for the HelloWorldAsyncControl.jcx Sample.

## Sample Location

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

BEA_HOME/weblogic81/samples/workshop/SamplesApp/WebApp/controls/webservice/polling/asyncWebService/

## Sample Source Code

`001 package controls.webservice.polling.asyncWebService; 002 003 /** 004 * This originally asynchronous web service (copied and modified from SamplesApp/WebServices/async/HelloWorldAsych.jws) has been supplemented with a polling interface. If the client specifies that it cannot hear callbacks (via the useCallback parameter on the HelloAsync() method), the result is not sent in a callback, instead it is stored in the member variable m_message. Two methods have been added to the original web service: checkStatus() getMessageResponse() Three member variables have been added: m_useCallbacks m_messageIsReceived m_message A parameter has been added to the requestMessage() method: useCallbacks. A web service that uses a TimerControl to delay sending a response back to the client. The timer simulates waiting for a slow back end service to complete work for us. We use a callback to asynchronously notify the client when the simulated operation is complete. 005 * @jc:location http-url="HelloWorldAsync.jws" jms-url="HelloWorldAsync.jws" 006 * @jc:wsdl file="#HelloWorldAsyncWsdl" 007 * @editor-info:link autogen-style="java" source="HelloWorldAsync.jws" autogen="true" 008 */ 009 public interface HelloWorldAsyncControl extends com.bea.control.ControlExtension, com.bea.control.ServiceControl 010 { 011 public static class StartHeader 012 implements java.io.Serializable 013 { 014 public java.lang.String conversationID; 015 public java.lang.String callbackLocation; 016 } 017 018 public static class ContinueHeader 019 implements java.io.Serializable 020 { 021 public java.lang.String conversationID; 022 } 023 024 public static class CallbackHeader 025 implements java.io.Serializable 026 { 027 public java.lang.String conversationID; 028 } 029 030 031 public interface Callback extends com.bea.control.ServiceControl.Callback 032 { 033 /** 034 * <p>HelloResult is the message we will send back to the client some time after the client initiates the operation.</p> <p>We mark the callback as finishing the conversation because once we invoke the callback the interaction between client and this service is complete. If we didn't use the @common:conversation tag here to finish the conversation, we would have to call finishConversation() on this service's context object.</p> 035 * @jc:conversation phase="finish" 036 */ 037 public void onHelloResult (java.lang.String hello); 038 039 } 040 041 /** 042 * <p>The client starts the interaction by calling HelloAsync.</p> <p>The client sends this, and some time later our web service replies by calling callback.onHelloResult.</p> <p>Because we need to remember which client called us, this is a "conversation start" method. This means the system will automatically track which clients have called us, and where to send the result for each. This is known as <i>correlation</i>.</p> <p>Because it uses a TimerControl method that might throw an Exception, the method must declare that it might throw an Exception.</p> 043 * @jc:conversation phase="start" 044 */ 045 public void requestMessage (boolean useCallback); 046 047 /** 048 * Clients that don't want callbacks call this method to see if the results are ready to be retrieved. 049 * @jc:conversation phase="continue" 050 */ 051 public boolean checkStatus (); 052 053 /** 054 * Clients that don't want callbacks call this method to get the result 055 * @jc:conversation phase="finish" 056 */ 057 public java.lang.String getMessageResponse (); 058 059 static final long serialVersionUID = 1L; 060 } 061 062 /** @common:define name="HelloWorldAsyncWsdl" value:: 063 <?xml version="1.0" encoding="utf-8"?> 064 <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:conv="http://www.openuri.org/2002/04/soap/conversation/" xmlns:cw="http://www.openuri.org/2002/04/wsdl/conversation/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:jms="http://www.openuri.org/2002/04/wsdl/jms/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:s0="http://www.openuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://www.openuri.org/"> 065 <types> 066 <s:schema elementFormDefault="qualified" targetNamespace="http://www.openuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema"> 067 <s:element name="onHelloResultResponse"> 068 <s:complexType> 069 <s:sequence/> 070 </s:complexType> 071 </s:element> 072 <s:element name="onHelloResult"> 073 <s:complexType> 074 <s:sequence> 075 <s:element name="hello" type="s:string" minOccurs="0"/> 076 </s:sequence> 077 </s:complexType> 078 </s:element> 079 <s:element name="requestMessage"> 080 <s:complexType> 081 <s:sequence> 082 <s:element name="useCallback" type="s:boolean"/> 083 </s:sequence> 084 </s:complexType> 085 </s:element> 086 <s:element name="requestMessageResponse"> 087 <s:complexType> 088 <s:sequence/> 089 </s:complexType> 090 </s:element> 091 <s:element name="checkStatus"> 092 <s:complexType> 093 <s:sequence/> 094 </s:complexType> 095 </s:element> 096 <s:element name="checkStatusResponse"> 097 <s:complexType> 098 <s:sequence> 099 <s:element name="checkStatusResult" type="s:boolean"/> 100 </s:sequence> 101 </s:complexType> 102 </s:element> 103 <s:element name="boolean" type="s:boolean"/> 104 <s:element name="getMessageResponse"> 105 <s:complexType> 106 <s:sequence/> 107 </s:complexType> 108 </s:element> 109 <s:element name="getMessageResponseResponse"> 110 <s:complexType> 111 <s:sequence> 112 <s:element name="getMessageResponseResult" type="s:string" minOccurs="0"/> 113 </s:sequence> 114 </s:complexType> 115 </s:element> 116 <s:element name="string" nillable="true" type="s:string"/> 117 </s:schema> 118 119 <s:schema elementFormDefault="qualified" targetNamespace="http://www.openuri.org/2002/04/soap/conversation/"> 120 <s:element name="StartHeader" type="conv:StartHeader"/> 121 <s:element name="ContinueHeader" type="conv:ContinueHeader"/> 122 <s:element name="CallbackHeader" type="conv:CallbackHeader"/> 123 <s:complexType name="StartHeader"> 124 <s:sequence> 125 <s:element minOccurs="0" maxOccurs="1" name="conversationID" type="s:string"/> 126 <s:element minOccurs="0" maxOccurs="1" name="callbackLocation" type="s:string"/> 127 </s:sequence> 128 </s:complexType> 129 <s:complexType name="ContinueHeader"> 130 <s:sequence> 131 <s:element minOccurs="1" maxOccurs="1" name="conversationID" type="s:string"/> 132 </s:sequence> 133 </s:complexType> 134 <s:complexType name="CallbackHeader"> 135 <s:sequence> 136 <s:element minOccurs="1" maxOccurs="1" name="conversationID" type="s:string"/> 137 </s:sequence> 138 </s:complexType> 139 </s:schema> 140 </types> 141 <message name="onHelloResultSoapIn"> 142 <part name="parameters" element="s0:onHelloResultResponse"/> 143 </message> 144 <message name="onHelloResultSoapOut"> 145 <part name="parameters" element="s0:onHelloResult"/> 146 </message> 147 <message name="requestMessageSoapIn"> 148 <part name="parameters" element="s0:requestMessage"/> 149 </message> 150 <message name="requestMessageSoapOut"> 151 <part name="parameters" element="s0:requestMessageResponse"/> 152 </message> 153 <message name="checkStatusSoapIn"> 154 <part name="parameters" element="s0:checkStatus"/> 155 </message> 156 <message name="checkStatusSoapOut"> 157 <part name="parameters" element="s0:checkStatusResponse"/> 158 </message> 159 <message name="getMessageResponseSoapIn"> 160 <part name="parameters" element="s0:getMessageResponse"/> 161 </message> 162 <message name="getMessageResponseSoapOut"> 163 <part name="parameters" element="s0:getMessageResponseResponse"/> 164 </message> 165 <message name="onHelloResultHttpGetIn"/> 166 <message name="onHelloResultHttpGetOut"> 167 <part name="hello" type="s:string"/> 168 </message> 169 <message name="requestMessageHttpGetIn"> 170 <part name="useCallback" type="s:string"/> 171 </message> 172 <message name="requestMessageHttpGetOut"/> 173 <message name="checkStatusHttpGetIn"/> 174 <message name="checkStatusHttpGetOut"> 175 <part name="Body" element="s0:boolean"/> 176 </message> 177 <message name="getMessageResponseHttpGetIn"/> 178 <message name="getMessageResponseHttpGetOut"> 179 <part name="Body" element="s0:string"/> 180 </message> 181 <message name="onHelloResultHttpPostIn"/> 182 <message name="onHelloResultHttpPostOut"> 183 <part name="hello" type="s:string"/> 184 </message> 185 <message name="requestMessageHttpPostIn"> 186 <part name="useCallback" type="s:string"/> 187 </message> 188 <message name="requestMessageHttpPostOut"/> 189 <message name="checkStatusHttpPostIn"/> 190 <message name="checkStatusHttpPostOut"> 191 <part name="Body" element="s0:boolean"/> 192 </message> 193 <message name="getMessageResponseHttpPostIn"/> 194 <message name="getMessageResponseHttpPostOut"> 195 <part name="Body" element="s0:string"/> 196 </message> 197 <message name="StartHeader_literal"> 198 <part name="StartHeader" element="conv:StartHeader"/> 199 </message> 200 <message name="ContinueHeader_literal"> 201 <part name="ContinueHeader" element="conv:ContinueHeader"/> 202 </message> 203 <message name="CallbackHeader_literal"> 204 <part name="CallbackHeader" element="conv:CallbackHeader"/> 205 </message> 206 <portType name="HelloWorldAsyncSoap"> 207 <operation name="onHelloResult"> 208 <documentation>&lt;p&gt;HelloResult is the message we will send back to the client some time after the client initiates the operation.&lt;/p&gt; &lt;p&gt;We mark the callback as finishing the conversation because once we invoke the callback the interaction between client and this service is complete. If we didn't use the @common:conversation tag here to finish the conversation, we would have to call finishConversation() on this service's context object.&lt;/p&gt;</documentation> 209 <output message="s0:onHelloResultSoapOut"/> 210 <input message="s0:onHelloResultSoapIn"/> 211 </operation> 212 <operation name="requestMessage"> 213 <documentation>&lt;p&gt;The client starts the interaction by calling HelloAsync.&lt;/p&gt; &lt;p&gt;The client sends this, and some time later our web service replies by calling callback.onHelloResult.&lt;/p&gt; &lt;p&gt;Because we need to remember which client called us, this is a "conversation start" method. This means the system will automatically track which clients have called us, and where to send the result for each. This is known as &lt;i&gt;correlation&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;Because it uses a TimerControl method that might throw an Exception, the method must declare that it might throw an Exception.&lt;/p&gt;</documentation> 214 <input message="s0:requestMessageSoapIn"/> 215 <output message="s0:requestMessageSoapOut"/> 216 </operation> 217 <operation name="checkStatus"> 218 <documentation>Clients that don't want callbacks call this method to see if the results are ready to be retrieved.</documentation> 219 <input message="s0:checkStatusSoapIn"/> 220 <output message="s0:checkStatusSoapOut"/> 221 </operation> 222 <operation name="getMessageResponse"> 223 <documentation>Clients that don't want callbacks call this method to get the result</documentation> 224 <input message="s0:getMessageResponseSoapIn"/> 225 <output message="s0:getMessageResponseSoapOut"/> 226 </operation> 227 </portType> 228 <portType name="HelloWorldAsyncHttpGet"> 229 <operation name="onHelloResult"> 230 <documentation>&lt;p&gt;HelloResult is the message we will send back to the client some time after the client initiates the operation.&lt;/p&gt; &lt;p&gt;We mark the callback as finishing the conversation because once we invoke the callback the interaction between client and this service is complete. If we didn't use the @common:conversation tag here to finish the conversation, we would have to call finishConversation() on this service's context object.&lt;/p&gt;</documentation> 231 <output message="s0:onHelloResultHttpGetOut"/> 232 <input message="s0:onHelloResultHttpGetIn"/> 233 </operation> 234 <operation name="requestMessage"> 235 <documentation>&lt;p&gt;The client starts the interaction by calling HelloAsync.&lt;/p&gt; &lt;p&gt;The client sends this, and some time later our web service replies by calling callback.onHelloResult.&lt;/p&gt; &lt;p&gt;Because we need to remember which client called us, this is a "conversation start" method. This means the system will automatically track which clients have called us, and where to send the result for each. This is known as &lt;i&gt;correlation&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;Because it uses a TimerControl method that might throw an Exception, the method must declare that it might throw an Exception.&lt;/p&gt;</documentation> 236 <input message="s0:requestMessageHttpGetIn"/> 237 <output message="s0:requestMessageHttpGetOut"/> 238 </operation> 239 <operation name="checkStatus"> 240 <documentation>Clients that don't want callbacks call this method to see if the results are ready to be retrieved.</documentation> 241 <input message="s0:checkStatusHttpGetIn"/> 242 <output message="s0:checkStatusHttpGetOut"/> 243 </operation> 244 <operation name="getMessageResponse"> 245 <documentation>Clients that don't want callbacks call this method to get the result</documentation> 246 <input message="s0:getMessageResponseHttpGetIn"/> 247 <output message="s0:getMessageResponseHttpGetOut"/> 248 </operation> 249 </portType> 250 <portType name="HelloWorldAsyncHttpPost"> 251 <operation name="onHelloResult"> 252 <documentation>&lt;p&gt;HelloResult is the message we will send back to the client some time after the client initiates the operation.&lt;/p&gt; &lt;p&gt;We mark the callback as finishing the conversation because once we invoke the callback the interaction between client and this service is complete. If we didn't use the @common:conversation tag here to finish the conversation, we would have to call finishConversation() on this service's context object.&lt;/p&gt;</documentation> 253 <output message="s0:onHelloResultHttpPostOut"/> 254 <input message="s0:onHelloResultHttpPostIn"/> 255 </operation> 256 <operation name="requestMessage"> 257 <documentation>&lt;p&gt;The client starts the interaction by calling HelloAsync.&lt;/p&gt; &lt;p&gt;The client sends this, and some time later our web service replies by calling callback.onHelloResult.&lt;/p&gt; &lt;p&gt;Because we need to remember which client called us, this is a "conversation start" method. This means the system will automatically track which clients have called us, and where to send the result for each. This is known as &lt;i&gt;correlation&lt;/i&gt;.&lt;/p&gt; &lt;p&gt;Because it uses a TimerControl method that might throw an Exception, the method must declare that it might throw an Exception.&lt;/p&gt;</documentation> 258 <input message="s0:requestMessageHttpPostIn"/> 259 <output message="s0:requestMessageHttpPostOut"/> 260 </operation> 261 <operation name="checkStatus"> 262 <documentation>Clients that don't want callbacks call this method to see if the results are ready to be retrieved.</documentation> 263 <input message="s0:checkStatusHttpPostIn"/> 264 <output message="s0:checkStatusHttpPostOut"/> 265 </operation> 266 <operation name="getMessageResponse"> 267 <documentation>Clients that don't want callbacks call this method to get the result</documentation> 268 <input message="s0:getMessageResponseHttpPostIn"/> 269 <output message="s0:getMessageResponseHttpPostOut"/> 270 </operation> 271 </portType> 272 <binding name="HelloWorldAsyncSoap" type="s0:HelloWorldAsyncSoap"> 273 <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/> 274 <operation name="onHelloResult"> 275 <soap:operation soapAction="http://www.openuri.org/onHelloResult" style="document"/> 276 <cw:transition phase="finish"/> 277 <input> 278 <soap:body use="literal"/> 279 </input> 280 <output> 281 <soap:body use="literal"/> 282 <soap:header wsdl:required="true" message="s0:CallbackHeader_literal" part="CallbackHeader" use="literal" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/> 283 </output> 284 </operation> 285 <operation name="requestMessage"> 286 <soap:operation soapAction="http://www.openuri.org/requestMessage" style="document"/> 287 <cw:transition phase="start"/> 288 <input> 289 <soap:body use="literal"/> 290 <soap:header wsdl:required="true" message="s0:StartHeader_literal" part="StartHeader" use="literal" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/> 291 </input> 292 <output> 293 <soap:body use="literal"/> 294 </output> 295 </operation> 296 <operation name="checkStatus"> 297 <soap:operation soapAction="http://www.openuri.org/checkStatus" style="document"/> 298 <cw:transition phase="continue"/> 299 <input> 300 <soap:body use="literal"/> 301 <soap:header wsdl:required="true" message="s0:ContinueHeader_literal" part="ContinueHeader" use="literal" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/> 302 </input> 303 <output> 304 <soap:body use="literal"/> 305 </output> 306 </operation> 307 <operation name="getMessageResponse"> 308 <soap:operation soapAction="http://www.openuri.org/getMessageResponse" style="document"/> 309 <cw:transition phase="finish"/> 310 <input> 311 <soap:body use="literal"/> 312 <soap:header wsdl:required="true" message="s0:ContinueHeader_literal" part="ContinueHeader" use="literal" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/> 313 </input> 314 <output> 315 <soap:body use="literal"/> 316 </output> 317 </operation> 318 </binding> 319 <binding name="HelloWorldAsyncHttpGet" type="s0:HelloWorldAsyncHttpGet"> 320 <http:binding verb="GET"/> 321 <operation name="onHelloResult"> 322 <http:operation location="/onHelloResult"/> 323 <cw:transition phase="finish"/> 324 <input> 325 <mime:mimeXml part="Body"/> 326 </input> 327 <output> 328 <http:urlEncoded/> 329 </output> 330 </operation> 331 <operation name="requestMessage"> 332 <http:operation location="/requestMessage"/> 333 <cw:transition phase="start"/> 334 <input> 335 <http:urlEncoded/> 336 </input> 337 <output/> 338 </operation> 339 <operation name="checkStatus"> 340 <http:operation location="/checkStatus"/> 341 <cw:transition phase="continue"/> 342 <input> 343 <http:urlEncoded/> 344 </input> 345 <output> 346 <mime:mimeXml part="Body"/> 347 </output> 348 </operation> 349 <operation name="getMessageResponse"> 350 <http:operation location="/getMessageResponse"/> 351 <cw:transition phase="finish"/> 352 <input> 353 <http:urlEncoded/> 354 </input> 355 <output> 356 <mime:mimeXml part="Body"/> 357 </output> 358 </operation> 359 </binding> 360 <binding name="HelloWorldAsyncHttpPost" type="s0:HelloWorldAsyncHttpPost"> 361 <http:binding verb="POST"/> 362 <operation name="onHelloResult"> 363 <http:operation location="/onHelloResult"/> 364 <cw:transition phase="finish"/> 365 <input> 366 <mime:mimeXml part="Body"/> 367 </input> 368 <output> 369 <mime:content type="application/x-www-form-urlencoded"/> 370 </output> 371 </operation> 372 <operation name="requestMessage"> 373 <http:operation location="/requestMessage"/> 374 <cw:transition phase="start"/> 375 <input> 376 <mime:content type="application/x-www-form-urlencoded"/> 377 </input> 378 <output/> 379 </operation> 380 <operation name="checkStatus"> 381 <http:operation location="/checkStatus"/> 382 <cw:transition phase="continue"/> 383 <input> 384 <mime:content type="application/x-www-form-urlencoded"/> 385 </input> 386 <output> 387 <mime:mimeXml part="Body"/> 388 </output> 389 </operation> 390 <operation name="getMessageResponse"> 391 <http:operation location="/getMessageResponse"/> 392 <cw:transition phase="finish"/> 393 <input> 394 <mime:content type="application/x-www-form-urlencoded"/> 395 </input> 396 <output> 397 <mime:mimeXml part="Body"/> 398 </output> 399 </operation> 400 </binding> 401 <service name="HelloWorldAsync"> 402 <documentation>This originally asynchronous web service (copied and modified from SamplesApp/WebServices/async/HelloWorldAsych.jws) has been supplemented with a polling interface. If the client specifies that it cannot hear callbacks (via the useCallback parameter on the HelloAsync() method), the result is not sent in a callback, instead it is stored in the member variable m_message. Two methods have been added to the original web service: checkStatus() getMessageResponse() Three member variables have been added: m_useCallbacks m_messageIsReceived m_message A parameter has been added to the requestMessage() method: useCallbacks. A web service that uses a TimerControl to delay sending a response back to the client. The timer simulates waiting for a slow back end service to complete work for us. We use a callback to asynchronously notify the client when the simulated operation is complete.</documentation> 403 <port name="HelloWorldAsyncSoap" binding="s0:HelloWorldAsyncSoap"> 404 <soap:address location="http://localhost:7001/controls/webservice/polling/asyncWebService/HelloWorldAsync.jws"/> 405 </port> 406 <port name="HelloWorldAsyncHttpGet" binding="s0:HelloWorldAsyncHttpGet"> 407 <http:address location="http://localhost:7001/controls/webservice/polling/asyncWebService/HelloWorldAsync.jws"/> 408 </port> 409 <port name="HelloWorldAsyncHttpPost" binding="s0:HelloWorldAsyncHttpPost"> 410 <http:address location="http://localhost:7001/controls/webservice/polling/asyncWebService/HelloWorldAsync.jws"/> 411 </port> 412 </service> 413 </definitions> 414 * :: 415 */`