Class: RJR::Nodes::Multi

Inherits:
RJR::Node show all
Defined in:
lib/rjr/nodes/multi.rb

Overview

Multiple node definition, allows a developer to easily multiplex transport mechanisms to serve JSON-RPC requests over.

All nodes used locally will share the same dispatcher so that json-rpc methods only need to be registered once, with the multi-node itself.

This node does not support client operations (eg send_msg, invoke, and notify)

Examples:

Listening for json-rpc requests over amqp, tcp, http, and websockets

# instantiate worker nodes
amqp_server = RJR::Nodes::AMQP.new :node_id => 'amqp_server', :broker => 'localhost'
tcp_server  = RJR::Nodes::TCP.new :node_id => 'tcp_server',  :host => 'localhost', :port => '7777'
web_server  = RJR::Nodes::Web.new :node_id => 'tcp_server',  :host => 'localhost', :port => '80'
ws_server   = RJR::Nodes::WS.new :node_id => 'tcp_server',  :host => 'localhost', :port => '8080'

# instantiate multi node
server = RJR::Nodes::Multi.new :node_id => 'server',
                               :nodes   => [amqp_server, tcp_server, web_server, ws_server]

# register rjr dispatchers (see RJR::Dispatcher)
server.dispatcher.handle('hello') do |name|
  # optionally use @rjr_node_type to handle different transport types
  "Hello #{name}!"
end

server.listen
server.join

# invoke requests as you normally would via any protocol

Instance Attribute Summary collapse

Attributes inherited from RJR::Node

#connection_event_handlers, #dispatcher, #message_headers, #node_id

Instance Method Summary collapse

Methods inherited from RJR::Node

#clear_event_handlers, em, #em, #halt, #indirect?, indirect?, #join, #node_type, #on, persistent?, #persistent?, tp, #tp

Constructor Details

#initialize(args = {}) ⇒ Multi

MultiNode initializer

Parameters:

  • args (Hash) (defaults to: {})

    the options to create the tcp node with

Options Hash (args):

  • :nodes (Array<RJR::Node>)

    array of nodes to use to listen to new requests on



51
52
53
54
55
56
57
# File 'lib/rjr/nodes/multi.rb', line 51

def initialize(args = {})
  super(args)
  @nodes = []
  args[:nodes].each { |n|
    self << n
  } if args[:nodes]
end

Instance Attribute Details

#nodesObject (readonly)

Return the nodes



46
47
48
# File 'lib/rjr/nodes/multi.rb', line 46

def nodes
  @nodes
end

Instance Method Details

#<<(node) ⇒ Object

Add node to multinode

Parameters:



65
66
67
68
# File 'lib/rjr/nodes/multi.rb', line 65

def <<(node)
  node.dispatcher = @dispatcher
  @nodes << node
end

#listenObject

Instruct Node to start listening for and dispatching rpc requests

Implementation of RJR::Node#listen



74
75
76
77
78
79
# File 'lib/rjr/nodes/multi.rb', line 74

def listen
  @nodes.each { |node|
    node.listen
  }
  self
end

#to_sObject



59
60
61
# File 'lib/rjr/nodes/multi.rb', line 59

def to_s
  "RJR::Nodes::Multi<#{@node_id}>"
end