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

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

背景: 公司有套 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 任务? 试了下好像不行
共收到 6 条回复

我们项目把订阅消息这部分逻辑放到 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 回复

这样正确

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