Class: M2R::Connection

Inherits:
Object
  • Object
show all
Defined in:
lib/m2r/connection.rb

Overview

Connection for exchanging data with mongrel2

Defined Under Namespace

Classes: Error

Instance Method Summary collapse

Constructor Details

#initialize(request_socket, response_socket) ⇒ Connection

Returns a new instance of Connection.

Parameters:

  • request_socket (ZMQ::Socket)

    socket for receiving requests from Mongrel2

  • response_socket (ZMQ::Socket)

    socket for sending responses to Mongrel2



16
17
18
19
# File 'lib/m2r/connection.rb', line 16

def initialize(request_socket, response_socket)
  @request_socket  = request_socket
  @response_socket = response_socket
end

Instance Method Details

#closeObject

Closes ZMQ sockets



82
83
84
85
# File 'lib/m2r/connection.rb', line 82

def close
  @request_socket.close
  @response_socket.close
end

#connectionConnection

For compatibility with M2R::ConnectionFactory

Returns:



25
26
27
# File 'lib/m2r/connection.rb', line 25

def connection
  self
end

#deliver(uuid, connection_ids, data, trial = 1) ⇒ String

Delivers data to multiple mongrel2 connections. Useful for streaming.

Parameters:

  • uuid (String)

    Mongrel2 instance uuid

  • connection_ids (Array<String>, String)

    Mongrel2 connections ids

  • data (String)

    Data that should be delivered to the connections

Returns:

  • (String)

    M2 response message



64
65
66
67
68
69
70
71
72
73
74
75
76
77
# File 'lib/m2r/connection.rb', line 64

def deliver(uuid, connection_ids, data, trial = 1)
  msg = "#{uuid} #{TNetstring.dump([*connection_ids].join(' '))} #{data}"
  ret = @response_socket.send_string(msg, ZMQ::NonBlocking)
  if ret < 0
    e = Error.new "Unable to deliver message: #{ZMQ::Util.error_string}"
    e.errno = ZMQ::Util.errno
    raise e
  end
  return msg
rescue Connection::Error => er
  raise if trial >= 3
  raise unless er.signal?
  deliver(uuid, connection_ids, data, trial + 1)
end

#receiveString

Note:

This is blocking call

Returns Mongrel2 request

Returns:

  • (String)

    M2 request message



34
35
36
37
38
39
40
41
42
# File 'lib/m2r/connection.rb', line 34

def receive
  ret = @request_socket.recv_string(msg = "")
  if ret < 0
    e = Error.new "Unable to receive message: #{ZMQ::Util.error_string}"
    e.errno = ZMQ::Util.errno
    raise e
  end
  return msg
end

#reply(request, response_or_string) ⇒ String

Sends response to Mongrel2 for given request

Parameters:

  • response_or_string (Response, #to_s)

    Response for the request. Anything convertable to [String]

Returns:

  • (String)

    M2 response message



50
51
52
53
# File 'lib/m2r/connection.rb', line 50

def reply(request, response_or_string)
  deliver(request.sender, request.conn_id, response_or_string.to_s)
  deliver(request.sender, request.conn_id, "") if close?(request, response_or_string)
end