我有一个使用AnyEvent :: MQTT订阅消息队列的perl脚本。
我想要它做的一切都是在收到消息时打印出来的。我是perl的新手,所以我使用它附带的演示代码,其中包含一些在STDIN上发布任何内容的消息 - 这很好用,我可以看到收到的所有消息。 / p>
此代码如下所示
#!/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
之后删除了所有内容,那么我的应用就会在它运行后立即退出。
我尝试过包含一个睡眠时间为5秒的while循环,但这确实无法正常工作(该应用看起来好像已经挂了)。
我知道我需要做某事来告诉应用程序只是为了保持活力和冷静,但我不知道该命令是什么: - )
答案 0 :(得分: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;