outinaxisoperation.java
来自「开源的axis2框架的源码。用于开发WEBSERVER」· Java 代码 · 共 530 行 · 第 1/2 页
JAVA
530 行
if(mc.getReplyTo()==null){
EndpointReference replyToFromTransport =
mc.getConfigurationContext().getListenerManager().
getEPRforService(sc.getAxisService().getName(),
axisOp.getName().getLocalPart(), mc
.getTransportIn().getName());
if (mc.getReplyTo() == null) {
mc.setReplyTo(replyToFromTransport);
} else {
mc.getReplyTo().setAddress(replyToFromTransport.getAddress());
}
}
}
//if we don't do this , this guy will wait till it gets HTTP 202 in the HTTP case
mc.setProperty(MessageContext.TRANSPORT_NON_BLOCKING, Boolean.TRUE);
mc.getConfigurationContext().registerOperationContext(mc.getMessageID(), oc);
AxisEngine.send(mc);
if (internalCallback != null) {
internalCallback.waitForCompletion(options.getTimeOutInMilliSeconds());
// process the result of the invocation
if (internalCallback.envelope == null) {
if (internalCallback.error == null) {
log.error("Callback had neither error nor response");
}
if (options.isExceptionToBeThrownOnSOAPFault()) {
throw AxisFault.makeFault(internalCallback.error);
}
}
}
}
/**
* When synchronous send() gets back a response MessageContext, this is the workhorse
* method which processes it.
*
* @param responseMessageContext the active response MessageContext
* @throws AxisFault if something went wrong
*/
protected void handleResponse(MessageContext responseMessageContext) throws AxisFault{
// Options object reused above so soapAction needs to be removed so
// that soapAction+wsa:Action on response don't conflict
responseMessageContext.setSoapAction(null);
if (responseMessageContext.getEnvelope() == null) {
// If request is REST we assume the responseMessageContext is REST, so
// set the variable
/*
* old code here was using the outbound message context to set the inbound SOAP namespace,
* as such and passing it to TransportUtils.createSOAPMessage
*
* msgctx.getEnvelope().getNamespace().getNamespaceURI()
*
* However, the SOAP1.2 spec, appendix A indicates that if a SOAP1.2 message is sent to a SOAP1.1
* endpoint, we will get a SOAP1.1 (fault) message response. We need another way to set
* the inbound SOAP version. Best way to do this is to trust the content type and let
* createSOAPMessage take care of figuring out what the SOAP namespace is.
*/
SOAPEnvelope resenvelope = TransportUtils.createSOAPMessage(responseMessageContext);
if (resenvelope != null) {
responseMessageContext.setEnvelope(resenvelope);
} else {
throw new AxisFault(Messages
.getMessage("blockingInvocationExpectsResponse"));
}
}
SOAPEnvelope resenvelope = responseMessageContext.getEnvelope();
if (resenvelope != null) {
AxisEngine.receive(responseMessageContext);
if (responseMessageContext.getReplyTo() != null) {
sc.setTargetEPR(responseMessageContext.getReplyTo());
}
if (resenvelope.getBody().hasFault()||responseMessageContext.isProcessingFault()) {
if (options.isExceptionToBeThrownOnSOAPFault()) {
// does the SOAPFault has a detail element for Excpetion
throw Utils.getInboundFaultFromMessageContext(responseMessageContext);
}
}
}
}
/**
* Synchronously send the request and receive a response. This relies on the transport
* correctly connecting the response InputStream!
*
* @param msgContext the request MessageContext to send.
* @return Returns MessageContext.
* @throws AxisFault Sends the message using a two way transport and waits for a response
*/
protected MessageContext send(MessageContext msgContext) throws AxisFault {
// create the responseMessageContext
MessageContext responseMessageContext =
msgContext.getConfigurationContext().createMessageContext();
responseMessageContext.setServerSide(false);
responseMessageContext.setOperationContext(msgContext.getOperationContext());
responseMessageContext.setOptions(new Options(options));
responseMessageContext.setMessageID(msgContext.getMessageID());
addMessageContext(responseMessageContext);
responseMessageContext.setServiceContext(msgContext.getServiceContext());
responseMessageContext.setAxisMessage(
axisOp.getMessage(WSDLConstants.MESSAGE_LABEL_IN_VALUE));
//sending the message
AxisEngine.send(msgContext);
responseMessageContext.setDoingREST(msgContext.isDoingREST());
// Copy RESPONSE properties which the transport set onto the request message context when it processed
// the incoming response recieved in reply to an outgoing request.
responseMessageContext.setProperty(MessageContext.TRANSPORT_HEADERS,
msgContext.getProperty(MessageContext.TRANSPORT_HEADERS));
responseMessageContext.setProperty(HTTPConstants.MC_HTTP_STATUS_CODE,
msgContext.getProperty(HTTPConstants.MC_HTTP_STATUS_CODE));
responseMessageContext.setProperty(MessageContext.TRANSPORT_IN, msgContext
.getProperty(MessageContext.TRANSPORT_IN));
responseMessageContext.setTransportIn(msgContext.getTransportIn());
responseMessageContext.setTransportOut(msgContext.getTransportOut());
handleResponse(responseMessageContext);
return responseMessageContext;
}
/**
* This class is the workhorse for a non-blocking invocation that uses a two
* way transport.
*/
private class NonBlockingInvocationWorker implements Runnable {
private Callback callback;
private MessageContext msgctx;
private AxisCallback axisCallback;
public NonBlockingInvocationWorker(Callback callback,
MessageContext msgctx ,
AxisCallback axisCallback) {
this.callback = callback;
this.msgctx = msgctx;
this.axisCallback =axisCallback;
}
public void run() {
try {
// send the request and wait for response
MessageContext response = send(msgctx);
// call the callback
if (response != null) {
SOAPEnvelope resenvelope = response.getEnvelope();
SOAPBody body = resenvelope.getBody();
if (body.hasFault()) {
// If a fault was found, create an AxisFault with a MessageContext so that
// other programming models can deserialize the fault to an alternative form.
AxisFault fault = new AxisFault(body.getFault(), response);
if (callback != null) {
callback.onError(fault);
} else {
axisCallback.onError(fault);
}
} else {
if (callback != null) {
AsyncResult asyncResult = new AsyncResult(response);
callback.onComplete(asyncResult);
} else {
axisCallback.onMessage(response);
}
}
}
} catch (Exception e) {
if (callback != null) {
callback.onError(e);
} else {
axisCallback.onError(e);
}
} finally {
if (callback != null) {
callback.setComplete(true);
}
}
}
}
/**
* This class acts as a callback that allows users to wait on the result.
*/
private class SyncCallBack implements AxisCallback {
boolean complete;
boolean receivedFault;
public boolean waitForCompletion(long timeout) throws AxisFault {
synchronized (this) {
try {
if (complete) return !receivedFault;
wait(timeout);
if (!complete) {
// We timed out!
throw new AxisFault( Messages.getMessage("responseTimeOut"));
}
} catch (InterruptedException e) {
// Something interrupted our wait!
error = e;
}
}
if (error != null) throw AxisFault.makeFault(error);
return !receivedFault;
}
/**
* This is called when we receive a message.
*
* @param msgContext the (response) MessageContext
*/
public void onMessage(MessageContext msgContext) {
// Transport input stream gets closed after calling setComplete
// method. Have to build the whole envelope including the
// attachments at this stage. Data might get lost if the input
// stream gets closed before building the whole envelope.
this.envelope = msgContext.getEnvelope();
this.envelope.buildWithAttachments();
}
/**
* This gets called when a fault message is received.
*
* @param msgContext the MessageContext containing the fault.
*/
public void onFault(MessageContext msgContext) {
error =Utils.getInboundFaultFromMessageContext(msgContext);
}
/**
* This is called at the end of the MEP no matter what happens, quite like a
* finally block.
*/
public synchronized void onComplete() {
complete = true;
notify();
}
private SOAPEnvelope envelope;
private Exception error;
public void onError(Exception e) {
if (log.isDebugEnabled()) {
log.debug("Entry: OutInAxisOperationClient$SyncCallBack::onError, " + e);
}
error = e;
if (log.isDebugEnabled()) {
log.debug("Exit: OutInAxisOperationClient$SyncCallBack::onError");
}
}
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?