Hi,

I trying to run a Axis JAVA client with a GSOAP C++ server. Here in the
below given code I am trying to make an asynchronous call from the JAVA
client using "sendReceiveNonBlocking" API. On the GSOAP server side I am
using the "soap_send_..." for the asynchronous behaviour.

I have a callback pointer on the JAVA client "MyAxisCallback" which will
wait for asynchronous reponse from the GSOAP server. But this approach is
not working. The client sends a string to server which is received
successfully by the server. After that the callback pointer then keeps on
waiting for a response from the server. The client calls the "ns2__hello"
function on the server and the server has to send a response using the
"soap_send_ns2__hello" function to the JAVA callback pointer. But the
callback pointer doesn't receive anything, it just keeps on waiting till the
server times out.

The same GSOAP C++ server works fine with a GSOAP C++ client for
asynchronous calls.

What could be the problem here ?? Any inputs will be appreciated…

Thanks and Regards,
Rajeesh


The Server code

// This is the main project file for VC++ application project
// generated using an Application Wizard.

#include <soapH.h>
#include < math.h > // for sqrt()
#include "ns2.nsmap"
#include <stdafx.h>
//#include <AsynchOp.h>
//#include <unistd.h>

#define BACKLOG (100) // Max. request backlog
#using <mscorlib.dll>
#include <soapProxy.h>
#include "cmythread.h"
#include "cmythread1.h"
using namespace System;

int _tmain()
{



   struct soap soap;
   int m, s; // master and slave sockets

   soap_init2(&soap, SOAP_IO_KEEPALIVE, SOAP_IO_KEEPALIVE);
    soap.send_timeout = 6000; // 60 seconds
    soap.recv_timeout = 6000; // 60 seconds
    soap.accept_timeout = 3600; // server stops after 1 hour of inactivity
    soap.max_keep_alive = 1000; // max keep-alive sequence
    void *process_request(void*);
    struct soap *tsoap;
    //pthread tid;
   //soap_init(&soap);
   //m = soap_bind(&soap, "http://10.143.73.103/";, 80, 100);
   m = soap_bind(&soap, NULL,80, 100);
   if (m < 0)
   {std::cout<<"already inside "<<std::endl;
   soap_print_fault(&soap, stderr);}
   else
   {
      fprintf(stderr, "Socket connection successful: master socket = %d\n",
m);
      CMyThread    thread;
//      CMyThread1 thread1;


      for (int i = 1; ; i++)
      {
         s = soap_accept(&soap);
         if (!soap_valid_socket(s))
         {
             if (soap.errnum)
             {
                 soap_print_fault(&soap, stderr);
                 exit(1);
             }
             fprintf(stderr, "server timed out\n");
           break;
         }
         fprintf(stderr, "Thread %d accepts socket %d connection from IP
%d.%d.%d.%d\n",i, s, (soap.ip>>24)&0xFF, (soap.ip>>16)&0xFF,
(soap.ip>>8)&0xFF, soap.ip&0xFF);
         /*tsoap = soap_copy(&soap);
         if (!tsoap)
         break;*/

         thread.soap1= soap_copy(&soap);
         if (!thread.soap1)
         break;
         std::cout<< " Entering create thread "<< std::endl;
         bool ab=thread.CreateThread ();
         if(!ab)
         {
             std::cout<<"ok"<<std::endl;
         }
         //Sleep (20);
        // pthread create(&tid, NULL, (void*(*)(void*))process request,
(void*)tsoap);
      }
   }
std::cout<<"will release callback"<<std::endl;
soap_done(&soap);
return 0;

}

unsigned long CMyThread1::Process (void* parameter)
{
 return 0;
}
unsigned long CMyThread::Process (void* parameter)
{

    //a mechanism for terminating thread should be implemented
    //not allowing the method to be run from the main thread
    if (::GetCurrentThreadId () == this->hMainThreadId)
    {  std::cout<<"Error main thraed"<<std::endl;
        return 0;
    }
    else {

        std::cout<<"start soap_serve((struct soap*)soap1)"<<std::endl;
        //::MessageBoxW (0, _T("I'm running in a different thread!"),
_T("CMyThread"), MB_OK);
        soap_serve((struct soap*)soap1);

        std::cout<<"end soap_serve((struct soap*)soap1)"<<std::endl;
        soap_destroy((struct soap*)soap1); // dealloc C++ data
        soap_end((struct soap*)soap1); // dealloc data and clean up
        return 0;

    }

}

int ns2__add(struct soap *soap, int a)
{

std::cout<<"inside add"<<std::endl;
std::cout<<"a is"<<a<<std::endl;
a = a+8;
soap_send_ns2__add(soap,NULL, NULL,a);

std::cout<<"after send"<<std::endl;
return SOAP_OK;
}

int ns2__hello(struct soap *soap, char *s)
{
  std::cout<<"inside hello -- "<<s<<std::endl;
  s = "Hello World!";
  if (soap_send_ns2__hello(soap,NULL, NULL,s))
  {
      std::cout<<"error -- "<<std::endl;
      return soap->error;
  }
  return SOAP_OK;
}


The Client Code

package impl;

import java.util.HashMap;

import javax.xml.stream.XMLStreamException;

import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.om.impl.llom.util.AXIOMUtil;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.client.async.AsyncResult;
import org.apache.axis2.client.async.AxisCallback;
import org.apache.axis2.client.async.Callback;
import org.apache.axis2.context.MessageContext;
import org.apache.xmlbeans.impl.soap.SOAPEnvelope;
import org.tempuri.ns2_xsd.service_wsdl.ServiceStub;


public class Sync
{
   // private static String toEPR = "http://10.143.73.103:80";;
    private static EndpointReference targetEPR = new EndpointReference("
http://10.143.73.103:80";);

    /*static AxisCallback axisCallback = new AxisCallback()
    {
        public void onMessage(MessageContext arg0) {
            // TODO Auto-generated method stub
            System.out.println("got message");
            synchronized(this){
                this.notify();
            }
        }

        public void onFault(MessageContext arg0) {
            // TODO Auto-generated method stub
            System.out.println("Got fault");
            synchronized(this){
                this.notify();
            }
        }

        public void onError(Exception arg0) {
            // TODO Auto-generated method stub
            System.out.println("on error" + arg0);
            synchronized(this){
                this.notify();
            }
        }

        public void onComplete() {
            // TODO Auto-generated method stub
            System.out.println("complete");
            synchronized(this){
                this.notify();
            }
        }

       };*/

    public static void main(String[] args)
    {

//         First create the payload of the message.
        System.out.println("in main");
        //OMElement payload = getPayload(); // add your payload here
        OMElement payload =createPayLoad();

//         Create an instance of service client.
        ServiceClient serviceClient;

        try {
            serviceClient = new ServiceClient();

            //ServiceStub s ;

//         Create an options object to pass parameters to service client.
        Options options = new Options();

//         Set the location of the Web service.
        options.setTo(targetEPR);
        options.setAction("ns2:hello");

        serviceClient.setOptions(options);

//         Create a callback object.
        //MyCallback callback = new MyCallback();
        MyAxisCallback axisCallback = new MyAxisCallback();
        /*try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/
//         Do an async invocation.
        //serviceClient.sendReceiveNonBlocking(payload, callback);
        serviceClient.sendReceiveNonBlocking(payload,axisCallback);

        /*try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }*/

        while (!axisCallback.isComplete())
        {
            Thread.sleep(1000);
            System.out.println("Not yet completed!!");
        }
        MessageContext mCont =
serviceClient.getLastOperationContext().getMessageContext("Out");
        System.out.println(mCont.getEnvelope().getFirstElement().getText());

        System.out.println("Callback completed!!");
         /*while (!callback.isComplete()) {

              Thread.sleep(1000);

              System.out.println("axisCallback.isComplete()" +
callback.isComplete());

            }*/

         //System.out.println("axisCallback.isComplete()" +
callback.toString());

        System.out.println("after non blocking call");
        } catch (AxisFault e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

//         Continue doing other work without waiting until the response
comes.

    }

    public static OMElement getPayload(){
        int a = 2;

        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs = fac.createOMNamespace(
                          "http://tempuri.org/ns2.xsd";, "ns2");
        OMElement method = fac.createOMElement("hello", omNs);
        OMElement value = fac.createOMElement("value", omNs);
        //value.setText("Hello , my first service utilization");
        method.addChild(value);
        //value.setText(Integer.toString(a));
        value.setText("hello India");
        System.out.println("value is"+ value);
        System.out.println("method is"+ method);
         return method;
        //return payload;
        //return
    }
    public static OMElement createPayLoad() {

        OMFactory fac = OMAbstractFactory.getOMFactory();
        OMNamespace omNs = fac.createOMNamespace(
                "http://tempuri.org/ns2.xsd";, "ns2");
        OMElement method = fac.createOMElement("hello", omNs);
        OMElement value = fac.createOMElement("value", omNs);
        method.addChild(value);
         value.setText("hello India");
        return method;
    }
}

class MyCallback extends Callback {

      public void onComplete(AsyncResult result) {
         // Get the response SOAP envelope from the result.
         //SOAPEnvelope envelope = result.getResponseEnvelope();

         // Process SOAP envelope.
          System.out.println("Inside OnComplete");
       }

       public void onError(Exception e) {
         // Write here what you want to do in case of an error.
           System.out.println("Inside OnError");
       }
}

class MyAxisCallback implements AxisCallback {

    private boolean bComplete;
    public void onMessage(MessageContext arg0) {
        // TODO Auto-generated method stub
        String happy = arg0.getEnvelope().getFirstElement().getText();
        System.out.println("Inside onMessage" + happy);
    }

    public void onFault(MessageContext arg0) {
        // TODO Auto-generated method stub
        String nothappy = arg0.getEnvelope().getFirstElement().getText();
        System.out.println("Inside onFault" + nothappy);
    }

    public void onError(Exception arg0) {
        // TODO Auto-generated method stub
        System.out.println("Inside onError");
        bComplete = true;
        arg0.printStackTrace();
    }

    public void onComplete() {
        // TODO Auto-generated method stub
        bComplete = true;
        System.out.println("Inside onComplete");
    }

    public boolean isComplete() {
        return bComplete;
    }
}

Reply via email to