2012-04-03 8 views
0

Ich habe versucht, alle JMS-Objekte der Klasse Nachricht in einer Minute in eine Baumstruktur gegen ihre genaue Zeit als Schlüssel gespeichert zu speichern. Nach Ablauf einer Minute möchte ich serialisieren map und gebe das Byte [] an eine andere Klasse zurück. Inzwischen erstelle ich eine neue Baumkarte, um die nächsten JMS-Nachrichten für eine Minute zu speichern.Serialisieren einer Baumstruktur von JMS-Nachrichten pro Minute

public class StoreMessage { 

    private static long start_nanotime = System.nanoTime(); 
    private static Thread thisThread = Thread.currentThread(); 
    private static int timeToRun = 60000; // 1 minute 
    private static byte[] b = null; 
    public static Map<Long, Message> map1 = new TreeMap<Long, Message>(); 

    public static byte[] store(Message message) { 

     new Thread(new Runnable() { 

      public void run() { 
       try { 
        sleep(timeToRun); 
        thisThread.interrupt(); 
        b = serializer.serialize(map1); 
        new TreeMap<Long, Message>(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     }).start(); 

     while (!Thread.interrupted()) { 
      long precise_time = TimeUnit.MILLISECONDS.toNanos(System.currentTimeMillis()) + (System.nanoTime() 
        - start_nanotime); 
      map1.put(precise_time, message); 

     } 
     return b; 
    } 
} 

Dieser Code ist einige, wie nicht funktioniert. Warum? Es gibt mir einen Fehler von java.lang.OutOfMemoryError: Java-Heap-Speicherplatz Auch habe ich festgestellt, dass es schreibt nur eine Nachricht an die Karte, dh wenn die Nachrichten waren "Hallo", "guten Tag für Sie" - das sind zwei JMS-Nachrichten; Die StoreMessage-Klasse empfängt jeweils eine Nachricht. Wenn sie zuerst "hi" empfängt und diese Nachricht verarbeitet wird, ruft sie die nächste Nachricht ab. Aber was ich bemerkt habe, ist, dass der Thread eine Minute lang nicht unterbrochen wird, sondern nur die erste Nachricht auf die Karte schreibt und einen Fehler gibt. Wie repariere ich diese?

Antwort

0

Das Problem ist, dass Ihr map1 nie tatsächlich zurückgesetzt wird, da die Zuordnung fehlt.

public void run() { 
       try { 
        sleep(timeToRun); 
        thisThread.interrupt(); 
        b = serializer.serialize(map1); 
        map1 = new TreeMap<Long, Message>(); // Changed this line 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 

Natürlich könnten Sie auch deaktivieren Sie einfach die Karte:

map1.clear(); 
Verwandte Themen