2012-04-03 56 views
0

我試圖將一分鐘內收到的類消息的所有JMS對象存儲在樹形圖中,並將其作爲密鑰的精確時間。完成一分鐘後,我希望序列化地圖並將字節[]返回給另一個類。同時我創建一個新的樹形圖來存儲下一組JMS消息一分鐘。序列化每分鐘的JMS消息的樹形圖

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; 
    } 
} 

此代碼是一些如何不工作。爲什麼?它給我錯誤java.lang.OutOfMemoryError:Java堆空間另外我注意到它一直只寫一條消息到地圖,即如果消息是「嗨」,「對你很好的一天」 - 這些是兩個jms消息; StoreMessage類一次接收一條消息......它會首先收到「hi」,一旦處理完這條消息,它就會檢索下一條消息。但是我注意到,整整一分鐘,當線程沒有中斷時,它只會將第一條消息寫入地圖並給出錯誤。我如何解決這些問題?

回答

0

問題是您的map1永遠不會實際重置,因爲分配丟失。

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(); 
       } 
      } 

當然,你也可以簡單地清除地圖:

map1.clear();