【问题标题】:Rails pub/sub with ActiveMQRails 发布/订阅与 ActiveMQ
【发布时间】:2023-08-13 22:21:01
【问题描述】:

我希望我的 Rails 应用能够监听并发布到 ActiveMQ 队列。

This article 给出了如何使用 ruby​​ STOMP 客户端的示例,以及将客户端集成到 Rails 应用程序的 gem activemessaging。那里的功能似乎很理想,但activemessaging gem 似乎不再被维护。

有很多关于使用 rabbitMQ 而不是 ActiveMQ 的资源,但我正在尝试改进我的 Rails 应用程序与已经使用 ActiveMQ 的现有 Java 堆栈的集成。

那么有谁知道我可以使用一个 gem 来实现与 activemessaging gem 类似的功能?我找不到一个,所以失败了:

如何在我的 Rails 应用程序的上下文中初始化一个与我的 activeMQ 实例的持久连接的 Stomp 客户端,这样 1) 客户端的生命周期与运行我的应用程序的 ruby​​ 进程的生命周期相关联,而不是请求- 响应过程,以及 2) 我可以使用我的应用程序中定义的 Active Record 模型或服务对象等代码来消费消息?

提前致谢。

【问题讨论】:

    标签: ruby-on-rails ruby activemq stomp


    【解决方案1】:

    由于关于这个主题的内容很少,我想我会分享我想出的解决方案。确定直接使用 STOMP gem 是前进的方向,让我重申一下主要挑战:

    如何使用持久连接初始化 Stomp 客户端 我的 Rails 应用程序上下文中的 activeMQ 实例,这样

    1) 客户端的生命周期与 ruby​​ 进程的生命周期相关联 运行我的应用程序,而不是请求-响应过程,并且

    2) 我可以使用诸如 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
    

    【讨论】:

      【解决方案2】:

      根据ActiveMessaging project website

      ActiveMessaging 是一个通用框架,用于简化消息传递的使用,但不依赖于任何特定的消息传递系统 - 事实上,它现在支持 Stomp、AMQP、beantalk、Amazon Simple Queue Service (SQS)、JMS(使用 StompConnect 或直接在 JRuby 上)、WebSphere MQ...

      因此,它是一个简化各种消息传递协议和/或提供程序之间集成的接口。但是,由于您使用的是标准化的消息传递协议(即 STOMP)您实际上并不需要它

      我建议您只需使用原始文章中引用的this STOMP gem

      STOMP,顾名思义,是一个非常简单的协议。您应该可以在应用程序中根据需要使用它。

      【讨论】:

      • 谢谢,但我不清楚-如果不清楚-也许我应该编辑问题-在 Rails 应用程序中的下落,您是否会初始化 stomp 客户端的实例以维护其生命周期的持久连接是否独立于 Rails 应用程序的 http 请求?