On Mon, Feb 18, 2008 at 03:28:27PM +0100, Calogero Lo Leggio wrote:
Hola a tutti!
Presento subito il mio dubbio/problema:
.gsub! ‘mio’, ‘nostro’ #
Integro con alcune precisazioni così magari do un’idea un pò più precisa
di quello che stiamo facendo:
Voglio fare un applicazione in ruby client/server che permette al client di
utilizzare le classi definite nel server per poi inoltrare richieste al mondo
esterno…
Il client non ha idea delle classi che vengono definite lato server e
queste sono completamente gestite dal server.
cerco di spiegare meglio quello che voglio fare:
-
server:
Contiene varie classi (tutte condividono il metodo .manda) e dovrebbe
restituire un oggetto di una di queste, che non fa altro che fare delle
richieste HTTP a vari siti
-
client:
Dovrebbe prendere quest’oggetto già istanziato/riempito e richiamare il
metodo .manda
Senza sapere quasi nulla della classe definita dal server, ovvero il
client sa solo che la classe ritornata ha un metodo .manda, e
probabilmente altri (che però non gli interessano in quanto non li userÃ
mai).
una delle soluzioni più pulite mi è sembrata Drb(+Marshal) ma da quello che ho
capito/sperimentato drb si limita a passare un riferimento alla classe del
server oppure una copia Marshalosa, cosa che a me non serve…
Siamo riusciti ad allocare oggetti tramite DRb, ma gli oggetti vengono
istanziati sul server, a noi serve che gli oggetti prendano vita sul
client.
Sospetto (sospettiamo?) che quello a cui vogliamo arrivare sia
possibile, in particolare ho trovato sul web vari riferimenti a
DRbObject.new, secondo certa documentazione sarebbe possibile usare il
primo argomento per mappare un oggetto locale (cioè appartenente al
client) in qualche modo, ma in tutti i tutorial si trova impostato a
nil, e la rdoc non spiega una mazza.
Ecco del codice di esempio:
#########################
server.rb
require ‘drb/drb’
class Cpoj
include DRb::DRbUndumped
mostra dove viene istanziato l’oggetto
def initialize()
puts “i am a #{self.class} object (#{self.object_id}) born on #{$$}”
end
esegue il lavoro sporco
def work(string)
puts “i am working on #{$$}, arg was #{string}”
return “i have worked”
end
end
associa la classe Cpoj al servizio
DRb.start_service ‘druby://server:6666’, Cpoj
puts “Service started at #{DRb.uri}”
DRb.thread.join
#########################
client.rb
require ‘drb/drb’
server=DRbObject.new_with_uri ‘druby://server:6666’
puts “i am the client: #{$$}”
l’oggetto viene allocato sul server !
the_cpoj=server.new
puts “the worker returned “#{the_cpoj.work ‘testo passato al
metodo’}””