2014-01-19 4 views
2

Я пытаюсь быстро публиковать сообщения на своем сервере через Websockets. Для каждого сообщения сервер получает я храню его в форме «timestamp: message» в моей HashMap. Мне нужна HashMaps для возврата истории сообщений в хронологическом порядке с необходимой меткой времени. (Любая другая рекомендация структуры данных приветствуется.)Duplicate millisecond timestamp issue

Так получилось, что при быстром публикации сообщений два или более сообщений имеют одну и ту же метку времени, и поэтому я не могу их сохранить. Я уже использую System.currentTimeMillis(). Я не могу войти в наносекунды, я читаю, что это значение произвольно и часто ненадежно.

Я попытался добавить статическую переменную AtomicInteger в конце временных меток, и она работает, но когда я возвращаю сообщения моему пользователю, мне нужно вернуть JSON, и снова я не могу сохранить дубликат ключа.

Как я могу решить эту проблему?

+0

извините, переместил его на ответ, потому что он слишком длинный;) – kmera

+0

Используйте 'System.nanoTime()'. Хотя обратите внимание, что _Отличия в последовательных вызовах, которые охватывают более 292 лет ... неправильно вычисляют _. (!) –

+0

Я бы хотел, чтобы это было надежно. Но это не так. –

ответ

1

Вам нужна абсолютная метка времени? возможно, счетчик, т. е. знание a, поступившее до b, - достаточно, иметь счетчик, который вы увеличиваете, когда приходит сообщение, и использовать его как «метку времени». больше дубликатов и хронологический порядок все еще нетронутыми.

Кроме того, вы также можете просто использовать очередь FIFO, если вы не настаиваете на наличии карты. это также будет сохранять хронологический порядок.

+0

Мне нужна временная метка :) –

+1

Разделение проблем - используйте общий идентификатор для вашего HashMap и метку времени как часть вашего бизнес-объекта в значениях карты. – Michael

+0

Я, наконец, закончил хранение сообщений в формате '{timestamp + count:" Message "}' Пометив это как ответ на запись, чтобы помочь мне привести его. –