Sunday, 8 September 2013

scala Await.result alwasy throws TimeoutException in vertx eventbus handler

scala Await.result alwasy throws TimeoutException in vertx eventbus handler

I am trying to access Postgrest to check if member id if it is the
database by using mod-mysql-postgresql in a vertx verticle. However, this
database access code is executed in a eventbus's handler. This handler
should return the result with found member id to clients. I tried to use
Await.result, but it always give me TimeoutException. Should I change my
database access to JDBC access instead of async mod-mysql-postgresql.
protected def pgSend(q: JsonObject): Future[JsonObject] = {
val p = Promise[JsonObject]
verticle.getVertx.eventBus.send(pgAddress, q, new
Handler[Message[JsonObject]]() {
override def handle(reply: Message[JsonObject]) = {
p.success(reply.body)
}
})
p.future
}
private def getMemberIdFromDB(memberIdStr: String):String = {
toLong(memberIdStr) match {
case Some(memberId) => {
val fieldsArray = new JsonArray("""["member_id","email"]""")
val condition = new JsonObject().putObject("$eq", new
JsonObject().putNumber("member_id", memberId))
val future: Future[JsonObject] = pgSend(select("member_info",
fieldsArray, condition))
val mapResult: Future[String] = future.map(reply =>
reply.getArray("results") match {
case arr: JsonArray => {
val row : JsonArray = arr.get[JsonArray](0)
row.get[String](0)
}
case _ => "member id is incorrect"
}
)
val result = Await.result( mapResult, 5 seconds )
result
}
case _ => "member id format is incorrect"
}
}
def handle(event: Message[JsonObject]) {
message.getString("action") match {
case "connect" => // connect to server
val name = message.getString("name")
message.getString("memberId") match { // client has memberId?
case null => new JsonObject().putBoolean("success", false)
case memberId => // check memberId
val mId = getMemberIdFromDB(memberId)
new JsonObject().putBoolean("success", true).putString("mId",
mId) // reply with token
}
}
}

No comments:

Post a Comment