每分钟序列化JMS消息的树映射

时间:2012-04-03 08:24:44

标签: java multithreading jms treemap

我试图在一分钟内将收到的消息类的所有JMS对象存储到树映射中,而不是作为键的精确时间。完成一分钟后,我希望序列化映射并将byte []返回给另一堂课。同时我创建了一个新的树映射来存储下一组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堆空间的错误。我还注意到它只向地图写了一条消息,即如果消息是“hi”,“祝你好运“ - 这是两条消息; StoreMessage类一次收到一条消息..它首先收到“hi”,一旦处理完这条消息,它就会检索下一条消息。但我注意到,一分钟,当线程没有被中断时,它只将第一条消息写入地图并给出错误。我该如何解决这些问题?

1 个答案:

答案 0 :(得分: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();