- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试组合一个 Cro 服务,该服务具有 react/whenever 阻止“在后台”消费数据因此与许多使用 Cro 的 websocket 使用示例不同,这与可以通过浏览器访问的路由无关。
我的用例是使用通过 MQTT 主题收到的消息并对其进行一些处理。在开发的后期阶段,我可能会从这些数据中创建一个供应,但现在,当接收到数据时,它将存储在一个变量中,并根据某些条件,通过 http post 发送到另一个服务。
我的想法是包含一个 provider()
在 Cro::HTTP::Server
像这样设置:
use Cro::HTTP::Log::File;
use Cro::HTTP::Server;
use Routes;
use DataProvider; # Here
my Cro::Service $http = Cro::HTTP::Server.new(
http => <1.1>,
host => ...,
port => ...,
application => [routes(), provider()], # Made this into an array of subs?
after => [
Cro::HTTP::Log::File.new(logs => $*OUT, errors => $*ERR)
]
);
在 DataProvider.pm6 中:
use MQTT::Client;
sub provider() is export {
my $mqtt = MQTT::Client.new: server => 'localhost';
react {
whenever $mqtt.subscribe('some/mqtt/topic') {
say "+ topic: { .<topic> } => { .<message>.decode("utf8-c8") }";
}
}
}
这会引发一堆错误:
A react block:
in sub provider at DataProvider.pm6 (DataProvider) line 5
in block <unit> at service.p6 line 26
Died because of the exception:
Invocant of method 'write' must be an object instance of type
'IO::Socket::Async', not a type object of type 'IO::Socket::Async'. Did
you forget a '.new'?
in method subscribe at /home/cam/raku/share/perl6/site/sources/42C762836A951A1C11586214B78AD34262EC465F (MQTT::Client) line 133
in sub provider at DataProvider.pm6 (DataProvider) line 6
in block <unit> at service.p6 line 26
老实说,我完全猜想这就是我在 Cro 服务的后台订阅数据的方法,但我找不到任何关于什么可能被认为是推荐方法的信息。
service.pm6
中有我的 react/whenever block 。文件,但这似乎不正确。并且需要包裹在
start{}
中阻止,因为正如我刚刚了解到的那样,react 正在阻止:) 并且 cro 无法真正启动。
Routes.pm6
没有构造函数。
最佳答案
感谢所有提供信息的人,这是一次非常有值(value)的学习练习。
传递附加子例程的方法,沿着 router()
在 application
Cro::HTTP::Server.new
的参数给了更大的麻烦。 (不允许使用数组,并且破坏了路由)
相反,我将后台工作移到了它自己的一个类中,并给它一个 start
和 stop
方法更类似于 Cro::HTTP::Server
.
我的新方法:
服务.pm6
use Cro::HTTP::Log::File;
use Cro::HTTP::Server;
use Routes;
use KlineDataSubscriber; # Moved mqtt functionality here
use Database;
my $dsn = "host=localhost port=5432 dbname=act user=.. password=..";
my $dbh = Database.new :$dsn;
my $mqtt-host = 'localhost';
my $subscriber = KlineDataSubscriber.new :$mqtt-host;
$subscriber.start; # Inspired by $http.start below
my Cro::Service $http = Cro::HTTP::Server.new(
http => <1.1>,
host => ...,
port => ...,
application => routes($dbh), # Basically back the way it was originally
after => [
Cro::HTTP::Log::File.new(logs => $*OUT, errors => $*ERR)
]
);
$http.start;
say "Listening at...";
react {
whenever signal(SIGINT) {
say "Shutting down...";
$subscriber.stop;
$http.stop;
done;
}
}
在 KlineDataSubscriber.pm6
use MQTT::Client;
class KlineDataSubscriber {
has Str $.mqtt-host is required;
has MQTT::Client $.mqtt = Nil;
submethod TWEAK() {
$!mqtt = MQTT::Client.new: server => $!mqtt-host;
await $!mqtt.connect;
}
method start(Str $topic = 'act/feed/exchange/binance/kline-closed/+/json') {
start {
react {
whenever $!mqtt.subscribe($topic) {
say "+ topic: { .<topic> } => { .<message>.decode("utf8-c8") }";
}
}
}
}
method stop() {
# TODO Figure how to unsubscribe and cleanup nicely
}
}
这对我来说感觉更像“Cro 惯用语”,但我很乐意得到纠正。
/status
进行各种检查以确保一切健康
关于Raku Cro 服务订阅数据 "in the background"一般指导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66243271/
使用 cro stub http test test 创建 stub 服务后,我在 中定义了 TEST_PORT 环境变量.cro.yml : --- id: test cro: 1 name: "t
我已经从 CommaIDE(社区版本 2020.05)运行了一些 cro 微服务而没有出现故障,然后发现我也可以将它们作为 cro 服务本身进行晒太阳。然而,似乎没有任何明显的区别。配置屏幕是相同的,
下面的客户端程序从WebSocket服务器接收消息。 它不发送任何消息。 客户 use v6; use Cro::WebSocket::Client; constant WS-URL = 'ws://
我尝试使用 Cro 创建一个将在 rabbitMQ 中发布消息的 Rest API。我想将我的路线分成不同的模块,并用“包含”组合它们。但我也希望能够在每个模块中共享与 rabbitMQ 的相同连接。
假设我需要在提供一些结果之前检查一些 URI。我可以做这样的事情: sub type-routes { route { get -> Str $type where $type
我在 Windows 7 上运行 Rakudo Star 2019.03.1,Cro 由 zef 安装。关注Getting Started关于 Cro website 的部分,以下应该有效: The
使用“cro sub”创建了一个 websocket 服务器。 写了这个客户: use v6; use Cro::WebSocket::Client; constant WS-PORT = '2000
通过 Zef 安装了 Cro,但无法运行“cro stub”、“cro run”等。 (编辑:Fedora 28,来自 Fedora 的 rakudo) [zv@localhost ~]$ cro s
我正在尝试编写一个相对简单的用户定义函数来输出交叉表,但不太确定为什么它没有运行。 我的测试数据: fp_within = structure(list(weight_cat.w1 = structu
控制台在启动 cro ('cro run') 后显示此消息: ▶ Starting JoanPujol (JoanPujol) 🔌 **Endpoint HTTP will be at http:/
我正在尝试学习 Cro(和 Perl6 同时);) 我的学习应用程序基于 Cro 的文档。我添加了一些确实有效的身份验证,但用户 session 会立即被遗忘。 您可以在 https://gitlab
我想运行 perl6/raku Cro 应用程序作为前端网络服务器后面的服务。 刚跑cro run在段错误和重新启动后不会处理重新启动。 以前使用 perl5 我使用过 FastCGI - 但是 Cr
我正在尝试组合一个 Cro 服务,该服务具有 react/whenever 阻止“在后台”消费数据因此与许多使用 Cro 的 websocket 使用示例不同,这与可以通过浏览器访问的路由无关。 我的
cro run 当目录树中的任何内容发生更改时,停止服务器、重新编译、重新启动服务器。太好了。 但是,在开发客户端 UI 并使用 NPX/yarn/webpack 时,需要执行一个额外步骤来生成 ma
我正在考虑使用 perl6 和 Cro 来构建一个包含文本内容的网站。是否有关于将 Cro 与模板工具包(例如 TT2)和代码示例一起使用的最佳实践/指南供我利用? 最佳答案 你看过 Cro::Web
我正在使用带有天堂标签的数据框(导入数据集时变量已经有值标签)。我需要运行两个变量的许多交叉制表。我正在使用 expss 包中的 cro 函数,因为默认情况下显示值标签,并计算加权交叉表。 但是,我得
我正在寻找一个简单的解决方案来使用 Cro 的基本身份验证机制来保护我的路由。在我的示例中,我希望看到 401 Unauthorized如果您根本不提供任何凭据。如果您提供错误的凭据,我希望看到 40
我正在使用Cro HTTP Authentication/Authorization/Sessions HTTP 路由非常成功。 然后我添加了一条使用 Cro::HTTP::Router::WebSo
当使用带有 HTTP1.1 的 Cro 时,我可以通过主机方法 request.uri.host 访问请求的主机。在 Cro::Uri以及浏览器通过 request.header 发送的 Host 或
我要获取https://translate.google.cn的内容,但是,Cro::HTTP::Client和 HTTP::UserAgent只是卡住了,WWW获取内容,我不知道为什么。 如果我更改
我是一名优秀的程序员,十分优秀!