2016-11-09 67 views
1

我学习NATS在Ruby和希望创建从标准输入一个简单的“猫”。要么我得到所有的线路,并且循环不会退出,或者什么也不发送。红宝石NATS简单的发布

!/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发送不涉及多线程问题的消息是不是更容易?

+0

如果您在程序结束时启用了'NATS.stop',会发生什么情况?消息是否被传递呢? – Casper

+0

其实我认为你需要在调用'stop'之前调用'NATS.flush'来确保处理所有消息。 – Casper

回答

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 
+1

这完全为我工作,wallyqs ,谢谢你。对于一些修修补补,看来我在环和nats.flush/nats.close组合所需要的实例变量“NATS”。任何其它组合结束了与行为早。 – giff

0

纵观该库NATS.stop的代码似乎是非常积极的,因为它立即断开,没有检查是否有仍然留下了一些处理的事情。

因此似乎调用NATS.flushNATS.stop之前的解决方案,因为它应该确保所有未决事件关闭连接前处理:

NATS.start do 
    ...do your messaging... 

    NATS.flush # Ensure processing of pending messages  
    NATS.stop # Immidiate exit 
end 
+0

谢谢你,但行为完全没有改变。有了NATS.stop评论:我收到了消息(我正在用另一个窗口中的nats-sub监听);使用NATS.stop后,不会传递任何消息,尽管它声称它们将被发送。这与所推荐的NATS.flush完全相同。 – giff

+0

好的。真奇怪。不知道是怎么回事,然后:(那就需要在这种情况下,更彻底的调试。 – Casper

+0

也许提高和问题在GitHub上,看看你是否得到帮助那里,然后在这里发布的解决方案。 – Casper