Rails Rails 如何利用 Stomp 订阅 Apache ActiveMQ 的 Message

308820773 · 2019年03月21日 · 最后由 308820773 回复于 2019年03月23日 · 1391 次阅读

背景:公司有套 java 系统,里面用的是 ActiveMQ 来做消息通知。现用 rails 开发了另外一 web 服务。然后 rails 里有个小功能是现在的 java 系统要使用的,就想着用 ActiveMQ 来进行信息的交互。

实现方式:首先 java 系统给 ActiveMQ 的 '/queus/java-rails' 发送一条消息,rails 利用 stomp 来 subscribe '/queus/java-rails' 的消息,执行相关代码之后,把结果发送给 ActiveMQ '/queus/rails-java'.

目前代码

class MyStomp
  def initialize
    @username = 'admin'
    @password = 'admin'
    @hostname  = 'localhost'
    @port = '61613'
  end

  def run
    @client = Stomp::Client.new(@username, @password, @hostname, @port, true)

    @client.subscribe("'/queus/java-rails", id: @client.uuid, 'ack' => 'auto') do |msg|
      @client.publish("/queue/rails-java", "任务执行完了") 
    end

    puts "Connected"
  end

  def shutdown
    @client.close if @client
    puts 'DisConnected'
  end
end

# 启动订阅
client = MyStomp.new

begin
  client.run
rescue SystemExit, Interrupt
  client.shutdown
rescue Exception => e
  client.shutdown
  raise e
end

问题:该怎么在 rails 内组织代码呢,以及该如何启动该订阅?

  • 封装 为一个 bin 命令,rails 启动后,再执行该命令
  • 执行一个 rake 任务?试了下好像不行

我们项目把订阅消息这部分逻辑放到 bin 目录下,部署时运行这个文件,启动进程。

用 Daemons 这个 Gem 将脚本包装成守护进程。

hjiangwen 回复

好的,我去看下,谢谢。

Daemons.run_proc('tmp/pids/rails-stomp') do 
   # your code
end

启动的时候,bin/rails runner bin/rails-stomp start, 是这样么。

只是一个小功能的话先用 http 感觉更好

lithium4010 回复

开始也考虑用 HTTP 呢,考虑到双方身份的认证 (两方都要提供接口), 加上 ActiveMQ 也是现成的,所以才考虑用这种方式。

@ 文件 bin/stomp.rb 如下:

#!/usr/bin/env ruby

# 加载 Rails 环境
require_relative '../config/environment'
Daemons.run()
# 增加执行权限
$ chmod u+x bin/stomp.rb
# 后台运行
$ bin/stomp start
hjiangwen 回复

这样正确

需要 登录 后方可回复, 如果你还没有账号请 注册新账号