Camel mongodb - MongoDbProducer多次插入

时间:2017-01-19 04:24:39

标签: mongodb apache-camel

我正在尝试使用camel mongo db组件进行多次插入。

我的Pojo代表是:

 Person {
 String firstName;
 String lastName;
 }

我有一个处理器,它构造一个有效的Person of pojo,并且是一个有效的json结构。 当此Person列表发送到mongodb生成器时,在调用createDoInsert时,对BasicDBObject的类型转换失败。下面这段代码看起来是个问题。它是否应该有更多的后备/检查来尝试下面的列表转换,因为它在第一次转换时失败了。调试MongoDbProducer正在接收的交换对象是扩展DBObject的DBList。这会导致singleInsert标志保持设置为true,这使得下面的插入失败,因为我们获得了DBList而不是BasicDBObject:

   if(singleInsert) {
        BasicDBObject insertObjects = (BasicDBObject)insert;
        dbCol.insertOne(insertObjects);
        exchange1.getIn().setHeader("CamelMongoOid", insertObjects.get("_id"));
    }

Camel MongoDbProducer代码片段

private Function<Exchange, Object> createDoInsert() {
    return (exchange1) -> {
        MongoCollection dbCol = this.calculateCollection(exchange1);
        boolean singleInsert = true;
        Object insert = exchange1.getIn().getBody(DBObject.class);
        if(insert == null) {
            insert = exchange1.getIn().getBody(List.class);
            if(insert == null) {
                throw new CamelMongoDbException("MongoDB operation = insert, Body is not conversible to type DBObject nor List<DBObject>");
            }

            singleInsert = false;
            insert = this.attemptConvertToList((List)insert, exchange1);
        }

        if(singleInsert) {
            BasicDBObject insertObjects = (BasicDBObject)insert;
            dbCol.insertOne(insertObjects);
            exchange1.getIn().setHeader("CamelMongoOid", insertObjects.get("_id"));
        } else {
            List insertObjects1 = (List)insert;
            dbCol.insertMany(insertObjects1);
            ArrayList objectIdentification = new ArrayList(insertObjects1.size());
            objectIdentification.addAll((Collection)insertObjects1.stream().map((insertObject) -> {
                return insertObject.get("_id");
            }).collect(Collectors.toList()));
            exchange1.getIn().setHeader("CamelMongoOid", objectIdentification);
        }

        return insert;
    };
}

我的路线如下:

    <route id="uploadFile">
    <from uri="jetty://http://0.0.0.0:9886/test"/>
    <process ref="fileProcessor"/>
    <unmarshal>
        <csv>

            <header>fname</header>
            <header>lname</header>

        </csv>

    </unmarshal>

    <process ref="mongodbProcessor" />
    <to uri="mongodb:mongoBean?database=axs175&amp;collection=insurance&amp;operation=insert" />

和构建Person Pojo列表的MongoDBProcessor

@Component
public class MongodbProcessor implements Processor {
@Override
public void process(Exchange exchange) throws Exception {

    ArrayList<List<String>> personlist = (ArrayList) exchange.getIn().getBody();
    ArrayList<Person> persons = new ArrayList<>();
    for(List<String> records : personlist){
        Person person = new Person();
        person.setFname(records.get(0));
        person.setLname(records.get(1));
        persons.add(person);
    }
exchange.getIn().setBody(persons);

}
} 

此处还要求提供信息 - http://camel.465427.n5.nabble.com/Problems-with-MongoDbProducer-multiple-inserts-tc5792644.html

1 个答案:

答案 0 :(得分:0)

此问题现已通过 - https://issues.apache.org/jira/browse/CAMEL-10728

修复