Сериализация древовидной карты сообщений JMS в минуту - PullRequest
0 голосов
/ 03 апреля 2012

Я пытался сохранить весь объект JMS класса Message, полученный за одну минуту, в древовидную карту с указанием его точного времени в качестве ключа. По истечении одной минуты я хочу сериализовать карту и вернуть байт [] в другой класс. Тем временем я создаю новую древовидную карту для хранения следующего набора сообщений 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 heap space Также я заметил, что он продолжает записывать только одно сообщение на карту, то есть, если сообщения были "привет", "хорошего вам дня" - это два сообщения jms; класс StoreMessage получает по одному сообщению за раз ... то есть сначала он получает "привет", а после обработки этого сообщения он получает следующее сообщение. Но я заметил, что целую минуту, когда поток не прерывается, он записывает на карту только первое сообщение и выдает ошибку. Как я могу это исправить?

1 Ответ

0 голосов
/ 04 апреля 2012

Проблема в том, что ваша 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();
...