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

脚本正确启动,但是没有返回值(答复)。

我想念什么吗?

最佳答案

问题是,即使调用是异步的,您也可以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中的开发几乎总是异步的。花费一些时间来熟悉它,但是它有其好处:)

希望这可以帮助。

最好

07-25 21:38
查看更多