As you see in my sample code, I think the right way is NOT to spawn a thread at the calling client, but have the server immediately return after buffering the request. In fact, the thread is spawned at the server which take the request from the buffer to handle at a later time.

At the same time, the callback address of ws1 is passed as an extra WSDL parameter to downstream services (w2, w3). If you want to differentiate between different user session, then an extra "sessionId" parameter need to be passed as well.

Rgds, Ricky


At 06:50 PM 11/27/2002 +1100, Trond Hjelmaas wrote:
Hi,

thanks for your answers!

I think I've made a mistake...
I actually don't need a return value from a web service, the reason is
that I want several web services (ws) to execute in a chain manner.
1 - Say that a client/user calls ws1, ws1 calls ws2 which calls ws3.
2 - I don't want ws1 to hang and wait for answer, but continue to
execute (fire and forget invocation)
3 - After ws3 is finished it will note ws1 (not by returning a value to
ws2 which returns value to ws1) but by calling ws1 directly

..in short, every ws on the way will only send message forward to
another ws and don't return a reply (never look back)

The 2  major issues are
-how to get ws1 to continue executing (using thread that waits for
reponse is not wanted, I want a peer2peer execution)
-in ws1 how to map the 'answer' from ws3 to the correct request (say ws1
has 100 users)

This problem is hard to communicate with few words.

Suggstions/views are appriciated!

Thanx again!

-----------------------------------

I guess the behavior you observe is "implementation dependent".  The
SOAP
server you've used doesn't take advantage of the optimization
opportunity
where things can be execute in parallel.

But you certainly can achieve what you want in the following ways ...

public class AsyncService {
         static Buffer buffer = Buffer.getSingleton();

         public String submitRequest(Request request) {
                 String trackerId = buffer.save(request); // save in
buffer
                 return trackerId;
         }

         public Response pollForResponse(String trackerId) {
                 if (buffer.isResponseReady(trackerId)) {
                         return (buffer.getResponse(trackerId));
                 } else {
                         return (null);
                 }
         }

         public void submitRequestWithCallback(Request request,
ICallback
callback) {
                 buffer.save(request, callback);
         }
}

public class Execution extends Thread {
         public void run () {
                 Request request = buffer.takeRequest();
                 Response response = handle(request);
                 if (request.needsCallback()) {
                         ICallback callback =
buffer.getCallback(request.getTrackerId());
                         callback.sendResponse(response);
                 } else {
                         buffer.saveResponse(request.getTrackerId(),
response)
                 }
         }
}

Rgds, Ricky

At 02:29 PM 11/27/2002 +1100, Trond Hjelmaas wrote:
>Hi,
>
>I have a problem with finding relevant info regarding asynch Web Services.
>
>
>For example, I've got this javaclass, all it does is wait 10 seconds
>
>public class delay{
>         public void wait10sec(){
>                 /*some code for 10 sec delay*/
>         }
>
>}
>
>it has WSDL like:
>......
>    <message name="wait10sec0Request"/>
>    <portType name="blahPortType">
>       <operation name="wait10sec">
>          <input name="wait10sec0Request" message="tns:wait10sec0Request"/>
>       </operation>
>    </portType>
>    <binding name="blahBinding" type="tns:blahPortType">
>       <soap:binding style="rpc"
>                 transport="http://schemas.xmlsoap.org/soap/http"/>
>       <operation name="wait10sec">
>          <soap:operation soapAction="" style="rpc"/>
>          <input name="wait10sec0Request">
>             <soap:body use="encoded" namespace="blah"
>                 encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
>          </input>
>       </operation>
>    </binding>
>    <service name="blah">
>       <port name="blahPort" binding="tns:blahBinding">
>          <soap:address
>                 location="http://some_URTL:8888/blah_ctx/blah"/>
>       </port>
>    </service>
>
>NOTE: I have change WSDL to have no response, the original has reponse
>message listed, but is was empty.....
>
>According to some mail I read Web Services are async if they don't have
>any reponse method.
>
>I uploaded this and invoke the method using Oracle9ias (9.0.0.3), the
>invocation halts for 10 seconds, and does NOT return ASAP (which is what I
>need).
>
>Any suggestions about how to make asynch Web Services are very
>appreciated!
>
>Regards, Trond



Reply via email to