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

Groovy Vertx和Redis:我不能让他们一起工作,groovy,redis,vert.x,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", con

我在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):

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

我遗漏了什么吗?

问题是您部署模块并按顺序发送到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!'
    }
}
来自的示例可能不是最好的,因为它只是指向方向的一个片段

这是因为它只会在模块部署完成后以及有人监听时将请求发送到总线。我在Redis的一个流浪分期付款上进行了本地测试

总的来说,由于Vert.x的关键概念,它的开发几乎总是异步的。了解它需要一些时间,但它也有好处:)

希望这有帮助


最好的

你好。这看起来与模块中的示例以及它的工作方式非常相似。Redis如何/在哪里运行?可能只是出于好奇,它不接受本地主机连接,而是接受127.0.0.1连接?也许值得一试。也许你有更多关于设置的信息。嗨,我已经尝试过使用127.0.0.1,但是没有任何改变。我在Ubuntu 14.04上运行Redis。我已经用“src/Redis服务器”下载、编译并运行了Redis(配置中我没有做任何更改)。我用:vertx run scripts/Redis.groovy(无需编译,只需运行脚本)启动我的vert.x脚本。它可以工作,谢谢,你说得绝对正确,“部署”是异步的。一旦成功,可以正常执行对Redis的请求。
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!'
    }
}