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.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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.
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
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.
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)
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.
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)
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.
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)
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_ean1382212111941
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_ean1382212111941
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_ean1382212111941
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. :)
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. :)
(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. :)