Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с ByteBuffer / 7 сообщений из 7, страница 1 из 1
17.11.2014, 20:53
    #38808821
irbis_al
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с ByteBuffer
Добрый день,Уважаемы Форумчане.

Разрабатываем очередной кроссплатформенный драйвер для очередной модели весов.
Есть определённое успешно эксплуатируемое в продакшине некое клише("рыба-шаблон") для драйвера:

1.Весы в comport отправляют цепочку байт(где содержится информация о весе цене устойчивости и т.д).
2.Они(байты ) кладутся в ByteBuffer
3.Далее в другом потоке парсер в соответствии с протоколом весов распознают нужную информацию и отправляет её в OC.
4.И далее ByteBuffer очищается методом clear

Многое оборудование так успешно работает.
Но вот появилось оборудование которое просто спамит в rs-232. (4-5 раз в секунду и по 128 байт).

Тех.условия подбираются так чтобы один "выхлоп"(пакет) весов равнялся 1/4 ByteBuffer limit.(Впрочем этот показатель не так важен) Главное,что парсеру п3 может прийти на анализ несколько "выхлопов"(пакетов).
и парсер последний(старший) пакет анализирует.


И 2-3 часа драйвер работает правильно,а потом начинает проскальзывать старые данные.(как будто бы clear не было)
Трассируем.смотрим что поступает из rs-232 b и это же пишем в ByteBuffer делаем println.
Потом смотрим что парсит и выясняется
(Напоминаю...это через пару часов работы)
Пришло <пакет с весом 1>
Должно быть в ByteBuffer(и так и есть первые часы)
<пакет с весом 1>0x00 0x00 000000000000(до лимита)

а после 1.5-3часов работы
<пакет с весом 1><пакет с весом старым>0x00 0x00 0000000(до лимита)
НЕ ВСЕГДА...а где-то каждую 100-150 итерацию.
(Т.е это мерцающая поломка...что называется ужас инженера)

читаю статью
http://stackoverflow.com/questions/11197875/fast-erase-not-clear-a-bytebuffer-in-java
там рекомедуют bytebuffer.put(byte[])

Делаем ByteBuffer.clear();bytebuffer.put(byte[]);
Наработка на сбой возрасла до 12 часов .(От 12 до 15)...Но всё равно лажа.

Читаю документацию
https://docs.oracle.com/javase/7/docs/api/java/nio/Buffer.html#clear()

Написано вот это.
This method does not actually erase the data in the buffer, but it is named as if it did because it will most often be used in situations in which that might as well be the case.

Давайте сверим позиции.
This method does not actually erase the data in the buffer

Это я перевожу как метод фактически не удаляет данные из буфера(Тут у меня вообще "взрыв мозга"....а нафиг он вообще этот метод нужен).

Воторую часть я так и не смог точнг перевести
, but it is named as if it did because it will most often be used in situations in which that might as well be the case.
Какой-то набор слов "типа это иметь место". :-)

Вот...у кого какие будут соображения.?
...
Рейтинг: 0 / 0
17.11.2014, 21:11
    #38808832
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с ByteBuffer
Насколько я помню NIO API, подготовку к записи новых данных после считывания уже имеющихся делает Buffer.flip()
Проще всего сделать два буфера, чтобы не возиться с переходом на начало буфера, когда считываются данные "у верхней границы".
...
Рейтинг: 0 / 0
17.11.2014, 21:17
    #38808840
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с ByteBuffer
Можно, кстати, обернуть в байтовые буферы два региона одного массива - тогда этот массив станет циклическим буфером.
...
Рейтинг: 0 / 0
17.11.2014, 21:24
    #38808847
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с ByteBuffer
Ваша проблема возникает, скорее всего, как раз из-за использования clear().
Если между очередными чтениями устройство успеет "накидать" больше данных, чем может поместиться в буфера - возникнет переполнение, которое вы не обрабатываете.
"По моему так" (ц) Винни-Пух
...
Рейтинг: 0 / 0
17.11.2014, 21:48
    #38808865
irbis_al
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с ByteBuffer
Basil A. SidorovВаша проблема возникает, скорее всего, как раз из-за использования clear().
Если между очередными чтениями устройство успеет "накидать" больше данных, чем может поместиться в буфера - возникнет переполнение, которое вы не обрабатываете.
"По моему так" (ц) Винни-Пух

Не переполнения нет....Иначе бы owerflow exeption было бы.
Как правило я имею задел 4 пакета.
...
Рейтинг: 0 / 0
17.11.2014, 21:55
    #38808871
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с ByteBuffer
Если не пользоваться:
Код: sql
1.
while (buf.hasRemaining())

, то зачем вообще NIO?
Если пользоваться, то в логически простом коде можно сделать массу логических же ошибок.
...
Рейтинг: 0 / 0
17.11.2014, 22:57
    #38808901
grasoff.net
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с ByteBuffer
irbis_alдля очередной модели весовчто за весы-то?
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Проблема с ByteBuffer / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]