Это очень распространенная проблема обработки данных с датчиков.
Чтобы синхронизировать и объединять данные датчиков из разных источников, я хотел бы реализовать их на Java без слишком сложных 3-х библиотек или фреймворков.
Скажем, я определяю объект (O), который состоит, например, из 4 атрибутов (A1, .. A4). 4 атрибута поступают из разных каналов данных, например канальный сокет.
4 атрибута поступают, как правило, с частотой 1,0 ~ 2,0 Гц, и их приходы не зависят друг от друга.
Как только 4 атрибута (A1, ..A4) будут приходить одновременно (в пределах небольшого временного окна, например, 100 мс), я создаю новый объект (O) из этих 4 атрибутов.
Описательный сценарий выглядит следующим образом.
время прибытия A1 ~ A4 помечено *.
Объекты O1 ~ U3 строятся в моменты времени t1, t2 и t3 соответственно.
Некоторые атрибуты поступают между t2 и t3, но не завершены для создания объекта, поэтому они
будет отброшен и проигнорирован.
A1 * * * *
A2 * * * *
A3 * * *
A4 * * * *
--------|------------|-----------------|----------> time
t1 t2 t3
O1 O2 O3
некоторые требования:
- идентифицирует момент времени a.s.a.p. для построения объекта из последних 4 входящих атрибутов.
- FIFO, O1 должен быть построен до O2 и т. Д.
- меньше блокировок в Java
- в конечном итоге отбросить данные, если они не завершены для создания объекта.
Несколько быстрых идей по реализации:
- хранить любые входящие атрибуты в очереди FIFO дискретных по времени сегментов (каждый блок содержит 4 различных атрибута).
- запустить бесконечный поток одновременно, чтобы проверить очередь FIFO (из начала очереди), если какой-либо сегмент уже заполнен 4 различными атрибутами. Если да, то создайте объект и удалите сегмент из очереди. Если контейнер не заполнен в течение определенного временного окна, он будет отброшен.
любые предложения и исправления приветствуются!