You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@camel.apache.org by Miroslav Beranič <mi...@mibesis.si> on 2018/12/20 12:36:04 UTC

How-to: Return SOAPFault from JMS Queue Processor

Hi,

I've found multiple examples and forums posts regarding this, but not
exactly like what I have.

I've configured CXF Endpoint using Blueprint XML ( use XML tag cxfEndpoint
), and I forward SOAP requests to JMS queue - different for each SOAPAction.

<camelcxf:cxfEndpoint id="SoapWebserviceEndpoint" ... />

<camelContext id="SOAPWebservice_Master" xmlns="
http://camel.apache.org/schema/blueprint">
<route id="Default">
            <from uri="SoapWebserviceEndpoint"/>
            <log message="Received SOAP Request."/>
            <choice>
                <when>
                    <simple>'GetVersion' ==
${in.headers['SOAPAction']}</simple>
                    <log message="Forward SOAP call to GetVersion."/>
                    <to uri="activemq:queue:SOAPWebservice/GetVersion"/>
                </when>
                <otherwise>
                    <throwException
exceptionType="java.lang.IllegalStateException" message="Method not
implemented. SOAP Action: ${in.headers['SOAPAction']}." />
                </otherwise>
            </choice>
        </route>

    </camelContext>

Works like a charm. No problem. Well, until there is a problem --
ExceptionHandling.

General idea is, to have "ExceptionHandler" queue, that will handle
exception and return "simple" SOAPFault, like this:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Server</faultcode>
         <faultstring>Method not implemented. SOAP Action:
GetSoapMethod.</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

I've added ( as sibling to route Default ):

        <route id="CatchException">
            <from uri="activemq:queue:SOAPWebservice/HandleException"/>
            <log message="Caught Exception. Will pass it to the Exception
Handler Processor now."/>
            <process ref="ExceptionHandlerProcessor"/>
        </route>

and at the beginning I've added:

<onException useOriginalMessage="true">
    <exception>java.lang.Exception</exception>
    <redeliveryPolicy maximumRedeliveries="0"/>
    <handled>
        <constant>true</constant>
    </handled>
    <to uri="activemq:queue:SOAPWebservice/HandleException" />
</onException>


But now, I get:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <soap:Fault>
         <faultcode>soap:Server</faultcode>
         <faultstring>Part {
http://soap.example.com/SoapWebservice}parameters should be of type
com.example.soap.model.soapwebservice.GetSoapMethodResponse, not
java.lang.IllegalStateException</faultstring>
      </soap:Fault>
   </soap:Body>
</soap:Envelope>

Exception Handler ( bean ExceptionHandlerProcessor ) is like:

public void process(final Exchange exchange) throws Exception {
        final Message message = exchange.getOut();
        message.setFault(true);
        message.setBody(exchange.getProperty(Exchange.EXCEPTION_CAUGHT,
Exception.class));
}

I've checked RHEL, Talend, ... documentation, like this:
https://help.talend.com/reader/8avcOyufaVYo7Uoah0kOlA/0JGn1C8bhm~R_OP82fgzzg

And this all works using direct and similar routeing, until I do not move
routing to the JMS queue. What am I doing wrong?

Kind Regards,
Miroslav




-- 
Miroslav Beranič
MIBESIS
+386(0)40/814-843
miroslav.beranic@mibesis.si
http://www.mibesis.si