2016-01-17 264 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