Я пытался сохранить весь объект 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 получает по одному сообщению за раз ... то есть сначала он получает "привет", а после обработки этого сообщения он получает следующее сообщение. Но я заметил, что целую минуту, когда поток не прерывается, он записывает на карту только первое сообщение и выдает ошибку. Как я могу это исправить?