ReactiveMongo是否支持压缩?



我使用ReactiveMongo作为Akka-Http, Akka-Streams项目的连接器。我正在创建MongoConnection,如下所示,但是数据库中的数据是使用Snappy压缩的。无论我去哪里看,我都找不到ReactiveMongo文档中提到的压缩支持。当我尝试使用带有compressors=snappy标志的URL连接到Mongo数据库时,它返回一个异常。

我查看了源代码,确实它似乎根本没有提到压缩支持。在这一点上,我愿意接受一个hack的工作。

有谁能帮帮我吗?
MongoConnection.fromString("mongodb://localhost:27017?compressors=snappy").flatMap(uri => driver.connect(uri))

异常:

23:09:15.311 [default-akka.actor.default-dispatcher-6] ERROR akka.actor.ActorSystemImpl - Error during processing of request: 'The connection URI contains unsupported options: compressors'. Completing with 500 Internal Server Error response. To change default exception handling behavior, provide a custom ExceptionHandler.
java.lang.IllegalArgumentException: The connection URI contains unsupported options: compressors
at reactivemongo.api.AsyncDriver.connect(AsyncDriver.scala:227)
at reactivemongo.api.AsyncDriver.connect(AsyncDriver.scala:203)
at reactivemongo.api.AsyncDriver.connect(AsyncDriver.scala:252)

如果你需要一个可行的例子,你可以试试这个:(你实际上不需要一个MongoDB容器在本地运行的错误被抛出)

object ReactiveMongoCompressorIssue extends App {
import scala.concurrent.Await
import scala.concurrent.duration._
implicit val actorSystem = ActorSystem("ReactiveMongoCompressorIssue")
implicit val dispatcher: ExecutionContextExecutor   = actorSystem.dispatcher
final val driver = AsyncDriver()
val url = "mongodb://localhost:27017/?compressors=snappy"
val connection = Await.result(MongoConnection.fromString(url).flatMap(uri => driver.connect(uri)), 3.seconds)
assert(connection.active)
}

感谢@cchantep所说的MongoDB在服务器端如何处理压缩(参见MongoDB文档在这里),我回到了ReactiveMongo源代码,看看是否有一种方法可以绕过检查或从URL中删除标记自己和连接没有它。

确实,我发现有一个布尔标志叫做strictMode,它决定ignoredOptionscompressors标志是否应该引起异常被抛出。现在我的连接是这样的:

MongoConnection.fromString(url).flatMap(uri => driver.connect(uri, None, strictMode = false))

None指的是连接池的名称,但我之前使用的其他connect方法也不使用一个,所以这很好。

谢谢你的帮助!

最新更新