class RJR::Nodes::Multi

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)

@example 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

Attributes

nodes[R]

Return the nodes

Public Class Methods

new(args = {}) click to toggle source

MultiNode initializer @param [Hash] args the options to create the tcp node with @option args [Array<RJR::Node>] :nodes array of nodes to use to listen to new requests on

Calls superclass method RJR::Node::new
# File lib/rjr/nodes/multi.rb, line 51
def initialize(args = {})
  super(args)
  @nodes = []
  args[:nodes].each { |n|
    self << n
  } if args[:nodes]
end

Public Instance Methods

<<(node) click to toggle source

Add node to multinode @param [RJR::Node] node the node to add

# File lib/rjr/nodes/multi.rb, line 65
def <<(node)
  node.dispatcher = @dispatcher
  @nodes << node
end
listen() click to toggle source

Instruct Node to start listening for and dispatching rpc requests

Implementation of RJR::Node#listen

# File lib/rjr/nodes/multi.rb, line 74
def listen
  @nodes.each { |node|
    node.listen
  }
  self
end
to_s() click to toggle source
# File lib/rjr/nodes/multi.rb, line 59
def to_s
  "RJR::Nodes::Multi<#{@node_id}>"
end