0

ZXing を使用して QR コードをデコードしています。開発では問題なく動作しますが、デプロイ後の本番環境では 5 分間ほどしか動作せず、サーバーを再起動した場合にのみ動作し、その後は動作しません。ログ、これが出てくるものです:

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 プロジェクトのメンバーの 1 人から github で回答が得られます。

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

まもなく、彼は私のコードから ZXING_PORT const をエクスポートするようにアドバイスをくれましたが、それは解決しませんでした。 ZXING_PORT

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

ポートまたはソケットを何らかの方法で「予約」して、プロセスがそれを取得できないようにするか、リクエストごとに本番環境でgemをリロードする方法を見つけるオプションを検討しています。

どのオプションを使用する必要がありますか? どちらがより適切で、よりもっともらしいですか?

4

1 に答える 1