我正在使用 ZXing 来解码我的二维码,它在开发中运行良好,但在部署后的生产中它只能运行五分钟左右,并且只有当我重新启动服务器时,它才无法运行,通过日志,结果如下:
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
客户端.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
我在 github 上得到了 zxing 项目中的一个人的回答:
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。
我应该采取哪个选项?哪一个更合适或更合理?