Note that there are some explanatory texts on larger screens.

plurals
  1. POhow to avoid race condition when using Scala's Actor
    text
    copied!<p>I am writing a piece of code that would populate a mongoDB collection when the buffer (list) grow to a certain size. </p> <pre><code>import scala.actors.Actor import com.mongodb.casbah.Imports._ import scala.collection.mutable.ListBuffer class PopulateDB extends Actor { val buffer = new ListBuffer[DBObject] val mongoConn = MongoConnection() val mongoCol = mongoConn("casbah_test")("logs") def add(info: DBObject = null) { if (info != null) buffer += info if (buffer.size &gt; 0 &amp;&amp; (info == null || buffer.length &gt;= 1000)) { mongoCol.insert(buffer.toList) buffer.clear println("adding a batch") } } def act() { loop { react { case info: DBObject =&gt; add(info) case msg if msg == "closeConnection" =&gt; println("Close connection") add() mongoConn.close } } } } </code></pre> <p>However, when I run the following code, scala will occasionally throw a "ConcurrentModificationException" on the "mongoCol.insert(buffer.toList)" line. I am pretty sure it has something to do with "mongoCol.insert". I am wondering if there is anything fundamentally wrong with the code. Or should I use something like the "atomic {...}" from Akka to avoid the issue.</p> <p>Here's the complete stack trace:</p> <pre><code>PopulateDB@7e859a68: caught java.util.ConcurrentModificationException java.util.ConcurrentModificationException at java.util.LinkedHashMap$LinkedHashIterator.nextEntry(LinkedHashMap.java:373) at java.util.LinkedHashMap$EntryIterator.next(LinkedHashMap.java:392) at java.util.LinkedHashMap$EntryIterator.next(LinkedHashMap.java:391) at org.bson.BSONEncoder.putObject(BSONEncoder.java:113) at org.bson.BSONEncoder.putObject(BSONEncoder.java:67) at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:215) at com.mongodb.DBApiLayer$MyCollection.insert(DBApiLayer.java:180) at com.mongodb.DBCollection.insert(DBCollection.java:85) at com.mongodb.casbah.MongoCollectionBase$class.insert(MongoCollection.scala:561) at com.mongodb.casbah.MongoCollection.insert(MongoCollection.scala:864) at PopulateDB.add(PopulateDB.scala:14) at PopulateDB$$anonfun$act$1$$anonfun$apply$1.apply(PopulateDB.scala:26) at PopulateDB$$anonfun$act$1$$anonfun$apply$1.apply(PopulateDB.scala:25) at scala.actors.ReactorTask.run(ReactorTask.scala:34) at scala.actors.Reactor$class.resumeReceiver(Reactor.scala:129) at PopulateDB.scala$actors$ReplyReactor$$super$resumeReceiver(PopulateDB.scala:5) at scala.actors.ReplyReactor$class.resumeReceiver(ReplyReactor.scala:69) at PopulateDB.resumeReceiver(PopulateDB.scala:5) at scala.actors.Actor$class.searchMailbox(Actor.scala:478) at PopulateDB.searchMailbox(PopulateDB.scala:5) at scala.actors.Reactor$$anonfun$startSearch$1$$anonfun$apply$mcV$sp$1.apply(Reactor.scala:114) at scala.actors.Reactor$$anonfun$startSearch$1$$anonfun$apply$mcV$sp$1.apply(Reactor.scala:114) at scala.actors.ReactorTask.run(ReactorTask.scala:36) at scala.concurrent.forkjoin.ForkJoinPool$AdaptedRunnable.exec(ForkJoinPool.java:611) at scala.concurrent.forkjoin.ForkJoinTask.quietlyExec(ForkJoinTask.java:422) at scala.concurrent.forkjoin.ForkJoinWorkerThread.mainLoop(ForkJoinWorkerThread.java:340) at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:325) </code></pre> <p>Thanks, Derek</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload