2009-11-20 7 views
0

Je suis avec un problème ici. J'ai un code client A qui appelle un B via RMI. Après cela, j'envoie une demande de file d'attente via JMS à l'implémentation réelle C. Cependant, je ne connais pas "l'adresse" de A. Y at-il un moyen de stocker les données de connexion en quelque sorte afin que je puisse retourner les données à A plus tard?Comment stocker des connexions rmi dans Java?

Fondamentalement, la chose est que B peut avoir des tonnes de demandes et besoin de synchroniser cela avec le demandeur. Comment faire ça?

Exemple:

A:

... 
    rmiB.HelloWorld("Sys"); 
... 

B:

String HelloWorld(String s) { 
    ... 
    sendToJMS(s); 
    ... 
    return???? 
} 

C:

String HelloWorldOnJMS(String aff) { 
    return "aff+2" 
} 
+0

Quelle est l'interface actuelle pour renvoyer des données à A? – erickson

+0

Ouais c'est vrai, je reçois une requête sur B et j'y travaille et je l'envoie en file d'attente dans JMS en C, et je veux obtenir le résultat C plus tard et obtenir par exemple une valeur et l'envoyer à A. vouloir avoir un moyen de rappel A en dehors de la méthode appelée rmi. –

Répondre

1

Si vous ne pouvez pas modifier A, alors B doit être responsable du blocage jusqu'à ce que produise un résultat et renvoie ce résultat synchrone comme résultat de la méthode RMI.

Il semble que le problème est plus sur la façon dont C peut répondre aux B (ou « B », car il semble que vous avez un groupe de ceux-ci) que la façon de répondre à A.

Normalement, les appels synchrones comme celui-ci sont simulés via JMS par creating a temporary queue, et specifying that as the reply address sur le message. Ainsi, B créerait une file d'attente temporaire, puis bloquerait sur cette file jusqu'à ce qu'il reçoive le résultat de C, puis renverrait le contenu de la réponse à A.

Je ne comprends pas complètement votre situation, mais il semble que toute autre approche nécessiterait des modifications de l'interface AB. Voulez-vous dire que vous voulez que le résultat du travail de C soit retourné suite à l'invocation de la méthode à distance de A?

+0

Excellente idée! –

0

bien, étant donné que A et B sont déjà connectés par l'intermédiaire d'un localisateur RMI , pourquoi ne pas simplement avoir un regi ster un service aussi, puis laissez B appeler ce service?

+0

Eh bien, je ne peux pas modifier A, car c'est un client et je ne peux pas modifier l'interface. Eh bien, je le fais parce que sur mon code B je fais l'équilibrage des serveurs. Je traite beaucoup de choses là pour le "client" A. –

0

Renvoi d'appel RMI vers un service JMSService? On dirait que Apache Camel est exactement ce dont vous avez besoin; C'est un cadre pour faire ce genre d'intégration d'entreprise.

Les composants page ont des exemples de configuration des points de terminaison RMI et JMS (et une myriade d'autres). Vous allez ensuite écrire un itinéraire en utilisant son puissant DSL pour transférer les messages d'un point de terminaison à l'autre.

+0

Je vais certainement y jeter un coup d'oeil: 3 –