Zxing连接拒绝生产

时间:2013-06-17 21:20:20

标签: ruby-on-rails-3 zxing production-environment

我正在使用ZXing来解码我的qr代码,它在开发时工作正常,但是在部署后的生产中它只工作了五分钟左右,只有当我重新启动服务器时,它才会起作用,通过日志,这是出来的:

ActionView::Template::Error (druby://127.0.0.1:51876 - #<Errno::ECONNREFUSED: Connection refused - connect(2)>):
1: <% provide(:title, "Updating...") %>
2: <input />
3: <% if (ZXing.decode "public/assets/#{current_user.user_name.downcase}_bdd.jpg").nil? %>
4:  <% flash.now[:notice] = "BDD invalid, change it!" %>
5:  <div class="actions_cambiar_bdd">
app/views/users/change_folios.html.erb:3:in 
`_app_views_users_change_folios_html_erb___206747123981808960_69821004639000'

我不知道发生了什么,看着它,我认为它不能用于我的服务器,这就是为什么连接被拒绝,但奇怪的是它在几分钟后工作正常服务器重新启动,之后,没什么,我希望任何人都可以帮助我。谢谢你的时间。

修改 显然在一段时间后端口被阻塞或忙碌,我想这与zxing如何管理端口分配有关,这里有一些文件:

编辑2

client.rb

require 'socket'
require 'drb'

module ZXing
  BIN = File.expand_path('../../../bin/zxing', __FILE__)

  class Client
    def self.new
      port = ENV['ZXING_PORT'] || find_available_port
      setup_drb_server(port) unless ENV['ZXING_PORT'] && responsive?(port)
      DRbObject.new_with_uri("druby://127.0.0.1:#{port}")
    end

    private

    def self.setup_drb_server(port)
      remote_client = IO.popen("#{ZXing::BIN} #{port}")
      sleep 0.5 until responsive?(port)
      at_exit { Process.kill(:INT, remote_client.pid) }
    end

    def self.responsive?(port)
      socket = TCPSocket.open('127.0.0.1', port)
      true
    rescue Errno::ECONNREFUSED
      false
    ensure
      socket.close if socket
    end

    def self.find_available_port
      server = TCPServer.new('127.0.0.1', 0)
      server.addr[1]
    ensure
      server.close if server
    end
  end
end

我在zxing项目中的一个人的github上得到了回答:

https://github.com/ecin/zxing.rb/issues/6

他很快给了我从我的代码中导出ZXING_PORT const的建议,但它没有解决它,ZXING_PORT上的数字得到了相同的处理,它工作了几分钟,然后同样的错误,只有这次使用ZXING_PORT

ActionView::Template::Error (druby://127.0.0.1:ZXING_PORT - #<Errno::ECONNREFUSED: Connection refused - connect(2)>):

我正在考虑以某种方式“保留”端口或套接字的选项,以便没有进程可以接受它或者找到在每个请求上重新加载生产环境中的gem的方法。

我应该选择哪个选项?哪一个更适合或更合理?

1 个答案:

答案 0 :(得分:0)

好的,所以我终于让它工作了,我把代码放在boot.rb上,就在加载宝石之前

require 'rubygems'

# Set up gems listed in the Gemfile.
ENV['PORT_NUMBER'] = "4333"
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)


require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])