我在Groovy中有一个简单的Vertx脚本应该向Redis发送请求以获取值:
def eb = vertx.eventBus
def config = [:]
def address = 'vertx.mod-redis-io'
config.address = address
config.host = 'localhost'
config.port = 6379
container.deployModule("io.vertx~mod-redis~1.1.4", config)
eb.send(address, [command: 'get', args: ['mykey']]) { reply ->
if (reply.body.status.equals('ok')) {
println 'ok'
// do something with reply.body.value
} else {
println("Error ${reply.body.message}")
}
}
'mykey'的值定期存储在我的Redis上(localhost:6379):
127.0.0.1:6379> get mykey
"Hello"
脚本正确启动但未返回任何值(回复)。
我错过了什么吗?
答案 0 :(得分:1)
问题是您 deployModule 并按顺序发送到EventBus,即使该调用是异步的。
因此,当您调用 deployModule 时,会触发模块部署,但在调用 eb.send 之前无法保证。通过这个你发送正确的命令,但它没有得到计算,因为模块不存在。
在将测试命令添加到deployModule
的AsyncHandler时,请尝试以下操作container.deployModule("io.vertx~mod-redis~1.1.4", config) { asyncResult ->
if(asyncResult.succeeded) {
eb.send(address, [command: 'get', args: ['mykey']]) { reply ->
if (reply.body.status.equals('ok')) {
println 'ok'
// do something with reply.body.value
} else {
println("Error ${reply.body.message}")
}
}
} else {
println 'Deployment broken!'
}
}
来自https://github.com/vert-x/mod-redis的示例可能不是最好的,因为它只是指向方向的片段。
这是有效的,因为它只在部署模块时将请求发送到总线,并由有人收听它。我在Redis的Vagrant文章中进行了本地测试。
总的来说,由于其关键概念,Vert.x中的开发几乎总是异步的。熟悉它需要一些时间,但它有其好处:)
希望这有帮助。
最佳