2017-01-19 29 views
0

我想要做一個使用駱駝mongo數據庫組件的多重插入。駱駝mongodb - MongoDbProducer多個插入

我的POJO的表示是:

Person { 
String firstName; 
String lastName; 
} 

我有它構建人POJO的有效列表,是一個有效的JSON結構的處理器。 當這個Person列表被髮送到mongodb生產者時,在調用createDoInsert時,到BasicDBObject的類型轉換失敗。下面這段代碼看起來就是問題所在。是否應該有更多的回退/檢查,以便在下面進一步嘗試列表轉換,因爲它在首次投出時失敗。調試MongoDbProducer,接收到的交換對象是擴展DBObject的DBList。這使得留在真正的設置singleInsert標誌,該標誌失敗下面,我們得到一個DBLIST而不是BasicDBObject插入:

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

駱駝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" /> 

和MongoDBProcessor樁施工納克人的POJO列表

@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

回答