Hi,

Looking further into this.  I can see that in
org.apache.servicemix.camel.CamelProviderEndpoint onFailure, the camel
exchange details are copied to the MessageExchange, but the exception is
not.

If I explicitely copy the camel exception to the MessageExchange as in bold
below, then the exception navigates the JBI NMR.

public void onFailure(Exchange exchange) {
        MessageExchange me = JbiBinding.getMessageExchange(exchange);
        try {
            if (exchange.hasOut()) {
                Fault fault = me.createFault();
                me.setError(binding.extractException(exchange));
                binding.copyFromCamelToJbi(exchange.getOut(), fault);
                if (isFaultCapable(me)) {
                    me.setFault(fault);
                    doSend(me);
                } else {
                    // MessageExchange is not capable of conveying faults --
sending the information as an error instead
                    fail(me, new FaultException("Fault occured for " +
exchange.getPattern() + " exchange", me, fault));
                }
            } else {
                fail(me, binding.extractException(exchange));
            }
        } catch (MessagingException e) {
            logger.warn("Unable to send JBI MessageExchange after successful
Camel route invocation: " + me, e);
        } 
    }

Please could someone with more experience than me comment on whether there
is anything wrong with this approach and whether it makes sense to raise a
JIRA?

Thanks for looking,
Steve.


slew wrote:
> 
> Hi,
> 
> I'm using camel 2.3 within smx 3.3.2.
> 
> The main camel route implements a routing slip.  The steps in the routing
> slip are made up from other jbi service assemblies, for example that do
> things like custom validation, auditing.  The idea being that new jbi
> components can be deployed to smx then configured in the routing slip at
> runtime to modify behaviour.
> 
> My first implementation used the vm component to communicate between the
> different camel contexts, but I was advised that this is not the correct
> way to do things and I should use camel's jbi component - which makes
> sense and was obvious once pointed out.
> 
> The thing I'm not sure about is how best/correctly to propagate
> exceptions.  When using the vm components, exceptions could be thrown in
> one route and caught in another, but this isn't the same for jbi as the
> exchange goes through the NMR.
> 
> I've tried throwing an exception from the camel route with and without the
> convertException option set, but although the route is marked as a fault
> and I get a FaultException in the CamelExceptionCaught property, I lose
> the details of the exception.
> 
> The other option I tried was setFaultBody and converting the exception to
> and from xml.
> 
> What I'd like to know is what the recommended way to do this, so I don't
> end up implementing a long winded approach when there's a better
> alternative I just can't see.
> 
> Thanks for any help,
> Steve.
> 

-- 
View this message in context: 
http://servicemix.396122.n5.nabble.com/JBI-Exception-Propagation-Advice-tp3211854p3219019.html
Sent from the ServiceMix - User mailing list archive at Nabble.com.

Reply via email to