2016-11-09 4 views
1

루비에서 NATS를 배우고 있으며 표준 입력란에서 간단한 "cat"을 만들고 싶습니다. 내가 모든 라인을 얻었고 루프가 종료되지 않거나 아무것도 보내지지 않습니다.루비 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 

그리고 실행 : 그것은 정확하게 보낼 시도 할 것이다 각 라인을 보여주고, 프로그램이 종료하지만

NATS.stop이 활성화
# cat cat.rb | ./cat.rb myqueue 

, 아무것도, 큐에 최대 보여줍니다 :

# 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'을 활성화 한 상태에서 프로그램 끝에서'sleep 60'을 입력하면 어떻게됩니까? 그러면 메시지가 전달됩니까? – Casper

+0

실제로 모든 메시지의 처리를 보장하기 위해'stop'을 호출하기 전에'NATS.flush'를 호출해야한다고 생각합니다. – Casper

답변

0

귀하의 예를 들어 당신과 같이 일을하고 그것을 시도를 제공 할 수 있습니다 : 그것은 보류중인 모든 이벤트가 연결을 닫기 전에 처리됩니다 확인해야하기 때문에

따라서는, NATS.stop 전에 NATS.flush이 솔루션을 호출하는 것 모든 회선이 게시되고 이벤트 루프를 중지하기 전에 서버로 플러시됩니다.

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 , 고마워요. tinkering 약간, 루프 및 nats.flush/nats.close 조합을 인스턴스 변수 "nats"필요한 것 같습니다. 다른 조합을 이전 동작이 끝났습니다. – giff

0

라이브러리에 대한 코드를 보면 NATS.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