正常关闭amqp(和/或)http守护程序(以及有关全局变量)

时间:2018-08-02 06:23:30

标签: ruby rake catch-block bunny

我写了一个API守护程序。它几乎不处理循环中的请求(在处理过程中,它可以通过http和amqp调用其他服务,重载sql数据库等)。我想找到一种使它正常关机的最佳方法。因此,当它收到sigterm或中断时,它必须仅在完成当前请求处理后退出。我不使用线程,但是我很困惑,有些库可以。像兔子一样。

所以这没关系:

begin
 processing @request
rescue Interrupt => _
 db.close
end

我这样想:

$gameover = false
trap('INT'){ $gameover = true }
trap('TERM'){ $gameover = true }

class HardApi < Sinatra::Base
  before{ lots of code }
  after do
    if $gameover
      db.close
      mq.disconnect
      log.info{"The end."}
      exit 0 
    end
  end

  post('/chat/:id') do |chat_id|
    BabblerCtrl.new(@request).upload_file(chat_id)
    MQService.publish_to_user(@client_id, chat_id, type: :service, :i_file_uploaded)
  end
  # etc
end

Ruby解释器还说它不能从陷阱内部使用Mutex。

所以我的问题是全局变量是此类标志的最佳解决方案,还是可以从陷阱设置的信号灯之类的东西?

我写给测试的简单脚本可以正常工作,但是我的真实程序有很多调试功能,但我仍然不确定该程序是否可以在产品中运行。

2 个答案:

答案 0 :(得分:1)

全局变量是执行此操作的一种好方法,但是您可以使事情更有条理:

class HardApi < Sinatra::Base
  @@should_exit = false
  def self.soft_exit
    @@should_exit = true
  end

  before{ lots of code }
  after do
    if @@should_exit
      # ...
    end
  end
end

trap('INT'){ HardApi.soft_exit }
trap('TERM'){ HardApi.soft_exit }

答案 1 :(得分:0)

因此,当我同时拥有单处理HTTP服务器和一个amqp响应器(或两个)时,似乎全局变量 Mutex都可以正常工作。

这是取消兔子工人的一个例子。

https://gist.github.com/deemytch/6d3f8fd35a796f6b1cdc1e10a4911cc8