OVH Cloud OVH Cloud

Problème RMI

4 réponses
Avatar
jean_yves.pere
Bonjour,

J'ai, semblerait-il tout du moins, un problème de perte de données
lorsque j'envoie des données par RMI.

J'ai une machine A qui se connecte à une machine B et une machine C
par RMI. Ces machines font des opérations puis me renvoient le
résultat vers A qui est chargé d'écrire cela dans un fichier. Hors, il
se trouve que de temps en temps, certaines données ne sont pas
exportées.

J'ai donc, décidé d'utiliser sur B et C le code écrivant les résultats
obtenus. Quand, sur A certaines données sont absentes, elles sont bien
présentes sur B ou C et il n'y a jamais de données manquantes sur ces
deux machines. Quand les données sont manquantes, c'est à chaque fois
tout un type qui est absent pas seulement une ou deux instances (comme
si la liste contenant les objets étaient transiente). J'en suis venu à
la conclusion que cela pouvait provenir de RMI mais cela m'étonne
fortement car les données sont des objets très simple qui contiennent
des strings. N'ayant pas toucher à RMI depuis très longtemps, je dois
oublier quelquechose mais je ne vois pas quoi.

Donc, voila, j'implore votre aide. ;)

4 réponses

Avatar
Trognon Patrice
Jean-Yves Pere wrote:

Bonjour,

J'ai, semblerait-il tout du moins, un problème de perte de données
lorsque j'envoie des données par RMI.

J'ai une machine A qui se connecte à une machine B et une machine C
par RMI. Ces machines font des opérations puis me renvoient le
résultat vers A qui est chargé d'écrire cela dans un fichier. Hors, il
se trouve que de temps en temps, certaines données ne sont pas
exportées.

J'ai donc, décidé d'utiliser sur B et C le code écrivant les résultats
obtenus. Quand, sur A certaines données sont absentes, elles sont bien
présentes sur B ou C et il n'y a jamais de données manquantes sur ces
deux machines. Quand les données sont manquantes, c'est à chaque fois
tout un type qui est absent pas seulement une ou deux instances (comme
si la liste contenant les objets étaient transiente). J'en suis venu à
la conclusion que cela pouvait provenir de RMI mais cela m'étonne
fortement car les données sont des objets très simple qui contiennent
des strings. N'ayant pas toucher à RMI depuis très longtemps, je dois
oublier quelquechose mais je ne vois pas quoi.

Donc, voila, j'implore votre aide. ;)



c'est un bug deterministe ou non ?

Ce qui peut arriver c'est le cas suivant :

public class Doc {
private int nbpages ;
}

public class Book extends Doc implements Serializable {
private String author ;
private String editor ;
}

public class Periodical extends Doc implements Serializable {
private String frequency ;
}

Et dans ton code tu instancie donc :

Document[] biblio = new Document[ 10 ] ;
for(int i=0; i<biblio.length; i++) {
if ( 0 == (i % 2) ) {
biblio[ i] = new Book();
// apres call des setters.
} else {
biblio[ i] = new Periodical();
// apres call des setters.
}
}

Ensuite quand tu serialize on est d'accord que tu vas
faire :

oos.writeObject( biblio ) ; // enfin par exemple.

Ben dans ce cas la, les attributs de Doc sont pas serialisés,
aucune erreur a la compilation car Book et Periodical sont
bien implements Serializable, aucunne erreur au runtime non
plus. Par contre de l'autre coté tu vas récupérer null
pour author et editor.

Solution, coller le implements Serializable sur la classe Doc,
propriété Serializable dont vont hériter Book et Periodical
puisqu'ils extends Doc.

Voila, je ne sais pas si c'est ce genre de cas sur lequel
tu tombes vu le peu d'information que tu nous livres, mais
voici déjà une explication possible.

J'ai constaté ca en 1.3, il me semble aussi en 1.4, je
n'ai pas vérifié en 1.5.

--
Cordialement,

Patrice Trognon
http://wwW.javadevel.com

Avatar
Jean-Yves Pere
Trognon Patrice wrote:


c'est un bug deterministe ou non ?


Oups, j'ai oublié de le préciser. Non ce n'est pas déterministe. Cela se
produit en moyenne 1 fois sur 10. Enfin, j'ai 3 installations comme cela
et cela se produit uniquement sur deux d'entre elles, sur la troisième
il ne semble pas avoir ce problème (version de JDK identique).


Voila, je ne sais pas si c'est ce genre de cas sur lequel
tu tombes vu le peu d'information que tu nous livres, mais
voici déjà une explication possible.


Non, tous mes objets héritent directement de Object et implémentent tous
Sérializable.

Voila le code appellant :

HashMap map = new HashMap();
Iterator nameItr = systemMap.keySet().iterator();
while(nameItr.hasNext()) {

String name = (String)nameItr.next();

String address = (String)systemMap.get(name);

String remoteName = "//" + address + "/SystemStatistics";
SystemStatisticsRemoteInterface remote (SystemStatisticsRemoteInterface)Naming.lookup(remoteName);

if(logger.isInfoEnabled()) {
logger.info("Name : " + name);
logger.info("Address : " + address);
}



SystemData statistics = remote.execute(groups, process, hostname);
map.put(name, statistics);
}

l'objet SystemData contient des listes d'objets ayant pour attribut des
String. Et donc parfois, il manque certains objets alors que quand je
vérifie en local, ils sont présents.


J'ai constaté ca en 1.3, il me semble aussi en 1.4, je
n'ai pas vérifié en 1.5.


Je suis en 1.4.0

java version "1.4.0"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.0-b92)
Java HotSpot(TM) Client VM (build 1.4.0-b92, mixed mode)

(et c'est pas moi qui choisi le JDK ni ne peut influencer pour ne
serais-ce que passer en 1.4.2)

Avatar
jerome moliere
Jean-Yves Pere wrote:

Bonjour,

J'ai, semblerait-il tout du moins, un problème de perte de données
lorsque j'envoie des données par RMI.

J'ai une machine A qui se connecte à une machine B et une machine C
par RMI. Ces machines font des opérations puis me renvoient le
résultat vers A qui est chargé d'écrire cela dans un fichier. Hors, il
se trouve que de temps en temps, certaines données ne sont pas
exportées.

J'ai donc, décidé d'utiliser sur B et C le code écrivant les résultats
obtenus. Quand, sur A certaines données sont absentes, elles sont bien
présentes sur B ou C et il n'y a jamais de données manquantes sur ces
deux machines. Quand les données sont manquantes, c'est à chaque fois
tout un type qui est absent pas seulement une ou deux instances (comme
si la liste contenant les objets étaient transiente). J'en suis venu à
la conclusion que cela pouvait provenir de RMI mais cela m'étonne
fortement car les données sont des objets très simple qui contiennent
des strings. N'ayant pas toucher à RMI depuis très longtemps, je dois
oublier quelquechose mais je ne vois pas quoi.

Donc, voila, j'implore votre aide. ;)
salut jean yves,

cela faisait lontemps :)
tu peux nous indiquer ta topologie erseau ?
firewalls entre B et C ? ou entre A et B ?
si oui tu peux avoir des soucis en effet souvent regle par le
parametrage de la jvm (java.rmi.hostname=..)
exceptions dans ton code ? traces ?

HTH
Jerome
--
Auteur cahier du programmeur Java tome 2 - Eyrolles 10/2003
http://www.eyrolles.com/php.informatique/Ouvrages/ouvrage.php3?ouv_ean13—82212111941

Avatar
Jean-Yves Pere
jerome moliere wrote:


salut jean yves,
cela faisait lontemps :)


Salut,

(oui, plus trop le réflexe de trainer sur usenet mais je viens de
découvrir que j'ai accès à un serveur de news... )

tu peux nous indiquer ta topologie erseau ?
firewalls entre B et C ? ou entre A et B ?


Les machines font parties du même sous-réseau, et donc il n'y a aucuns
firewalls entre elles. Enfin, elles font parties de 3 sous-réseaux
différents mais j'accède entre elles à partir des interfaces appartenant
au même sous-réseau.

si oui tu peux avoir des soucis en effet souvent regle par le
parametrage de la jvm (java.rmi.hostname=..)


Aucuns problèmes pour me connecter au serveur RMI. Par contre, je viens
de me rendre compte que j'aurais pu me servir de java.rmi.hostname pour
positionner l'adresse de mon serveur. ^^;

Je vais essayer de regarder du coté du paramétrage, le réseau est
suffisament exotique pour que cela puisse poser problème.

exceptions dans ton code ? traces ?


C'est bien le problème, j'ai aucunes exceptions de levées. Au niveau des
traces, le déroulement semble être identique quand il me manque des
données. La seule inconnue semble être au moment du passage par le
réseau. Il arrive qu'il y ait pas mal de collisions sur celui-ci.

Pour le moment, j'ai résolu temporairement mon problème en récupérant
les fichiers sur B et C par FTP et en les concaténant sur A mais...
c'est pas forcement super propre. :)