无法使用Vertx.io上的官方代码示例中的Vertx EventBus

时间:2017-03-25 00:47:41

标签: ruby jruby vert.x event-bus

我有两个用Ruby编写的非常简单的Vertx Verticle:

### sender.rb
require 'vertx/vertx'
require 'date'
vertx = Vertx::Vertx.vertx()
event_bus = vertx.event_bus()
vertx.set_periodic(2000) { |v| 
msg = "Ruby NOW " + DateTime.now.strftime("%H:%M:%S")
puts(msg)
event_bus.publish("news.uk.sport", msg)
}

### listener.rb
require 'vertx/vertx'
vertx = Vertx::Vertx.vertx()
event_bus = vertx.event_bus()
consumer = event_bus.consumer("news.uk.sport")
consumer.handler() { |message|
puts "I have received a message: #{message.body()}"
}
consumer.completion_handler() { |res_err,res|
if (res_err == nil)
puts "The handler registration has reached all nodes"
else
puts "Registration failed!"
end
}

我完全从vertx.io文档中的代码示例构建了这两个Verticle。

我打开2个终端会话。 在第一个终端,我部署sender.rb verticle:

$ vertx run sender.rb

在第二个终端i部署listener.rb verticle:

$ vertx run listener.rb

发件人发送并打印邮件,但是侦听器没有收到任何内容(没有来自listener.rb的打印输出)

我试图用标志

运行vertx

-ha

-cluster

但它没有帮助。请帮忙。

更新

非常感谢 Tsegismont 我已经重新实现了listener.rb和sender.rb,它起作用了:)

现在我纯粹出于好奇而提出一些问题:

在我的发件人中:

     simple_eventbus git:(master) ✗ vertx run sender.rb -cluster
Starting clustering... 
No cluster-host specified so using address 192.168.7.179 
Thread Thread[vert.x-eventloop-thread-2,5,main] has been blocked for 2071 ms, time limit is 2000 
Thread Thread[vert.x-eventloop-thread-2,5,main] has been blocked for 3073 ms, time limit is 2000 
You're already on a Vert.x context, are you sure you want to create a new Vertx instance? 
Succeeded in deploying verticle 
On Sender site: We now have a clustered event bus: #<Vertx::EventBus:0x61deddf7>
The message has been sent: 13:20:13
The message has been sent: 13:20:15
The message has been sent: 13:20:17

sender.rb是:

require 'vertx/vertx'
require 'date'

options = {
}
Vertx::Vertx.clustered_vertx(options) { |res_err,res|
  if (res_err == nil)
    vertx = res
    event_bus = vertx.event_bus()
    puts "On Sender site: We now have a clustered event bus: #{event_bus}"
    vertx.set_periodic(2000) { |v|
      msg = "Message from Sender: ruby message NOW " + DateTime.now.strftime("%H:%M:%S")
      puts "The message has been sent: " + DateTime.now.strftime("%H:%M:%S")
      event_bus.publish("news.uk.sport", msg)
    }
  else
    puts "Failed: #{res_err}"
  end
}

和我的listener.rb输出:

simple_eventbus git:(master) ✗ vertx run listener.rb -cluster
Starting clustering... 
No cluster-host specified so using address 192.168.7.179 
Thread Thread[vert.x-eventloop-thread-2,5,main] has been blocked for 2169 ms, time limit is 2000 
Thread Thread[vert.x-eventloop-thread-2,5,main] has been blocked for 3172 ms, time limit is 2000 
You're already on a Vert.x context, are you sure you want to create a new Vertx instance? 
Succeeded in deploying verticle 
On listener side: We now have a clustered event bus: #<Vertx::EventBus:0x44af7bbf>
The handler registration has reached all nodes
I have received a message: Message from Sender: ruby message NOW 13:20:13
I have received a message: Message from Sender: ruby message NOW 13:20:15
I have received a message: Message from Sender: ruby message NOW 13:20:17

listener.rb代码:

require 'vertx/vertx'
options = {
}
Vertx::Vertx.clustered_vertx(options) { |res_err,res|
  if (res_err == nil)
    vertx = res
    event_bus = vertx.event_bus()
    puts "On listener side: We now have a clustered event bus: #{event_bus}"

    consumer = event_bus.consumer("news.uk.sport")
    consumer.handler() { |message|
        puts "I have received a message: #{message.body()}"
    }

    consumer.completion_handler() { |res_err,res|
        if (res_err == nil)
            puts "The handler registration has reached all nodes"
        else
            puts "Registration failed!"
        end
    }
  else
    puts "Failed: #{res_err}"
  end
}

在我的sender.rb中,分配的eventBus对象是:

#<Vertx::EventBus:0x61deddf7>

在我的listener.rb中它是不同的:

#<Vertx::EventBus:0x44af7bbf>

它只是对象实例引用吗? 不必是要共享的同一个对象实例吗?

另一个问题是它为什么告诉我onDeploy这个?

Thread Thread[vert.x-eventloop-thread-2,5,main] has been blocked for 3073 ms, time limit is 2000 
You're already on a Vert.x context, are you sure you want to create a new Vertx instance? 

我运行了一次代码:vertx run listener.rb -cluster

为什么它告诉我我已经在Vertx上下文?

1 个答案:

答案 0 :(得分:0)

问题是您的代码会创建一个独立的Vert.x实例。要创建聚簇Vert.x实例,请遵循以下示例:

require 'vertx/vertx'
options = {
}
Vertx::Vertx.clustered_vertx(options) { |res_err,res|
  if (res_err == nil)
    vertx = res
    eventBus = vertx.event_bus()
    puts "We now have a clustered event bus: #{eventBus}"
  else
    puts "Failed: #{res_err}"
  end
}

来自Vert.x Event Bus clustering文档部分。