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

Can't use Vertx EventBus from official code example on Vertx.io

我有 2 个非常简单的 Vertx verticles 写在 Ruby:

### 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

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

$ vertx run listener.rb

发件人发送并打印消息,但收听者没有收到任何东西(listener.rb 没有打印输出)

我已经尝试 运行 带标志的顶点

-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 运行 listener.rb -cluster

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

问题是您的代码创建了一个独立的 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 文档部分。