Hy,
В настоящее время я разрабатываю программу, которая берет 2 значения из очереди amq и выполняет над ними серию математических вычислений. На сервере amq создана тема, на которую моя программа подписывается и получает сообщения через callback'и (listeners).
Теперь всякий раз, когда приходит сообщение, два значения удаляются и добавляются к объекту SynchronizedDescriptiveStatistics. После каждого добавления к списку значений вся последовательность вычислений выполняется заново (собственно это часть требования).
Проблема, с которой я сталкиваюсь сейчас, заключается в том, что, поскольку я использую прослушиватели, иногда в середине вычислений принимается одно или несколько сообщений. Хотя SynchronizedDescriptiveStatistics сам заботится обо всех проблемах, связанных с потоком, он добавляет все ожидающие значения в свой список чисел сразу, когда он выходит из блокировки или что-то в этом роде. В то время как моя проблема заключалась в том, чтобы добавить одно значение, затем выполнить вычисления для него, затем второе значение и так далее.
Решение, которое я придумал, состоит в том, чтобы использовать очереди заданий в моей программе (а не очереди amq). Таким образом, всякий раз, когда расчеты заканчиваются, программа будет искать дальнейшие задания в очереди и продолжит работу соответственно.
Поскольку я также стремлюсь к эффективности и скорости, я подумал, что среда Disruptor может подойти для этой проблемы, и она оптимизирована для многопоточных ситуаций. Но я не уверен, стоит ли внедрять Disruptor в мое приложение, потому что обычной стандартной очереди может быть достаточно для того, что я пытаюсь сделать.
Позвольте мне также сказать вам, что данных, на которых необходимо выполнять расчеты, очень много, и они будут продолжать поступать, и все расчеты необходимо будет выполнять снова и снова для каждого добавления одного значения в непрерывном режиме. Итак, учитывая эффективность и огромный объем данных, как вы думаете, что будет полезно в долгосрочной перспективе.
Ожидание ответа. . .
С Уважением.