[Backgroundrb-devel] Could a BackgrounDrb worker do this?

Ezra Zygmuntowicz ezmobius at gmail.com
Thu Sep 14 13:00:35 EDT 2006


On Sep 13, 2006, at 7:38 AM, Bill Walton wrote:

> Hi Ezra,
>
> Ezra Zygmuntowicz wrote:
>
>>> Continuing our conversation from the Rails list.
>>
>> Welcome ;)
>
> Thanks!
>
>>> Does any of the way I'm thinking about this tell you I'm heading  
>>> off 'into the weeds'?
>>
>> Yes you have a few incorrect notions,
>
> I was afraid of that ;-)
>
>> let's see if I can clear things up for you a bit.
>
> I really appreciate it.  I should warn you though.  Sometimes even  
> *I* am surprised by my density ;-)
>
>> Your backgroundrb worker are not rails controllers at all and they  
>> do not directly respond to ajax calls. In your rails app you have  
>> access to the MiddleMan object that you can  use to start workers  
>> in the drb server and ping them for results  later during the ajax  
>> requests.
>
> If I can ping the worker from the controller and they can respond  
> and my controller can receive and process their response, and  
> they're sitting out there running and waiting to respond, I'm not  
> getting why they couldn't *initiate* a 'conversation'.  Is this a  
> 'we don't have a tool built to do that' situation?  Or is it 'the  
> Rails architecture doesn't allow for that kind of interprocess  
> communication' situation?

	I'm just not sure what you are trying to accomplish with this. I  
think you are making it way more difficult ;) The way backgroundrb  
works is mainly a one way thing. You kick off the workers from your  
controller and then you can ping the worker later from your  
controller to get status or results from it. If you really feel you  
need to call back to your controller from the bgdrb server, you could  
use net/http in ruby's standard library top make a http request back  
to the rails app.

	The problem with trying to talk back to rails from the drb server is  
that rails is not persistent. Each request instantiates a new  
controller object. So if you try to callback to rails from bdrb, you  
aren't garanteed to get the same controller object to work with. So  
bdrb works by letting rails control it. You kick off your worker  
classes with a command in your controller and then you store a job  
key in your sessions. Then on later requests in rails you can use  
this job key to grab a handle on your worker object and call methods  
on it for results.

>
> <snip>
>
>> So IU hope that explains it a bit better.
>
> I have a much better understanding of how to use BackgrounDRb.   
> Thank you. But I'm still confused ;-(
>
> I think, maybe, my confusion comes from associating (in my mind)  
> BackgrounDRb and dRuby (drb) as discussed in "Programming Ruby".   
> The DRb class description (p.670) says "Although expressed in terms  
> of clients and servers, once the initial connection is established,  
> the protocol is effectively symmetrical: either side can invoke  
> methods in objects on the other side."  Could you shed some light  
> on this for me?

	Yes BackgrounDRb uses drb to do its work. But the way it is designed  
is for use with the way rails works. Its a persistent daemon that  
runs your jobs. Your rails controllers and models are all  
instantiated on each request so they don't persist and thats why you  
need a session.

	So yes its true that the way drb works is that both ends effectively  
become servers and clients. But because rails is a web app, and the  
way request/response and object instantiation in rails works, you  
can't really call back to rails from backgroundrb. Because the place  
you would be trying to call back to won't exist after its request is  
served.


Cheers-
-Ezra


More information about the Backgroundrb-devel mailing list