2016-01-17 194 views
4

我有一個使用AnyEvent :: MQTT訂閱消息隊列的perl腳本。保持perl腳本運行

當時我希望它做的就是當它收到消息時打印出來。我對perl完全陌生,所以我使用它隨附的演示代碼,其中包含一些將STDIN上的任何內容作爲消息發佈的功能 - 這很好,我可以看到所有收到的消息。

此代碼如下

#!/usr/bin/perl 
use strict; 
use warnings; 

use AnyEvent::MQTT; 
my $mqtt = AnyEvent::MQTT->new; 
my $cv = $mqtt->subscribe(topic => '/AlarmMode', 
          callback => sub { 
           my ($topic, $message) = @_; 
             print $topic, ' ', $message, "\n" 
            }); 

my $qos = $cv->recv; # subscribed, negotiated QoS == $qos 



    # publish line-by-line from file handle 
     $cv = $mqtt->publish(handle => \*STDIN, 
          topic => '/topic'); 

這個問題我有是,如果我的評論publish line-by-line from file handle後刪除一切,然後我的應用程序,只要它跑了退出。

我試過包括一個while循環,睡5秒但不起作用(應用程序看起來像掛了)。

我知道我需要做的事情告訴應用程序只是爲了生存和寒意,但我不知道該命令是什麼:-)

回答

6

如果你的東西,是不會阻止AE識別(例如sleep),則不會處理AE事件。

睡覺,同時允許AE事件進行處理,一個通常使用

my $done_cv = AE::cv; 
$done_cv->recv; 

使用$done_cv->send;到結束睡眠。例如,如果你想睡5秒,你會使用

my $sleep_cv = AE::cv; 
my $w = AE::timer(5, 0, $sleep_cv); # Short for AE::timer(5, 0, sub { $sleep_cv->send }); 
$sleep_cv->recv; 
+0

我最後一行是'my $ qos = $ cv-> recv; #訂閱,協商QoS == $ qos'。那會不會等待呢? –

+1

它確實在等待。它等待訂閱完成,因爲那是在那個cv上調用'send'的時候。但是你想繼續等待。 [在我的回答中更名爲避免混淆。] – ikegami