⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 httpexternalservice.java

📁 bpel执行引擎用来执行bpel业务流程
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
                processResponse(statusCode);            } catch (final IOException e) {                // ODE MEX needs to be invoked in a TX.                try {                    scheduler.execIsolatedTransaction(new Callable<Void>() {                        public Void call() throws Exception {                            PartnerRoleMessageExchange odeMex = (PartnerRoleMessageExchange) server.getEngine().getMessageExchange(mexId);                                                        String errmsg = "Unable to execute http request : " + e.getMessage();                            log.error(errmsg, e);                            odeMex.replyWithFailure(MessageExchange.FailureType.COMMUNICATION_ERROR, errmsg, null);                            return null;                        }                    });                } catch (Exception e1) {                    String errmsg = "Error executing reply transaction; reply will be lost.";                    log.error(errmsg, e);                }            } finally {                method.releaseConnection();            }            return null;        }        public void processResponse(int statusCode) {            // a one-way message does not care about the response            try {                // log the URI since the engine may have moved on while this One Way request was executing                if (statusCode >= 400) {                    if (log.isWarnEnabled())                        log.warn("OneWay http request [" + method.getURI() + "] failed with status: " + method.getStatusLine());                } else {                    if (log.isDebugEnabled())                        log.debug("OneWay http request [" + method.getURI() + "] status: " + method.getStatusLine());                }            } catch (URIException e) {                if (log.isDebugEnabled()) log.debug(e);            }        }    }    private class TwoWayCallable extends OneWayCallable {        public TwoWayCallable(org.apache.commons.httpclient.HttpClient client, HttpMethod method, String mexId, Operation operation) {            super(client, method, mexId, operation);        }        public void processResponse(final int statusCode) {            try {                // ODE MEX needs to be invoked in a TX.                scheduler.execIsolatedTransaction(new Callable<Void>() {                    public Void call() throws Exception {                        if (statusCode >= 200 && statusCode < 300) {                            _2xx_success();                        } else if (statusCode >= 300 && statusCode < 400) {                            _3xx_redirection();                        } else if (statusCode >= 400 && statusCode < 500) {                            _4xx_badRequest();                        } else if (statusCode >= 500 && statusCode < 600) {                            _5xx_serverError();                        } else {                            unmanagedStatus();                        }                        return null;                    }                });            } catch (Exception e) {                String errmsg = "Error executing reply transaction; reply will be lost.";                log.error(errmsg, e);            }        }        private void unmanagedStatus() throws IOException {            PartnerRoleMessageExchange odeMex = (PartnerRoleMessageExchange) server.getEngine().getMessageExchange(mexId);            String errmsg = "Unmanaged Status Code! " + method.getStatusLine();            log.error(errmsg);            odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method));        }        /**         * For 500s if a fault is defined in the WSDL and the response body contains the corresponding xml doc, then reply with a fault ; else reply with failure.         *         * @throws IOException         */        private void _5xx_serverError() throws IOException {            String errmsg = "Internal Server Error! " + method.getStatusLine();            log.error(errmsg);            PartnerRoleMessageExchange odeMex = (PartnerRoleMessageExchange) server.getEngine().getMessageExchange(mexId);            Operation opDef = odeMex.getOperation();            BindingOperation opBinding = portBinding.getBindingOperation(opDef.getName(), opDef.getInput().getName(), opDef.getOutput().getName());            if (opDef.getFaults().isEmpty()) {                errmsg = "Operation has no fault. This 500 error will be considered as a failure.";                if (log.isDebugEnabled()) log.debug(errmsg);                odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method));            } else if (opBinding.getBindingFaults().isEmpty()) {                errmsg = "No fault binding. This 500 error will be considered as a failure.";                if (log.isDebugEnabled()) log.debug(errmsg);                odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method));            } else if (method.getResponseBodyAsStream() == null) {                errmsg = "No body in the response. This 500 error will be considered as a failure.";                if (log.isDebugEnabled()) log.debug(errmsg);                odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method));            } else {                final InputStream bodyAsStream = method.getResponseBodyAsStream();                try {                    Element bodyEl = DOMUtils.parse(bodyAsStream).getDocumentElement();                    QName bodyName = new QName(bodyEl.getNamespaceURI(), bodyEl.getNodeName());                    Fault faultDef = WsdlUtils.inferFault(opDef, bodyName);                    // is this fault bound with ODE extension?                    if (!WsdlUtils.isOdeFault(opBinding.getBindingFault(faultDef.getName()))) {                        errmsg = "Fault " + bodyName + " is not bound with " + new QName(Namespaces.ODE_HTTP_EXTENSION_NS, "fault") + ". This 500 error will be considered as a failure.";                        if (log.isDebugEnabled()) log.debug(errmsg);                        odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method));                    } else {                        Part partDef = (Part) faultDef.getMessage().getParts().values().iterator().next();                        // build the element to be sent back                        Document odeMsg = DOMUtils.newDocument();                        Element odeMsgEl = odeMsg.createElementNS(null, "message");                        Element partEl = odeMsgEl.getOwnerDocument().createElementNS(null, partDef.getName());                        odeMsgEl.appendChild(partEl);                        // import the response body                        partEl.appendChild(odeMsgEl.getOwnerDocument().importNode(bodyEl, true));                        QName faultType = new QName(targetNamespace, faultDef.getName());                        Message response = odeMex.createMessage(faultType);                        response.setMessage(odeMsgEl);                        // extract and set headers                         httpMethodConverter.extractHttpResponseHeaders(response, method, faultDef.getMessage(), opBinding.getBindingOutput());                        // finally send the fault. We did it!                        odeMex.replyWithFault(faultType, response);                    }                } catch (Exception e) {                    errmsg = "Unable to parse the response body as xml. This 500 error will be considered as a failure.";                    if (log.isDebugEnabled()) log.debug(errmsg, e);                    odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method, false));                }            }        }        private void _4xx_badRequest() throws IOException {           PartnerRoleMessageExchange odeMex = (PartnerRoleMessageExchange) server.getEngine().getMessageExchange(mexId);            String errmsg = "Bad Request! " + method.getStatusLine();            log.error(errmsg);            odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method));        }        private void _3xx_redirection() throws IOException {            PartnerRoleMessageExchange odeMex = (PartnerRoleMessageExchange) server.getEngine().getMessageExchange(mexId);            String errmsg = "Redirections are not supported! " + method.getStatusLine();            log.error(errmsg);            odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method));        }        private void _2xx_success() {            PartnerRoleMessageExchange odeMex = (PartnerRoleMessageExchange) server.getEngine().getMessageExchange(mexId);            if (log.isDebugEnabled()) log.debug("Http Status Line=" + method.getStatusLine());            if (log.isDebugEnabled()) log.debug("Received response for MEX " + odeMex);            Operation opDef = odeMex.getOperation();            BindingOperation opBinding = portBinding.getBindingOperation(opDef.getName(), opDef.getInput().getName(), opDef.getOutput().getName());            // assumption is made that a response may have at most one body. HttpBindingValidator checks this.            MIMEContent outputContent = WsdlUtils.getMimeContent(opBinding.getBindingOutput().getExtensibilityElements());            boolean isBodyMandatory = outputContent != null && outputContent.getType().endsWith("text/xml");            try {                final InputStream bodyAsStream = method.getResponseBodyAsStream();                if (isBodyMandatory && bodyAsStream == null) {                    String errmsg = "Response body is mandatory but missing! Msg Id=" + odeMex.getMessageExchangeId();                    log.error(errmsg);                    odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, null);                } else {                    javax.wsdl.Message outputMessage = odeMex.getOperation().getOutput().getMessage();                    Message odeResponse = odeMex.createMessage(outputMessage.getQName());                    // handle the body if any                    if (bodyAsStream != null) {                        // only text/xml is supported in the response body                        try {                            Element bodyElement = DOMUtils.parse(bodyAsStream).getDocumentElement();                            // we expect a single part per output message                            // see org.apache.ode.axis2.httpbinding.HttpBindingValidator call in constructor                            Part part = (Part) outputMessage.getParts().values().iterator().next();                            Element partElement = httpMethodConverter.createPartElement(part, bodyElement);                            odeResponse.setPart(part.getName(), partElement);                        } catch (Exception e) {                            String errmsg = "Unable to parse the response body: " + e.getMessage();                            log.error(errmsg, e);                            odeMex.replyWithFailure(MessageExchange.FailureType.FORMAT_ERROR, errmsg, null);                            return;                        }                    }                    // handle headers                    httpMethodConverter.extractHttpResponseHeaders(odeResponse, method, outputMessage, opBinding.getBindingOutput());                                        try {                        if (log.isInfoEnabled())                            log.info("Response:\n" + DOMUtils.domToString(odeResponse.getMessage()));                        odeMex.reply(odeResponse);                    } catch (Exception ex) {                        String errmsg = "Unable to process response: " + ex.getMessage();                        log.error(errmsg, ex);                        odeMex.replyWithFailure(MessageExchange.FailureType.OTHER, errmsg, HttpClientHelper.prepareDetailsElement(method));                    }                }            } catch (IOException e) {                String errmsg = "Unable to get the request body : " + e.getMessage();                log.error(errmsg, e);                odeMex.replyWithFailure(MessageExchange.FailureType.FORMAT_ERROR, errmsg, null);                return;            }        }    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -