1

Mongodb (1.1.1) 用の Scala ドライバーを使用して、一種の統合テストを作成しています。

future単純な挿入クエリがあり、またはobserver次の方法で管理できます。

// with observer
driver.myCollection.insertOne(doc).subscribe(new Observer[Completed] {
      override def onNext(result: Completed) = /* do something */
      override def onComplete() = /* do something */
      override def onError(e: Throwable) = /* do something */
    })

// with future
val f = driver.myCollection.insertOne(doc).toFuture()
f onComplete {
      case Success(successMsg) => /* do something */
      case Failure(failureMsg) => /* do something */
    }
  }

および/またはでテストonErrorするにはどうすればよいですか? この状態を引き起こすにはどうすればよいですか?ObserverFailureFuture

現時点では、私は使用してMongodb Embedded (flapdoodle)います。

テストの開始時に Mongodb をシャットダウンすると、そのエラーに関連していないように見えるタイムアウトが発生します。

アップデート

WriteConcernコレクションに追加しました:

database.getCollection(myCollection).withWriteConcern(WriteConcern.ACKNOWLEDGED)

しかし、それは何も変わりません。

タイムアウト エラー (データベースまたはネットワークが何らかの理由でダウンした場合に発生) を含む、先物/オブザーバーによって返されるエラーはありますか?

4

1 に答える 1

1

エラーを具体化する 1 つの方法は、ここで説明されているように、コレクションに一意のインデックスを作成することです: https://docs.mongodb.com/manual/core/index-unique/ 一意のインデックスを作成したら、し、もう一度挿入してみてください。そうすれば、エラーが発生します。

スローされたタイムアウトも onError でカウントされるかどうかの質問については、答えは「はい」です。カウントされます。ここに私のコードのスニペットがあります:

def findByTitle(title:String)(implicit ec:ExecutionContext):Future[Option[Document]] = {
    val collection = db.getCollection("items")
    collection.find(equal("title", title))
      .toFuture()
      .recoverWith{case e:Throwable => {println("Simulated error happened"); println(e); Future.failed(e)}}
      .map{seq => if(seq.isEmpty) None else Some(seq.head)}
  }

このメソッド呼び出しをトリガーするUIのボタンをクリックする前に、コマンドラインコマンドでMongoDBサービスを停止しましたnet stop MongoDB(私はWindowsを使用しています)。次に、アクションをトリガーし、しばらくしてタイムアウトがトリガーされたときに、コンソールに次のように表示されました。

[info] p.c.s.NettyServer - Listening for HTTP on /0:0:0:0:0:0:0:0:9000

Server started, use Alt+D to stop

[info] play.api.Play - Application started (Dev)
Simulated error happened
com.mongodb.MongoTimeoutException: Timed out after 30000 ms while waiting for a server that matches ReadPreferenceServerSelector{readPreference=primary}. Client view of cluster state is {type=UNKNOWN, servers=[{address=localhost:27017, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoException: java.io.IOException: The remote computer refused the network connection.
}, caused by {java.io.IOException: The remote computer refused the network connection.
}}]
[error] application - 
....

ご覧のとおり、タイムアウトも処理されMongoTimeoutExceptionますThrowable

于 2016-07-17T15:13:55.543 に答える