2014-07-22 41 views
1

我在Groovy中我简单Vertx脚本,应该发送一个请求,Redis的得到一个值回: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

你好。这看起来非常像模块中的例子以及它看起来应该如何工作的例子。 Redis如何/在哪里运行?可能出于好奇,它不接受本地主机连接,而是接受127.0.0.1连接?也许值得一试。也许你有更多关于设置的信息。 – INsanityDesign

+0

嗨,我已经尝试使用127.0.0.1,但没有任何更改。我在Ubuntu 14.04上运行Redis。我用“src/redis-server”下载,编译并运行Redis(我没有更改配置中的任何内容)。我用vertx run scripts/Redis.groovy(不编译,只是运行脚本)启动我的vert.x脚本。 – Randomize

回答

1

问题是,你的deployModule并按顺序发送到EventBus,即使该调用是异步的。

所以,当你调用deployModule模块部署被触发,但eb.send被调用之前无法得到保证。通过这个,你发送了正确的命令,但是它不能被计算,因为模块不在那里。

尝试在加入测试命令从https://github.com/vert-x/mod-redis的deployModule

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在Vagrant安装本地进行了本地测试。总体而言,由于Vert.x的关键概念,Vert.x的开发接近始终不同步。它需要一段时间才能熟悉它,但它有它的好处:)

希望这会有所帮助。

最好

+0

它的工作原理,谢谢,你是绝对正确的,“部署”是异步的。一旦成功,对Redis的请求就可以正常执行。 – Randomize

相关问题