1)construct a payload element which will contain the soap message you want to
send to the awaiting Axis service supply the 2nd parameter to
2)call
opClient.sendReceiveNonBlocking(ANON_OUT_IN_OP,parentElementToSend,callback);
/**
* here is the sendReceiveNonBlocking method
*
* Directly invoke a named operation with an In-Out MEP without waiting for
a response. This
* method sends your supplied XML with response notification to your
callback handler. For more
* control, you can instead create a client for the operation and use that
client to execute the
* exchange.
*
* @param operation name of operation to be invoked (non-<code>null</code>)
* @param elem the data to send (becomes the content of SOAP body)
* @param callback a Callback which will be notified upon completion
* @throws AxisFault in case of error
* @see #createClient(QName)
* @deprecated Please use the AxisCallback interface rather than Callback,
which has been
* deprecated
*/
public void sendReceiveNonBlocking(QName operation, OMElement elem,
Callback callback)
throws AxisFault {
MessageContext mc = new MessageContext();
fillSOAPEnvelope(mc, elem);
OperationClient mepClient = createClient(operation);
// here a blocking invocation happens in a new thread, so the
// progamming model is non blocking
mepClient.setCallback(callback);
mepClient.addMessageContext(mc);
mepClient.execute(false);
}
Hi,
I am using an OperationClient to invoke different web services asynchronously.
I am passing a callback method to the operationclient as following.
MyCallBack Class:
AxisCallback callBack = new AxisCallback(){
public synchronized void onMessage(MessageContext msgContext){
SOAPBody msg = msgContext.getEnvelope().getBody();
System.out.println("this is the
envelope"+msgContext.getEnvelope());
System.out.println("Inside onMessage: "+msg);
}
public void onComplete() {
// TODO Auto-generated method stub
System.out.println("Invocation is complete");
//System.exit(0);
}
@Override
public void onError(Exception e) {
// TODO Auto-generated method stub
System.out.println("Inside onError: "+e.getMessage());
}
public void onFault(MessageContext msgContext) {
// TODO Auto-generated method stub
System.out.println("Inside onFault:
"+msgContext.getFailureReason().toString());
msgContext.getFailureReason().printStackTrace();
}
};
ServiceClient sc = new ServiceClient();
OperationClient opClient = sc.createClient(
ServiceClient.ANON_OUT_IN_OP);
MessageContext outMsgCtx = new MessageContext();
//assigning message context's option object into instance variable
Options opts = outMsgCtx.getOptions();
//setting properties into option
opts.setTo(new EndpointReference(
endPoint));
opts.setAction(action);
sc.engageModule("addressing");
opClient.addMessageContext(outMsgCtx);
opts.setUseSeparateListener(true);
outMsgCtx.setEnvelope(createSOAPEnvelope);//createSOAPEnvelope returns soap
envelope
// opClient.setCallback(callBack);
//opClient.execute(true);
//construct your parentElementToSend payload and supply that as 2nd parameter
//here is an example from MexClient
//change your namespace to match the namespace you are using
//change the 1st parameter of createOMElement to be the actual payload you are
sending..
//factory
OMFactory fac = OMAbstractFactory.getOMFactory();
//create namespace from factory
OMNamespace omNs =
fac.createOMNamespace(DRConstants.SPEC.NS_URI,DRConstants.SPEC.NS_PREFIX);
//create element from factory
OMElement parentElementToSend =
fac.createOMElement(DRConstants.SPEC.GET_METADATA, omNs);
opClient.sendReceiveNonBlocking(ANON_OUT_IN_OP,parentElementToSend,callback);
while(true){
Thread.sleep(100);
}
However when I call this client my callback class is not called.
Can one kindly guide me what I am doing wrong here?
Regards,
Sardar Hussain