Hi everyone, 

Nice conversation with myself... ;)

I have been looking into this problem and it seems that when a JBI Fault is
received as a result of an InOut Exchange, a Fault Message will be
initialized on the JbiExchange (which is Camel's representation of the
actual JBI Exchange). The intention is to fill this new Fault Message with
the content of the received Fault.

Everything is OK and rational up until here. However, when the new Fault
message is initialized, the servicemix-camel component attempts to SET the
Fault message on the underlying MessageExchange as well, thus resulting in
the "java.lang.IllegalStateException: component is not owner" exception,
evidently because it is not within the consumer's scope to set a Fault!

I guess this attempt to set the Fault on the JBI Message is done with good
intention.... To keep the whole Camel Exchange consistent. However, it is
not logically correct in practice.

So my question is, in the createMessage(...) method of the
org.apache.servicemix.camel.JbiExchange class, would it be safe to comment
out the messageExchange.setFault() statement, to stop it from trying to set
the Fault on the underlying MessageExchange?? Or could this have some
negative impact elsewhere?

The final result would be the following:


 private JbiMessage createMessage(String name) {
        if (messageExchange != null) {
            try {
                NormalizedMessage msg = messageExchange.getMessage(name);
                if (msg == null) {
                    if ("fault".equals(name)) {
                        Fault f = messageExchange.createFault();
                        //messageExchange.setFault(f);
                        msg = f;
                    } else {
                        msg = messageExchange.createMessage();
                        messageExchange.setMessage(msg, name);
                    }
                }
                return new JbiMessage(msg);
            } catch (JBIException e) {
                throw new RuntimeException(e);
            }
        } else {
            return new JbiMessage();
        }
    }


Many thanks!!



raulvk.soa wrote:
> 
> 
> Hi everyone,
> 
> A fix was provided and the issue was closed on JIRA. However, we are
> encountering another problem derived from the fix, and Camel is still not
> able to work with JBI Faults...... 
> 
> Please see my comment on https://issues.apache.org/activemq/browse/SM-1589
> for follow-up on this issue.
> 
> Thanks.
> 
> 
> 
> raulvk.soa wrote:
>> 
>> Hi,
>> 
>> Has anyone come across this same bug?
>> Could someone please give me a hand to fix this? I would very much
>> appreciate your help as we are pretty much stuck in our development until
>> this bug is fixed....
>> 
>> Thanks!!
>> 
>> 
>> raulvk.soa wrote:
>>> 
>>> 
>>> Hi,
>>> 
>>> I have been trying to fix this bug. I have modified the
>>> org.apache.servicemix.camel.JbiExchange.createMessage(String name) to
>>> the following:
>>> 
>>> private JbiMessage createMessage(String name) {
>>>         if (messageExchange != null) {
>>>             try {
>>>                 NormalizedMessage msg =
>>> messageExchange.getMessage(name);
>>>                 if (msg == null) {
>>>                     if(name.equals("fault")) {
>>>                             msg = messageExchange.createFault();
>>>                             messageExchange.setFault((Fault) msg);
>>>                     }
>>>                     else {
>>>                         msg = messageExchange.createMessage();
>>>                         messageExchange.setMessage(msg, name);
>>>                     }
>>>                 }
>>>                 return new JbiMessage(msg);
>>>             } catch (JBIException e) {
>>>                 throw new RuntimeException(e);
>>>             }
>>>         } else {
>>>             return new JbiMessage();
>>>         }
>>>     }
>>> 
>>> 
>>> However, now I get the following exception when a Fault is received as a
>>> response:
>>> 
>>> 18:26:41,053 | ERROR - org.apache.camel.processor.Logger - Failed
>>> delivery for exchangeId: ID-XXX-B624E47AF0/4562-1222189666671/0-147. On
>>> delivery attempt: 1 caught: java.lang.IllegalStateException: component
>>> is not owner
>>> java.lang.IllegalStateException: component is not owner
>>>         at
>>> org.apache.servicemix.jbi.messaging.MessageExchangeImpl.setMessage(MessageExchangeImpl.java:338)
>>>         at
>>> org.apache.servicemix.jbi.messaging.MessageExchangeImpl.setFault(MessageExchangeImpl.java:290)
>>>         at
>>> org.apache.servicemix.camel.JbiExchange.createMessage(JbiExchange.java:170)
>>>         at
>>> org.apache.servicemix.camel.JbiExchange.createFaultMessage(JbiExchange.java:158)
>>>         at
>>> org.apache.servicemix.camel.JbiExchange.createFaultMessage(JbiExchange.java:39)
>>>         at
>>> org.apache.camel.impl.DefaultExchange.getFault(DefaultExchange.java:251)
>>>         at
>>> org.apache.servicemix.camel.JbiExchange.getFault(JbiExchange.java:83)
>>>         at
>>> org.apache.servicemix.camel.JbiExchange.getFault(JbiExchange.java:39)
>>>         at
>>> org.apache.camel.impl.DefaultExchange.getFault(DefaultExchange.java:246)
>>>         at
>>> org.apache.servicemix.camel.JbiExchange.getFault(JbiExchange.java:78)
>>>         at
>>> org.apache.servicemix.camel.JbiExchange.getFault(JbiExchange.java:39)
>>>         at
>>> org.apache.servicemix.camel.ToJbiProcessor.process(ToJbiProcessor.java:98)
>>>         at
>>> org.apache.servicemix.camel.JbiEndpoint$1.process(JbiEndpoint.java:57)
>>>         at
>>> org.apache.camel.impl.converter.AsyncProcessorTypeConverter$ProcessorToAsyncProcessorBridge.process(AsyncProcessorTypeConverter.java:43)
>>>         at
>>> org.apache.camel.processor.SendProcessor.process(SendProcessor.java:75)
>>>         .....................
>>> 
>>> 
>>> Any suggestion as to why this is happening and how can I fix this bug,
>>> which is really blocking our development?
>>> 
>>> Thank you.
>>> 
>>> 
>>> 
>>> raulvk.soa wrote:
>>>> 
>>>> 
>>>> Hi,
>>>> 
>>>> I have found the corresponding JIRA issue
>>>> (https://issues.apache.org/activemq/browse/SM-1589), but it has minor
>>>> priority.
>>>> 
>>>> Honestly, I believe that the priority of this one should be very high,
>>>> as it is preventing Camel and ServiceMix to interact correctly. In our
>>>> scenario, we are have come across this bug and as far as I can imagine,
>>>> there is really no workaround to this until it is fixed!
>>>> 
>>>> Raul.
>>>> 
>>>> 
>>>> Gert Vanthienen wrote:
>>>>> 
>>>>> Garry,
>>>>> 
>>>>> As far as I can see, you are absolutely right about this.  Could you 
>>>>> raise a JIRA issue for it, please?  Feel free to add a unit test and a 
>>>>> patch off course, we welcome contributions ;)!
>>>>> 
>>>>> Regards,
>>>>> 
>>>>> Gert
>>>>> 
>>>>> Garry wrote:
>>>>>> Hi,
>>>>>>
>>>>>> While doing fault handling with Camel, I've been getting an
>>>>>> exception:
>>>>>>
>>>>>>   javax.jbi.messaging.MessagingException: Setting fault, but message
>>>>>> is not
>>>>>> a fault
>>>>>>   
>>>>>> In my version of org.apache.servicemix.camel.JbiExchange, around line
>>>>>> 153,
>>>>>> method 'createFaultMessage' calls 'createMessage' with argument
>>>>>> "fault."
>>>>>> Method 'createMessage' might then create a normal - not fault -
>>>>>> message and
>>>>>> set it on the exchange as a FAULT which will, if I'm looking at it
>>>>>> correctly,
>>>>>> trigger the above exception. Does this make sense?
>>>>> 
>>>>>>
>>>>>> Thanks, Garry
>>>>>>
>>>>>>   
>>>>> 
>>>>> 
>>>>> 
>>>>> -----
>>>>> ---
>>>>> Gert Vanthienen
>>>>> http://www.anova.be
>>>>> 
>>>> 
>>>> 
>>> 
>>> 
>> 
>> 
> 
> 

-- 
View this message in context: 
http://www.nabble.com/Getting-Camel-fault-exception-tp19401580p19884604.html
Sent from the ServiceMix - User mailing list archive at Nabble.com.

Reply via email to