Each worker comes with an Event loop of its own and can potentially do lots of fancy stuff. Two noteworthy methods are:
connect(ip,port,Handler) start_server(ip,port,Handler)
If you are familiar with the EventMachine or Twisted style of network programming, the above methods allow you to start tcp servers inside your workers or let you connect to external tcp servers. For Each accepted client or connected socket, an instance of Handler class would be created and integrated with main event loop. This can be used for worker to worker communication between backgroundrb servers running on two machines.
BackgrounDRb::MetaWorker#connect
:
connect
lets you connect to an external TCP Server and integrates the connection within reactor loop
of worker. For example:
class TimeClient def receive_data(p_data) worker.get_external_data(p_data) end def post_init p "***************** : connection completed" end end class FooWorker < BackgrounDRb::MetaWorker set_worker_name :foo_worker def create(args = nil) external_connection = nil connect("localhost",11009,TimeClient) { |conn| external_connection = conn } end def get_external_data(p_data) puts "And external data is : #{p_data}" end end
BackgrounDRb::MetaWorker#start_server
:
Above method allows you to start a tcp server from your worker, all the accepted connections are integrated with event loop of worker.
class TimeServer def receive_data(p_data) end def post_init add_periodic_timer(2) { say_hello_world } end def connection_completed end def say_hello_world p "***************** : invoking hello world #{Time.now}" send_data("Hello World\n") end end class ServerWorker < BackgrounDRb::MetaWorker set_worker_name :server_worker def create(args = nil) # start the server when worker starts start_server("0.0.0.0",11009,TimeServer) do |client_connection| client_connection.say_hello_world end end end