ArrayBuffer插入null元素

时间:2017-03-22 03:37:52

标签: java mongodb scala

我正在尝试使用Scala和Mongodb执行批量写入。目前,我正在使用ArrayBuffer缓冲一些文档,并在一段时间后调用bulkwrite函数进行保存。

我有以下代码:

def saveActivity(activity: Activity) {    
  saveCount += 1;
  val myDoc = Json.toJson(activity).toString  
  var doc: Document = Document(myDoc)
  doc += "initialTime" -> BsonDateTime.apply(activity.initialTime);
  doc += "endingTime" -> BsonDateTime.apply(activity.endingTime);     
  val fId = fileIdsMap.get(activity.file_id);
  doc += "file_id" -> fId;
  doc += "userId" -> usersMap.get(activity.meta.userId)

  if(doc == null)
    println("Inserting a null document!")

  activitiesBuffer.append(doc);

  if(saveCount % 1000 == 0) {
    bulkSave(activitiesBuffer);      
    activitiesBuffer.clear()
  }
}      

我使用bulkwrite保存的代码如下:

def bulkSave(batch:ArrayBuffer[Document]) {    
    val requests = batch.map(doc => {  
       if(doc == null)
        println(s"Found a null document");
       new InsertOneModel[Document](doc)       
      })    
    val observable = MongoFactory.MyCollection.bulkWrite(requests.toList, new BulkWriteOptions().ordered(false))
    val ed = Await.result(observable.toFuture, Duration.Inf).asInstanceOf[List[com.mongodb.bulk.BulkWriteResult]](0)        
    println(s"BULKWRITE FINISHED")

  }

我的主循环是消耗来自KafkaPool的jsons:

while (true) {          
  val records = consumer.poll(1000)          
  for (record <- records) {
    val json: JsValue = Json.parse(record.value())
    val arquivo = Json.fromJson[Activity](json);            
    val activity = json.as[Activity]
    saveActivity(activity)                                
  }              
}

问题是在某种程度上,在arraybuffer的中间插入了一个空文档。

这两张照片用于验证何时出现空文件。 (saveActivity函数中的一个和bulkSave函数中的一个。从这两个中,只调用bulkwrite map函数中的一个。实际将文档附加到缓冲区的那个永远不会被调用。我收到以下错误:

  

java.lang.IllegalArgumentException:document不能为null   java.lang.IllegalArgumentException:document不能为null   com.mongodb.assertions.Assertions.notNull(Assertions.java:37)at   com.mongodb.client.model.InsertOneModel。(InsertOneModel.java:37)     在Translator $$ anonfun $ 5.apply(Translator.scala:101)at   翻译$$ anonfun $ 5.apply(Translator.scala:96)at   scala.collection.TraversableLike $$ anonfun $表$ 1.适用(TraversableLike.scala:245)     在   scala.collection.TraversableLike $$ anonfun $表$ 1.适用(TraversableLike.scala:245)     在   scala.collection.mutable.ResizableArray $ class.foreach(ResizableArray.scala:59)     在scala.collection.mutable.ArrayBuffer.foreach(ArrayBuffer.scala:48)     在   scala.collection.TraversableLike $ class.map(TraversableLike.scala:245)     在scala.collection.AbstractTraversable.map(Traversable.scala:104)     在Translator.bulkSaveActivities(Translator.scala:96)at   Translator.saveActivity(Translator.scala:146)at   Translator.proccessActivity(Translator.scala:187)at   翻译$$不久$ 1 $$ anonfun $运行$ 1.适用(Translator.scala:263)     在   翻译$$不久$ 1 $$ anonfun $运行$ 1.适用(Translator.scala:256)     在scala.collection.Iterator $ class.foreach(Iterator.scala:742)at   scala.collection.AbstractIterator.foreach(Iterator.scala:1194)at   scala.collection.IterableLike $ class.foreach(IterableLike.scala:72)at   scala.collection.AbstractIterable.foreach(Iterable.scala:54)at   译者$ anon $ 1.run(Translator.scala:256)at   java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)     在   java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:617)     在java.lang.Thread.run(Thread.java:745)

我试图打印地图批次,我看到了这个(只显示了一小部分):

  

...文献((activityCount,BsonInt32 {值= 1}),   (initialTime,BsonDateTime {值= 1448272800000}),   (endingTime,BsonDateTime {值= 1448276400000}),   (帐户,BsonString {值=#39&; 0&#39;}),   (的file_id,BsonString {值=&#39; 58d1ed13c1728a63986a6052&#39;}),   (userId,BsonString {value =&#39; 58d1ed0dc1728a63986a52d8&#39;})), null ,   文献((activityCount,BsonInt32 {值= 1}),   (initialTime,BsonDateTime {value = 1432789200000}),(...

正如你所看到的,它上面有一个空元素,我不知道它是如何去的。有人有什么建议吗?提前致谢

0 个答案:

没有答案