问题描述
因此,我正在构建一个使用Ruby on Rails前端和Java后端的Web应用程序。 因此,基本上,当用户登录网站时,我希望在屏幕上显示该用户的所有交易数据历史记录的列表。
我需要执行此操作的方法(出于各种原因,我将不愿提及)是让Ruby层上的代码向队列发送一条消息(使用RabbitMQ,打包为JSON对象),并且该消息将从在Java层中按代码排队。
然后,Java层需要将其响应(事务数据历史记录,打包为JSON对象)发送到另一个队列,我的Ruby层中的代码将使用该队列,然后将其显示在浏览器上。
因此,这个请求/响应周期必须是异步的,我在Ruby层上的使用者代码还需要根据显示的消息知道向哪个客户端显示详细信息。
可以在轨道上完成吗? 谢谢。
1楼
您可以使用兔子宝石: :
这是一个小例子:
#!/usr/bin/env ruby
# encoding: utf-8
require "bunny"
def get_timestamp
"#{Time.now.strftime('%H:%M:%S')}"
end
conn = Bunny.new
conn.start
queue_name = ENV['RABBITMQ_QUEUE'] || 'default_queue'
args = {}
args['x-message-ttl'] = 5000
ch = conn.create_channel
q = ch.queue(
queue_name,
:arguments => args,
:auto_delete => false,
:exclusive => false,
:durable => true
)
puts " [*] Waiting for messages in #{q.name}. To exit press CTRL+C"
begin
q.subscribe(:block => true, :manual_ack => true) do |delivery_info, properties, body|
puts "[#{get_timestamp}] [ruby client] Received #{body}"
# Acknowledge that the message has been
# processed. This prevents:
# - flooding the client with messages
# - losing messages if the client dies
ch.ack(delivery_info.delivery_tag)
end
rescue
ensure
conn.close
end