Class: MessagePack::RPC::TCPClientTransport

Inherits:
Object
  • Object
show all
Defined in:
lib/msgpack/rpc/transport/tcp.rb

Defined Under Namespace

Classes: ClientSocket

Instance Method Summary collapse

Constructor Details

#initialize(session, address, reconnect_limit) ⇒ TCPClientTransport

Returns a new instance of TCPClientTransport.



62
63
64
65
66
67
68
69
70
# File 'lib/msgpack/rpc/transport/tcp.rb', line 62

def initialize(session, address, reconnect_limit)
	@session = session
	@address = address

	@pending = ""
	@sockpool = []
	@connecting = 0
	@reconnect_limit = reconnect_limit
end

Instance Method Details

#closeObject

ClientTransport interface



89
90
91
92
93
94
95
96
97
98
99
# File 'lib/msgpack/rpc/transport/tcp.rb', line 89

def close
	@sockpool.reject! {|sock|
		sock.detach if sock.attached?
		sock.close
		true
	}
	@sockpool = []
	@connecting = 0
	@pending = ""
	self
end

#on_close(sock) ⇒ Object

from TCPClientTransport::ClientSocket::on_close



122
123
124
# File 'lib/msgpack/rpc/transport/tcp.rb', line 122

def on_close(sock)
	@sockpool.delete(sock)
end

#on_connect(sock) ⇒ Object

from TCPClientTransport::ClientSocket::on_connect



102
103
104
105
106
107
# File 'lib/msgpack/rpc/transport/tcp.rb', line 102

def on_connect(sock)
	@sockpool.push(sock)
	sock.send_pending(@pending)
	@pending = ""
	@connecting = 0
end

#on_connect_failed(sock) ⇒ Object

from TCPClientTransport::ClientSocket::on_connect_failed



110
111
112
113
114
115
116
117
118
119
# File 'lib/msgpack/rpc/transport/tcp.rb', line 110

def on_connect_failed(sock)
	if @connecting < @reconnect_limit
		try_connect
		@connecting += 1
	else
		@connecting = 0
		@pending = ""
		@session.on_connect_failed
	end
end

#send_data(data) ⇒ Object

ClientTransport interface



73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/msgpack/rpc/transport/tcp.rb', line 73

def send_data(data)
	if @sockpool.empty?
		if @connecting == 0
			try_connect
			@connecting = 1
		end
		@pending << data
	else
		# FIXME pesudo connection load balance
		# sock = @sockpool.choice
		sock = @sockpool.first
		sock.send_data(data)
	end
end