Я пытаюсь переделать реализацию системы для отправки команд на основе UDP из приложения на сетевое устройство через UDP и затем получения ответа.Если ответ на конкретную команду в течение X миллисекунд не получен, считается, что для команды истекло время ожидания.
Используемый формат сообщения включает в себя поле sequenceId, используемое для сопряжения пакета ответа, полученного приложением, с«ожидающая команда», ожидающая ответа.
Текущая реализация кажется чрезмерно сложной и включает в себя несколько потоков (управляемых вручную) и несколько структур данных для отслеживания ожидающих команд.Существует DelayQueue и связанный поток, используемый для отслеживания команд тайм-аута, а также отдельный массив и связанный поток, который используется для обработки номинальных ответов (всякий раз, когда происходит какой-либо случай, необходимо обновить обе структуры данных).
Кажется, что здесь есть способ использовать Futures для упрощения вещей, но у меня мало опыта с ними.Я представляю себе что-нибудь, где всякий раз, когда команда отправляется, создается будущее и ждет ответа.Но я не уверен, как сделать так, чтобы мое будущее было «уведомлено» о том, что оно завершено, потому что это не будущее, которое «делает работу».Прямо сейчас существует один поток, который прослушивает входящие сообщения, извлекает sequenceId и сопоставляет ответ с командой.
Я думаю, что мне нужен способ иметь набор ожидающих фьючерсов - по одной на каждую невыполненную команду (каждая с тайм-аутом) - и всякий раз, когда я получаю дейтаграмму, которая соответствует идентификатору последовательности ожидающего выполнениякоманда / будущее, завершить будущее.Это возможно?Есть ли другое решение, которое мне не хватает?