Drb и callback

Posted on February 16, 2007
Иногда надо чтоб сервер пнул клиента и он чтонить сделал. Например сервер запускает длительный процесс а потом пинает клиента что он завершён. Для этой цели и придуманы обратные вызовы. В Drb они делаются очень просто
Код сервера

require 'drb/drb'

#Слушаем на всех интерфейсах
URI="druby://:8787"

class Client
	include DRb::DRbUndumped

	def callback
		@client.callback
	end
	
	def connect(clnt)
		@client = clnt
	end

end

class ClientFactory
	def initialize
		@clients = {}
	end

	def hello(name)
		unless @clients.has_key? name
			@clients[name] = Client.new
		end
		return @clients[name]
	end
end


FRONT_OBJECT=ClientFactory.new
$SAFE = 1 
DRb.start_service(URI, FRONT_OBJECT)
DRb.thread.join
И код клиента:

require 'drb/drb'
SERVER_URI="druby://10.26.11.58:8787"

class MeWaitCallback
	include DRb::DRbUndumped

	def initialize(uri = 'druby://localhost:8787')
		DRb.start_service
		@clients_service=DRbObject.new_with_uri(uri)
		@client = @clients_service.hello("Zlo")
		@client.connect(self)
		@client.callback
	end
	
	def callback
		puts "Yooo Hooo!"
	end

end


MeWaitCallback.new
Вот и всё, всё очень просто ))

Удивительное рядом, или распределённые приложения на ruby

Posted on February 15, 2007
Некоторое время назад я пробовал себя в написании распределённых приложений ... всё закончилось довольно скучно и костылестроительно ... а сегодня читая мануалы по руби наткнулся на замечательную вещь - DRB. Итак:

Руби имеет собственный протокол для передачи между клиентом и сервером druby
Рассмотрим кратенький экзампл из мануала:
Сервер:

  require 'drb/drb'

  # The URI for the server to connect to
  URI="druby://:8787" #принимаем по всем интерфейсам на порт 8787

  class TimeServer
    def get_current_time
      return Time.now
    end
  end

  #Объект для экспорта
  FRONT_OBJECT=TimeServer.new

  $SAFE = 1   # Эвал нам не нужен, пока какой-то урод не прислал `rm -rf /`

  #Стартуем сервер
  DRb.start_service(URI, FRONT_OBJECT)
  # И ждём пока drb не завершился
  DRb.thread.join

Теперь код клиента:

  require 'drb/drb'

  # Куда цепляться
  SERVER_URI="druby://localhost:8787"

 #Стартуем сервер для ловли колобков (callback) ;) 
 DRb.start_service

  timeserver = DRbObject.new_with_uri(SERVER_URI)
  puts timeserver.get_current_time
И вуаля, получаем текущее время на сервере
В следующий раз я напишу о callbacks и передаче объектов