2014-07-22 37 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

相關問題