Class: ASIR::Transport::ConnectionOriented
- Inherits:
-
Stream
- Object
- ASIR::Transport
- Stream
- ASIR::Transport::ConnectionOriented
- Defined in:
- lib/asir/transport/connection_oriented.rb
Overview
!SLIDE Connection-Oriented Transport
Direct Known Subclasses
Constant Summary
Constants included from PayloadIO
PayloadIO::FOOTER, PayloadIO::HEADER
Constants included from UriConfig
UriConfig::S_LOCALHOST, UriConfig::S_TCP
Constants included from ASIR::ThreadVariable
ASIR::ThreadVariable::DEBUG, ASIR::ThreadVariable::EMPTY_HASH, ASIR::ThreadVariable::SETTER
Instance Attribute Summary
Attributes included from UriConfig
#host, #host_default, #path, #path_default, #port, #port_default, #scheme, #scheme_default, #uri
Attributes inherited from ASIR::Transport
#after_invoke_message, #after_receive_message, #before_send_message, #coder_needs_result_message, #decoder, #encoder, #invoker, #message_count, #needs_message_identifier, #needs_message_timestamp, #on_exception, #on_result_exception, #one_way, #running, #verbose
Attributes included from Log
Instance Method Summary collapse
-
#_after_connect!(stream) ⇒ Object
Subclasses can override.
-
#_before_close!(stream) ⇒ Object
Subclasses can override.
-
#_connect! ⇒ Object
Returns raw client stream.
-
#_receive_message(stream, additional_data) ⇒ Object
!SLIDE Receives the encoded Message payload String.
-
#_receive_result(message, opaque_result) ⇒ Object
!SLIDE Receives the encoded Result payload String.
-
#_send_message(message, message_payload) ⇒ Object
!SLIDE Sends the encoded Message payload String.
-
#_send_result(message, result, result_payload, stream, message_state) ⇒ Object
!SLIDE Sends the encoded Result payload String.
- #_server! ⇒ Object
-
#_server_accept_connection!(server) ⇒ Object
Accept a client connection.
- #_server_close! ⇒ Object
-
#_server_close_connection!(in_stream, out_stream) ⇒ Object
Close a client connection.
-
#connect!(opts = nil, &blk) ⇒ Object
Yields Channel after _connect!.
-
#prepare_server! ⇒ Object
!SLIDE Server.
- #run_server! ⇒ Object
- #serve_connection! ⇒ Object
- #server_on_start! ⇒ Object
- #server_on_stop! ⇒ Object
-
#stream ⇒ Object
!SLIDE Returns a connected Channel.
Methods included from PayloadIO
#_read, #_read_line_and_expect!, #_write, #close
Methods included from UriConfig
Methods inherited from Stream
#_serve_stream!, #serve_stream!, #serve_stream_message!, #stream_eof?
Methods inherited from ASIR::Transport
#_subclass_responsibility, #initialize, #invoke_message!, #needs_message_identifier?, #needs_message_timestamp?, #receive_message, #receive_result, #send_message, #send_result, #serve_message!, #stop!, #with_server_signals!
Methods included from Log
#_log, #_log_enabled=, #_log_enabled?, #_log_format, #_log_result, enabled, enabled=, included
Methods included from Initialization
Methods included from AdditionalData
#[], #[]=, #_additional_data, #additional_data, #additional_data!, #additional_data=, included
Methods included from Message::Delay
#relative_message_delay!, #wait_for_delay!
Methods included from ASIR::ThreadVariable
Constructor Details
This class inherits a constructor from ASIR::Transport
Instance Method Details
#_after_connect!(stream) ⇒ Object
Subclasses can override.
44 45 46 |
# File 'lib/asir/transport/connection_oriented.rb', line 44 def _after_connect! stream self end |
#_before_close!(stream) ⇒ Object
Subclasses can override.
49 50 51 |
# File 'lib/asir/transport/connection_oriented.rb', line 49 def _before_close! stream self end |
#_connect! ⇒ Object
Returns raw client stream.
33 34 35 36 37 38 39 40 41 |
# File 'lib/asir/transport/connection_oriented.rb', line 33 def _connect! _log { "_connect! #{uri}" } if @verbose >= 1 stream = _client_connect! _log { "_connect! stream=#{stream}" } if @verbose >= 1 _after_connect! stream stream rescue ::Exception => err raise err.class, "Cannot connect to #{self.class} #{uri}: #{err.inspect}", err.backtrace end |
#_receive_message(stream, additional_data) ⇒ Object
!SLIDE Receives the encoded Message payload String.
63 64 65 |
# File 'lib/asir/transport/connection_oriented.rb', line 63 def stream, additional_data [ _read(stream, nil), nil ] end |
#_receive_result(message, opaque_result) ⇒ Object
!SLIDE Receives the encoded Result payload String.
77 78 79 80 81 82 83 |
# File 'lib/asir/transport/connection_oriented.rb', line 77 def _receive_result , opaque_result unless @one_way || .one_way stream.with_stream! do | io | _read io, end end end |
#_send_message(message, message_payload) ⇒ Object
!SLIDE Sends the encoded Message payload String.
55 56 57 58 59 |
# File 'lib/asir/transport/connection_oriented.rb', line 55 def , stream.with_stream! do | io | _write , io, end end |
#_send_result(message, result, result_payload, stream, message_state) ⇒ Object
!SLIDE Sends the encoded Result payload String.
69 70 71 72 73 |
# File 'lib/asir/transport/connection_oriented.rb', line 69 def _send_result , result, result_payload, stream, unless @one_way || .one_way _write result_payload, stream, end end |
#_server! ⇒ Object
130 131 132 |
# File 'lib/asir/transport/connection_oriented.rb', line 130 def _server! raise Error::SubclassResponsibility, "_server!" end |
#_server_accept_connection!(server) ⇒ Object
Accept a client connection. Returns [ in_stream, out_stream ].
144 145 146 |
# File 'lib/asir/transport/connection_oriented.rb', line 144 def _server_accept_connection! server raise Error::SubclassResponsibility, "_server_accept_connection!" end |
#_server_close! ⇒ Object
134 135 136 137 138 139 140 |
# File 'lib/asir/transport/connection_oriented.rb', line 134 def _server_close! if @server @server.close rescue nil end @server = nil self end |
#_server_close_connection!(in_stream, out_stream) ⇒ Object
Close a client connection.
149 150 151 |
# File 'lib/asir/transport/connection_oriented.rb', line 149 def _server_close_connection! in_stream, out_stream raise Error::SubclassResponsibility, "_server_close_connection!" end |
#connect!(opts = nil, &blk) ⇒ Object
Yields Channel after _connect!.
20 21 22 23 24 25 26 27 28 29 30 |
# File 'lib/asir/transport/connection_oriented.rb', line 20 def connect!(opts = nil, &blk) base_opts = { :on_connect => lambda { | channel | connection = _connect! blk.call(connection) if blk connection } } base_opts.update(opts) if opts Channel.new(base_opts) end |
#prepare_server! ⇒ Object
!SLIDE Server
88 89 90 91 92 93 94 |
# File 'lib/asir/transport/connection_oriented.rb', line 88 def prepare_server! _log { "prepare_server! #{uri}" } if @verbose >= 1 _server! rescue ::Exception => err _log [ "prepare_server! #{uri}", :exception, err ] raise err.class, "Cannot prepare server on #{self.class} #{uri}: #{err.inspect}", err.backtrace end |
#run_server! ⇒ Object
96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# File 'lib/asir/transport/connection_oriented.rb', line 96 def run_server! _log { "run_server! #{uri}" } if @verbose >= 1 with_server_signals! do @running = true server_on_start! while @running serve_connection! end end self ensure server_on_stop! _server_close! end |
#serve_connection! ⇒ Object
117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/asir/transport/connection_oriented.rb', line 117 def serve_connection! in_stream, out_stream = _server_accept_connection! @server _log { "serve_connection!: connected #{in_stream} #{out_stream}" } if @verbose >= 1 _server_serve_stream! in_stream, out_stream rescue Error::Terminate => err @running = false _log [ :serve_connection_terminate, err ] ensure _server_close_connection!(in_stream, out_stream) _log { "serve_connection!: disconnected" } if @verbose >= 1 end |
#server_on_start! ⇒ Object
111 112 |
# File 'lib/asir/transport/connection_oriented.rb', line 111 def server_on_start! end |
#server_on_stop! ⇒ Object
114 115 |
# File 'lib/asir/transport/connection_oriented.rb', line 114 def server_on_stop! end |
#stream ⇒ Object
!SLIDE Returns a connected Channel.
14 15 16 17 |
# File 'lib/asir/transport/connection_oriented.rb', line 14 def stream @stream ||= connect! end |