Frage

ich ein Ruby-Skript schreibe als Postfix SMTP-Richtlinie Delegation verwendet werden. Das Skript muss eine Tokyo Tyrant Datenbank zuzugreifen. Ich verwende eventmachine Pflege von Netzwerkverbindungen zu nehmen. Eventmachine braucht eine eventmachine :: Connection-Klasse, die von der Verarbeitungsschleife eventmachine instanziiert wird, wenn eine neue Verbindung erstellt wird. so für jede Verbindung einer Klasse instanziiert und zerstört.

Ich bin eine Verbindung zu Tokyo Tyrant vom post_init der eventmachine :: Verbindung zu schaffen (dh direkt nach der Verbindung ist Setup) und reißen es nach unten, nachdem Verbindung beendet wird.

Meine Frage ist, ob dies der richtige Weg ist, um eine Verbindung zu db? dh Herstellung einer Verbindung jeder yime ich es brauche und reißen es nach unten, nachdem ich fertig bin? Wäre es nicht besser sein, wenn eine Verbindung zu DB (wenn das Programm gestartet wird) reißt es während des Programmherunterfahrens nach unten? Wenn dem so ist, wie soll ich das Code?

Mein Code ist:

require 'rubygems'
require 'eventmachine'
require 'rufus/tokyo/tyrant'

class LineCounter < EM::Connection
  ActionAllow = "action=dunno\n\n"

  def post_init
    puts "Received a new connection"
    @tokyo = Rufus::Tokyo::Tyrant.new('server', 1978)
    @data_received = ""
  end

  def receive_data data
    @data_received << data
    @data_received.lines do |line|
      key = line.split('=')[0]
      value = line.split('=')[1]
      @reverse_client_name = value.strip() if key == 'reverse_client_name'
      @client_address = value.strip() if key == 'client_address'
      @tokyo[@client_address] = @reverse_client_name
    end
    puts @client_address, @reverse_client_name
    send_data ActionAllow
  end

  def unbind
    @tokyo.close
  end
end

EventMachine::run {
  host,port = "127.0.0.1", 9997
  EventMachine::start_server host, port, LineCounter
  puts "Now accepting connections on address #{host}, port #{port}..."
  EventMachine::add_periodic_timer( 10 ) { $stderr.write "*" }
}

mit Grüßen,

raj

War es hilfreich?

Lösung

Überraschend gibt es keine Antworten auf diese Frage.

Was Sie wahrscheinlich brauchen, ist eine Verbindung Pool, wo Sie holen können, verwenden und -rücklauf wie sie benötigt werden.

class ConnectionPool
  def initialize(&block)
    @pool = [ ]
    @generator = block
  end

  def fetch
    @pool.shift or @generator and @generator.call
  end

  def release(handle)
    @pool.push(handle)
  end

  def use
    if (block_given?)
      handle = fetch

      yield(handle) 

      release(handle)
    end
  end
end

# Declare a pool with an appropriate connection generator
tokyo_pool = ConnectionPool.new do
  Rufus::Tokyo::Tyrant.new('server', 1978)
end

# Fetch/Release cycle
tokyo = tokyo_pool.fetch
tokyo[@client_address] = @reverse_client_name
tokyo_pool.release(tokyo)

# Simple block-method for use
tokyo_pool.use do |tokyo|
  tokyo[@client_address] = @reverse_client_name
end
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top