Vertx和Redis:我不能让他们一起工作

时间:2014-07-22 07:53:45

标签: groovy redis vert.x

我在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"

脚本正确启动但未返回任何值(回复)。

我错过了什么吗?

1 个答案:

答案 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中的开发几乎总是异步的。熟悉它需要一些时间,但它有其好处:)

希望这有帮助。

最佳