2011-11-11 3 views
2

Mon application a un maître et de nombreux esclaves qui répondent aux sockets Call-Over du maître et envoient les statistiques dans un objet. En ce moment, je teste le code avec un maître et deux esclaves. Le code fonctionne bien avec 1 esclave mais avec 2 esclaves, les objets reçus à la fin du maître sont peuplés deux fois. Deux copies du même objet.Condition de course pendant la sérialisation

Code de Maser: Le maître reçoit périodiquement des esclaves et exceuting donc à l'aide d'une minuterie:

public void run() { 

    try { 
     byte[] recvBuf = new byte[15000]; 
     DatagramPacket packet = new DatagramPacket(recvBuf, recvBuf.length); 
     DatagramSocket dSock = new DatagramSocket(4445); 
     dSock.receive(packet); 
     int byteCount = packet.getLength(); 
     ByteArrayInputStream byteStream = new ByteArrayInputStream(recvBuf); 
     ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(byteStream)); 
     //receiving the object pm of class PM 
     pm1=(PM)is.readObject(); 
     } 
} 

et le code de l'esclave:

{ 
InetAddress address = InetAddress.getByName("10.129.54.254"); 
      ByteArrayOutputStream byteStream = new ByteArrayOutputStream(15000); 
      os = new ObjectOutputStream(new BufferedOutputStream(byteStream)); 
      os.flush(); 
      //sending the object pm of class PM 
      os.writeObject((PM)pm); 
      os.flush(); 
      byte[] sendBuf = byteStream.toByteArray(); 
      DatagramPacket packet = new DatagramPacket(sendBuf, sendBuf.length, address, 4445); 
      int byteCount = packet.getLength(); 
      DatagramSocket dSock = new DatagramSocket(); 
      dSock.send(packet); 
      os.close(); 
      dSock.close(); 
      } 
     } 

doute: 1. Dois-je stocker les objets de les deux esclaves dans un tableau? Si oui, comment puis-je différencier les deux objets reçus sur le socket pour que le même objet ne soit pas stocké deux fois? En supposant que l'objet envoyé a un attribut unique tel que id. -à-dire

class PM{ 
int uniqueid; 
} 
  1. Je suis en train d'écrire tout le code et donc ne veulent pas utiliser Jini ou d'autres API. Merci!
+0

Quels objets sont envoyés? Comment les sauvez-vous? – Kane

+0

Les objets pm de la classe PM sont envoyés du côté de l'esclave. Je les sauvegarde du côté du maître en utilisant une série d'objets PM. Ai-je répondu à votre question? –

Répondre

3

Lorsque vous recevez

 //receiving the object pm of class PM 
    pm1=(PM)is.readObject(); 

Ne pas stocker tout dans un champ comme le prochain objet à partir de la deuxième esclave sera également placé dans ce domaine. Au lieu de cela, vous devez utiliser une variable locale, lire le contenu de l'objet et agir dessus. Ou si vous souhaitez qu'un autre thread le traite, ajoutez une tâche à un seul ExecutorService avec un thread pour traiter les objets.

+0

@ PeterLawrey- Merci! Essayé cela pour une course. Mais je cours le programme maître comme une tâche chronométrée toutes les 2 secondes. Et l'objet du côté du client ne contient pas toujours le même contenu. –

Questions connexes