我应该将 GCP Pub/Sub 监听器代码放在 Ruby on Rails 的什么位置?

Where should I put the GCP Pub/Sub listener code in Ruby on Rails?

提问人:aaronkelton 提问时间:5/1/2021 更新时间:5/1/2021 访问量:1030

问:

背景和设置

我有一个名为“test”的 Google Cloud Platform (GCP) Pub/Sub 主题,为此,我在 GCP Cloud 控制台中发布了一些消息。我正在使用 Ruby on Rails 应用程序来订阅此主题。在他们 OVERVIEW.md 文档的“接收消息”部分中,我将该代码片段(此处简洁地复制)放在初始值设定项文件中config/initializers/pubsub.rb

require "google/cloud/pubsub"
pubsub = Google::Cloud::PubSub.new
sub = pubsub.subscription "test"

subscriber = sub.listen threads: { callback: 16 } do |received_message|
  puts "Data: #{received_message.message.data}, published at #{received_message.message.published_at}"
  received_message.acknowledge!
end

subscriber.start
sleep

为了测试应用程序是否可以接收消息,我启动了 Rails 控制台并确认消息已经到达。尤里卡!

数据:我从 GCP 云控制台输入的测试消息,发布于 2021-04-30 16:36:42 -0400

问题

Rails 控制台无法接收任何输入。通过在初始值设定项中启动订阅侦听器,我有效地使 Rails 控制台无法运行。

如何在不破坏应用程序其余部分的情况下在应用程序中启动订阅侦听器(在这种情况下,Rails 的方式是什么)?

ruby-on-rails 启动 google-cloud-pubsub rails-console

评论

0赞 Dave Newton 5/1/2021
你在初始化器中调用“sleep”(永远休眠)吗?
0赞 aaronkelton 5/2/2021
它直接来自他们提供的文档,并带有注释“# Block,让处理线程在后台继续”。
2赞 Dave Newton 5/2/2021
“阻止”就是这个意思。阻止仅在您不执行任何其他操作时才有用 - 它可以防止进程终止。Rails 应用程序执行其他操作,例如处理 Web 请求。你把除了听众之外的所有东西都放进了睡眠状态。
0赞 aaronkelton 5/4/2021
多亏了@DaveNewton,删除了调用,我仍然能够使用 Rails 控制台,并且应用程序像以前一样工作。该应用程序仍然可以接收来自 GCP Pub/Sub 的消息,我可以像以前一样使用该应用程序。sleep
1赞 Dave Newton 5/4/2021
在他们的示例中,因此独立脚本不会在最后终止,即它使进程保持活动状态,因此子线程也不会终止。由于 Rails/console/etc. 已经没有退出,所以没有必要,但也......睡:)sleepsleep

答: 暂无答案