2009-04-20 8 views
3

J'ai besoin d'un framework qui va m'aider à faire du streaming asynchrone sur http. Cela peut ressembler à SOAP WS ou à quelque chose d'autre. Je ne sais pas si je le nomme correctement, alors voici ce dont j'ai besoin:Diffusion de service web asynchrone

ServerA veut faire une demande à ServerB distant sur http. La requête contient des informations arbitraires. Le résultat pour cela va contenir plusieurs enregistrements du même type. Certains d'entre eux sont disponibles immédiatement, d'autres sont disponibles plus tard. ServerA veut obtenir des résultats disponibles dès que possible, sans attendre que tous les résultats soient disponibles. Dans le monde réel, ServerB effectuera une recherche sur différentes sources de données, dont certaines sont plus réactives que d'autres.

Je peux penser à 3 types de solution. Tout d'abord, ServerA génère id aléatoire de la demande, effectue une requête SOAP

void ServerB.startSearch(id, request); 

qui renverra immédiatement, puis A appelle périodiquement

Result[] ServerB.areThereAnyNewResults(id); 

Ainsi les sondages ServeurA SERVERB avant de nouvelles reasults. J'appelle cette méthode d'interrogation. Elle implique de multiples connexions établies de A à B. Une autre solution consiste à exposer le service de réception sur le côté ServerA, comme

ServerA.acceptResults(String id, Result[] newResults); 

et appelez

ServerB.startSearch(id, request, serverAReceivingServiceEndpoindAddress); 

Alors ServerB pousse de nouveaux résultats à ServerA.acceptResults() lorsque de nouveaux résultats sont disponibles. Je l'appelle pousser. Elle implique 1 connexion établie de A à B et une connexion multiple établie de B vers A.

Une autre option consiste à diffuser les résultats sur le même canal http, dans une seule réponse. Un appel http (je ne sais pas si cela peut être SOAP ou devrait être quelque chose d'autre), B commence la recherche et quand de nouveaux résultats sont disponibles, il les envoie sur le flux http et le vide, donc ils peuvent être disponible sur le côté A immédiatement. Il ne ferme pas la connexion http tant que tous les résultats ne sont pas disponibles. Cela n'implique qu'une seule connexion de A à B, c'est pourquoi je préférerais l'utiliser. Je l'appelle en streaming. Je comprends que cela peut ne pas fonctionner si un proxy est en train de tamponner le contenu de la réponse. Donc, ma question est de savoir s'il y a une solution qui fera la plupart du travail pour moi. Ce que je voudrais faire est d'appeler ce code sur un côté

Service s = new RemoteAsyncService("http://serverb.com/serviceEndpoint", RemoteAsyncService.STREAMING); 
// or RemoteAsyncService.POLLING, or RemoteAsyncService.PUSHING 
Request r = new Request(...); 
Callback callback = new Callback(){ 
void newResults(Result[] result){...} 
// e should be null if finished correctly 
void requestFinished(RemoteException e){...} 
} 
s.search(request, callback); 

et la mettre en œuvre sur le côté SERVERB

public ServiceImpl implements Service{ 
    void search(Request r, Callback c){ 
    // perform search, call c.newResult() when new results are available 
    } 
} 

Et le reste est géré par le cadre, y compris la connexion rétablissement quand il est tombé, tomber en mode polling/pushing si le streaming ne peut pas être fait à cause d'un proxy tampon, en appelant callback.requestFinished() quand ServerB finit de fonctionner ou en lançant l'exception, etc. Probablement il devrait également gérer l'authentification de manière standard. Donc, y a-t-il une solution qui résume la façon dont la communication est faite, et est-ce que la capacité de streaming est possible dans la mesure du possible?

Si ce n'est pas le cas, pensez-vous qu'il serait utile de l'implémenter en open source? :)

Répondre

1

Ce dont vous parlez sonne comme un service COMET.Vous pouvez lire l'article de Wikipedia ici:

Comet (programming)

Je ne sais pas comment vous mettre en œuvre quelque chose comme ça en Java, mais dans .NET, vous pouvez utiliser un contrat Duplex pour un service WCF. Vous pouvez en savoir plus sur la façon d'accéder et communiquer avec ce style de service ici:

How to: Access Services with a Duplex Contract

+0

Pour Comet, les conteneurs de servlets comme [Jetty] [1] ont un appui raisonnable. Et oui, on dirait que Comet pourrait aider ici. Et inversement, SOAP n'est probablement pas très utile - plutôt, le service Web Comet ou RESTish permettrait plus de flexibilité. [1]: http://www.mortbay.org/jetty/ – StaxMan

+0

Je pense que la communication de style Comet serait limitée à des cas particuliers, car si la période d'exécution est très longue, vous pouvez épuiser les ressources aux deux extrémités en attente les opérations s'accumulent avec le temps. Puisque SOAP est fondamentalement synchrone RPC, vous devez presque avoir deux services SOAP, un exposé par le "serveur" et un service de réponse/rappel exposé par le "client" qui fait passer l'appel initial le long d'un URI de réponse à dire au "serveur" où rappeler. Je suppose que c'est ce qu'un contrat duplex WCF est plus ou moins. – Bob77

Questions connexes