Real Time et acces aux fichier

bonjour les amis,

une application JAVA émettrice envoie des paquets (contiennent un Objet) a une autre application Java réceptrice d’une manière très rapide.
c.a.d l’intervalle entre deux paquets est moins de 10 millisecondes (ms).
alors imaginez le nombre de paquets si je lance les deux applications pendant 30 minutes!

je dois enregistrer les information reçues dans un fichier (pour les lire après), plus le temps entre deux paquets, le probleme c’est comment faire cet enregistrement d’une manière fiable??
car je peux pas a chaque fois que je reçois un paquet je vais ouvrir le fichier, écrire les informations et après je passe a l’autre paquets. je vais perdre du temps.

l’idée c’est que je stock un certaine nombre de paquets en mémoire et après je les sauvegarde dans le fichier et ainsi de suite…
c.a.d j’enregistre dans le fichiers les paquets bloc par bloc.

autre chose est ce que la serialisation va m’aider ou bien elle va ralentir l’écriture et la lecture des ces informations ???

est ce que vous avez une idée ?? comment ça se passe pour les systèmes en temps réel ???
Merci

C’est quoi tes paquets? Tu stockes la trame IP en entier, ou ?

Ce que je verrais, c’est :

Réception d'un paquet
  Si nombre de paquet > N
    Ecriture des paquets (dans une autre thread) dans la queue d'écriture et vidage des paquets
  Ajout du paquet dans la queue, avec un flag d'écriture Numéro Paquet / N
Fin.

Le flag d’écriture ne servant qu’à éviter d’écrire les nouveaux paquets reçus pendant l’écriture.

De manière plus phrasée, tu aurais deux threads.

Ta première thread traiterait la réception des paquets, et insèrerait les paquets avec un numéro de paquets, par exemple :

public class Paquet  {
  int number; 
  byte[] data;
}

Lorsque tu reçois le paquet, tu l’en-capsule dans ta classe :

for (int i = 0; attente d'un paquet; i = (i + 1) % Integer.INT_MAX ) {
  Paquet p = new Paquet(i, données du paquet);
  if (queue.size() > N) {
    ... demande à l'autre thread de faire son boulot ...
    autreThread.faitTonBoulot(i); // arrête jusqu'au paquet i.
  }  
  queue.add(p);
}
autreThread.videLaQueue();

L’autre thread fera son boulot de sagouin : la méthode faitTonBoulot() sert 1) soit à faire un Thread.start(), soit à en lancer une nouvelle, mais je te conseillerai de ne pas en recréer si elle existe déjà, car cela voudrait dire qu’elle n’a pas fini d’écrire et/ou que tu ne calibres pas bien ce N (= total des messages à attendre avant d’écrire).

Dedans, tu ne ferais qu’écrire les données, et le timestamp (que j’ai omis dans ma classe paquet).

Pour la sérialisation, je ne te la conseille pas : elle a un coût car il faut écrire les objets fait un format fichier. Donc s’ils viennent d’une autre application Java, sous forme de tableau par exemple, cela ne sert quasiment à rien.

C’est quoi les objets que tu reçois?

bonsoir
merci pour ta réponse
la paquet est constitué des plusieurs champs de données (id,nom,position…), je reçois ces donnes dans un certain ordre bien défini.

c.a.d je reçois pas un objet sérialisé mais des données séparées.

dans ce cas, deserialise dans ton autre thread, ou pas :slight_smile: (puisque tu ne t’en sers pas tout de suite de tes données, donc si tu reçois un tableau de byte, tu peux le laisser tel quel dans ce que tu écris dans ton fichier)
Edité le 08/05/2009 à 12:14