Ruby NATS简单发布

时间:2016-11-09 14:39:25

标签: ruby message-queue

我正在学习Ruby中的NATS,并希望从stdin创建一个简单的“猫”。要么我得到所有的行,并且循环没有退出,或者没有任何东西被发送。

!/usr/bin/env ruby

require "nats/client"

queue = ARGV.shift

NATS.start do
  STDIN.each_line do |line|
    puts "will send: #{line}"
    NATS.publish(queue, line)
  end

  NATS.stop
end

puts "... #{__LINE__}"
exit 0

我跑步:

# cat cat.rb | ./cat.rb myqueue

启用NATS.stop后,队列中不显示任何内容,但它会正确显示它将尝试发送的每一行,并且程序退出:

# cat cat.rb | ./cat.rb myqueue
will send: #!/usr/bin/env ruby
will send: 
will send: require "nats/client"
will send: 
will send: queue = ARGV.shift
will send: 
will send: NATS.start do
will send:   STDIN.each_line do |line|
will send:     puts "will send: #{line}"
will send:     NATS.publish(queue, line)
will send:   end
will send: 
will send:   NATS.stop
will send: end
will send: 
will send: puts "... #{__LINE__}"
will send: exit 0
will send: 
... 16
#

在NATS.stop注释掉的情况下,所有行都被发送到队列,但程序没有退出:

# cat cat.rb | ./cat.rb myqueue
will send: #!/usr/bin/env ruby
will send: 
will send: require "nats/client"
will send: 
will send: queue = ARGV.shift
will send: 
will send: NATS.start do
will send:   STDIN.each_line do |line|
will send:     puts "will send: #{line}"
will send:     NATS.publish(queue, line)
will send:   end
will send: 
will send:   # NATS.stop
will send: end
will send: 
will send: puts "... #{__LINE__}"
will send: exit 0
will send: 
<and program sits here>

我错过了什么?从Ruby发送不涉及多线程问题的消息是不是更容易?

2 个答案:

答案 0 :(得分:0)

查看库$(document).ready(function(){ $("#post-60 p strong").click(function(){ $("p:not(:has(strong))").toggle(500); }); }); 的代码似乎非常激进,因为它会立即断开连接,而不会检查是否还有一些处理要做。

因此,似乎在$(document).ready(function(){ $("#post-60 p strong").click(function(){ $("p:not(:has(strong))").next().toggle(500); }); }); 之前调用NATS.stop是解决方案,因为它应确保在关闭连接之前处理所有待处理事件:

NATS.flush

答案 1 :(得分:0)

对于您的示例,您可以尝试执行类似操作,以便在停止事件循环之前将所有行发布并刷新到服务器。

require 'nats/client'

$stdout.sync = true

NATS.start(servers: ["nats://127.0.0.1:4222"]) do |nats|
  STDIN.read.each_line do |line|
    nats.publish("hello", line)
  end
  nats.flush do
    nats.close
  end
end