ruby 使用STOMP发布/订阅Rails

csbfibhn  于 12个月前  发布在  Ruby
关注(0)|答案(2)|浏览(94)

我希望我的Rails应用程序能够监听和发布STOMP消息。
This article给出了如何使用ruby STOMP客户端的示例,以及将该客户端集成到Rails应用程序中的gem activemessaging。那里的功能似乎很理想,但是activemessaging gem似乎不再被维护。
有没有人知道一个gem可以实现与activemessaging gem类似的功能?我找不到,如果找不到的话:
我如何在Rails应用的上下文中初始化Stomp客户端,使其具有持久连接,以便1)客户端的生命周期与运行我的应用的ruby进程相关联,而不是请求-响应过程,2)我可以使用代码(如Active Record模型或应用中定义的服务对象)来消费消息?

flvtvl50

flvtvl501#

根据ActiveMessaging project website
ActiveMessaging是一个通用的框架,可以轻松使用消息传递,但不依赖于任何特定的消息传递系统-事实上,它现在支持Stomp,AMQP,beanstalk,Amazon Simple Queue Service(SQS),JMS(使用StompConnect或直接在JRuby上),WebSphere MQ......
因此,它是一个简化各种消息传递协议和/或提供者之间集成的接口。但是,由于您使用的是标准化的消息传递协议(即你真的不需要它。
我建议您简单地使用this STOMP gem,这在原始文章中引用。
STOMP,顾名思义,是一个非常简单的协议。您应该能够在应用程序中使用它。

xriantvc

xriantvc2#

由于关于这个主题的报道太少了,我想我应该分享一下我提出的解决方案。在确定了直接使用STOMP gem是前进的方向之后,让我重新审视一下主要挑战:
如何在Rails应用程序的上下文中初始化一个带有持久连接的Stomp客户端,
1.客户端的生命周期与运行我的应用程序的ruby进程相关联,而不是请求-响应过程,
1.我可以使用Active Record模型或应用中定义的服务对象等代码来消费消息?
第1部分)原来是一个坏主意。我设法使用Rails初始化器实现了这一点,它在我的本地环境中工作得很好。然而,当我在一个临时环境中运行它时,我发现我的消息侦听器神秘地死了。实际上,生产Web服务器产生应用程序(运行初始化器),分叉进程(不运行它们)并随机杀死进程,最终杀死侦听器而无需替换它们。
相反,我使用daemons gem创建了一个易于启动和停止的后台进程。我在lib/daemons/message_listener.rb中的代码看起来像这样:

require 'daemons'
# Usage (from daemons dir):
# ruby message_listener start
# ruby message_listener status
# ruby message_listener stop
# See https://github.com/thuehlinger/daemons for full docs.

# Require this to get your app code
require_relative '../../config/environment'

Daemons.run_proc('listener.rb') do

  client = nil

  at_exit do
    begin
      client.close
    rescue # probably means there's no connection to close, do nothing to handle it.
    end
  end

  client = Stomp::Client.new(your_config_options)

  # Your message handling code using your rails app goes here 

  loop do
    # I'd expected that subscribing to a stomp queue would be blocking,
    # but it doesn't seem to be.
    sleep(0.001)
  end

end

相关问题