2016-01-31 23 views
5

Bei Verwendung des MongoDB Async-Java-Treibers: Muss der folgende Callback einen AtomicInteger-Zähler verwenden oder würde ein normaler Int den Job ausführen?Muss MongoCollection.forEach threadsicher sein?

Block<Document> theBlock = new Block<Document>() { 
    AtomicInteger counter = new AtomicInteger(); 
    @Override 
    public void apply(final Document document) { 
    counter.incrementAndGet(); 
    } 
}; 
SingleResultCallback<Void> callbackWhenFinished = ... 

collection.find().forEach(theBlock, callbackWhenFinished); 

Antwort

2

Der einzige wirkliche Unterschied zwischen dem MongoDB Java API und dessen async Gegenstück ist, dass die Methoden der letzteren nicht blockierend sind und Rückrufe als Argumente. Dies bedeutet, dass das, was Sie in Ihrem Rückruf erhalten, dem entspricht, was die Methode in der nicht-asynchronen API zurückgibt.

Hier verwenden Sie die find Methode. Es gibt ein "normales" iterables zurück, sodass das Aufrufen von forEach nicht zu mehreren Threads führt.

Mit anderen Worten, Sie brauchen keine AtomicInteger: Ihre apply Verfahren werden nacheinander aufgerufen, von dem selben Thread.


Wenn Sie noch Zweifel haben oder einen „Beweis“ benötigen, können Sie eine der folgenden Möglichkeiten:

  1. einen System.out.println(Thread.currentThread().getName()); in Ihrem Block hinzuzufügen. Sie werden sehen, dass es immer vom selben Thread ausgeführt wird.
  2. fügen Sie einen Haltepunkt innerhalb Ihres Blocks hinzu, der so konfiguriert ist, dass nur der Thread gestoppt wird. Der Haltepunkt wird den gesamten Code erneut blockieren.