vendredi 4 décembre 2015

In Rails 3, how do I call some code via a controller but completely after the Request/Response cycle is done?

I have a very weird situation: I have a system where a client app (Client) makes an HTTP GET call to my Rails server, and that controller does some handling and then needs to make a separate call to the Client via a different pathway (i.e. it actually goes via Rabbit to a proxy and the proxy calls the Client). I can't change the pathway for that different call and I can't change the Client at all (it's a 3rd party system).

However: the issue is: the call via the different pathway fails UNLESS the HTTP GET from the client is completed.

So I'm trying to figure out: is there a way to have Rails finish the HTTP GET response and then make this additional call?

I've tried:

1) after_filter: this doesn't work because the after filter is apparently still within the Request/Response cycle so the TCP/HTTP response back to the Client hasn't completed.

2) enqueuing a worker: this works, but it is not ideal because if the workers are backed up, this call back to the client may not happen right away and it really does need to happen right after the Client calls the Rails app

3) starting a separate thread: this may work, but it makes me nervous: adding threading explicitly in Rails could be fraught with peril.

I welcome any ideas/suggestions.

Again, in short, the goal is: process the HTTP GET call to the Rails app and return a 200 OK back to the Client, completely finishing the HTTP request/response cycle and then call some extra code

I can provide any further details if that would help. I've found both #1 and #2 as recommended options but neither of them are quite what I need.

Ideally, there would be some "after_response" callback in Rails that allows some code to run but after the full request/response cycle is done.

Aucun commentaire:

Enregistrer un commentaire