You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@camel.apache.org by "Damien B (JIRA)" <ji...@apache.org> on 2017/05/17 09:43:04 UTC

[jira] [Commented] (CAMEL-10504) Hiding an underlying exception if MongoDbBasicConverters fails to convert to DBObject

    [ https://issues.apache.org/jira/browse/CAMEL-10504?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16013798#comment-16013798 ] 

Damien B commented on CAMEL-10504:
----------------------------------

Unfortunately it leads to another issue: when you want to use multiple inserts, the fromAnyObjectToDBObject always fail and the logs are polluted with:
WARN  Conversion has fallen back to generic Object -> DBObject, but unable to convert type org.apache.camel.impl.DefaultMessage. Returning null. java.lang.IllegalArgumentException: Infinite recursion (StackOverflowError) (through reference chain: org.apache.camel.impl.DefaultCamelContext["endpoints"]->java.util.ArrayList[0]->org.apache.camel.component.seda.SedaEndpoint["camelContext"]->org.apache.camel.impl.DefaultCamelContext["endpoints"]->java.util.ArrayList[0]->org.apache.camel.component.seda.SedaEndpoint["camelContext"]->org.apache.camel.impl.DefaultCamelContext["endpoints"]->java.util.ArrayList[0]->org.apache.camel.component.seda.SedaEndpoint["camelContext"]->org.apache.camel.impl.DefaultCamelContext["endpoints"]->java.util.ArrayList[0]->org.apache.camel.component.seda.SedaEndpoint["camelContext"]->org.apache.camel.impl.DefaultCamelContext["endpoints"]->java.util.ArrayList[0]->org.apache.camel.component.seda.SedaEndpoint["camelContext"]->org.apache.camel.impl.DefaultCamelContext["endpoints"]->java.util.ArrayList[0]->org.apache.camel.component.seda.SedaEndpoint["camelContext"]->org.apache.camel.impl.DefaultCamelContext["endpoints"]->java.util.ArrayList[0]->org.apache.camel.component.seda.SedaEndpoint["camelContext"]->org.apache.camel.impl.DefaultCamelContext["endpoints"]->java.util.ArrayList[0]->org.apache.camel.component.seda.SedaEndpoint["camelContext"]->org.apache.camel.impl.DefaultCamelContext["endpoints"]->java.util.ArrayList[0]->org.apache.camel.component.seda.SedaEndpoint["camelContext"]->org.apache.camel.impl.DefaultCamelContext["endpoints"]->java.util.ArrayList[0]

Context:
<to id="save_in_mongo"
        uri="mongodb:mongoClient?database={{mongodb.database}}&amp;collection={{coll}}&amp;writeResultAsHeader=true&amp;operation=insert" />

Body content:
a java.util.List of objects that can be converted to DBObject.

Culprit:
MongoDbProducer::createDoInsert
            boolean singleInsert = true;
            Object insert = exchange1.getIn().getBody(DBObject.class);
            // body could not be converted to DBObject, check to see if it's of type List<DBObject>
            if (insert == null) {
                insert = exchange1.getIn().getBody(List.class);
                // if the body of type List was obtained, ensure that all items are of type DBObject and cast the List to List<DBObject>
                if (insert != null) {
                    singleInsert = false;
                    insert = attemptConvertToList((List) insert, exchange1);
                } else {
                    throw new CamelMongoDbException("MongoDB operation = insert, Body is not conversible to type DBObject nor List<DBObject>");
                }
            }
to check if this a singleInsert, the conversion is attempted on the body (the list, it fails) then on the whole message (because of DefaultMessage::getBody). And then we see the cycles between DefaultCamelContext and the Endpoints.

But of course the real problem is that we have a systematic stackoverflow when trying to use multiple insert on the component, we see it only now because of this fix :-)


> Hiding an underlying exception if MongoDbBasicConverters fails to convert to DBObject
> -------------------------------------------------------------------------------------
>
>                 Key: CAMEL-10504
>                 URL: https://issues.apache.org/jira/browse/CAMEL-10504
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-mongodb
>    Affects Versions: 2.17.3, 2.18.0
>            Reporter: Evgenii Lomonosov
>            Assignee: Andrea Cosentino
>            Priority: Minor
>             Fix For: 2.18.1, 2.19.0
>
>
> If conversion fails it could be hard to understand what is a problem because it returns just a message "Conversion has fallen back to generic Object -> DBObject, but unable to convert type {}. Returning null" that points to a class that was not converted.
> In case of, as example, if a list of objects that should be converted leads to a memory error because of parent-child link are cycled for 2 objects, it would take a lot of efforts to understand what is going on. And information about underlying exception, stackoverflow in this case, could help to find the root cause much faster than now.



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)