#java #queue #jms #correlation
#java #очередь #jms #корреляция
Вопрос:
В настоящее время я разрабатываю механизм корреляции на java, который извлекает данные из файлов pdf и сопоставляет (при необходимости выдает предупреждения) структурированные данные из реляционной базы данных.
Фокусируясь на обработке файлов pdf, система состоит из:
Компонент, который выполняет пользовательское извлечение из pdf.
Компонент, который анализирует иногда неупорядоченные нечистые данные в требуемые структуры данных
Компонент нормализации, который нормализует значения для сравнения
И компонент, который взаимодействует с базой данных (куда извлеченные данные будут вставлены вместе с остальными данными)
Компоненты следует повторно использовать в других цепочках обработки, но все они изначально будут выполняться в одной системе.
Я думаю, что разумно иметь какую-то буферизацию между компонентами, разумно ли использовать JMS Queueing или это слишком усложнит ситуацию? Я экспериментировал с простым объектом linkedblockingqueue, но этот объект должен передаваться между компонентами, поэтому для него требуются основные компоненты, которые управляют всем, что, я не уверен, желательно, есть ли стандартный способ решения этой проблемы?
Ответ №1:
Я бы использовал связанные вызовы, если у вас нет дополнительных требований.
loadPDF(new PDFExtractor(new PDFParser(new Normalizer(new DBEnricher(listener)))));
Если вам нужно несколько потоков, я бы обработал каждый файл в другом потоке, используя пул потоков ExecutorService.
Комментарии:
1. Достаточно ли стандартно включать объект queue в каждый компонент для завершенных заданий и извлекать обработчики из него или размещать очередь в отдельном обработчике?
2. Я бы попросил один компонент вызвать другой с помощью вызова метода и вернуть результат или выдать исключение при возникновении ошибки. Я не вижу необходимости в очереди.
3. Идея использования очередей заключается в том, что некоторые задания будут настолько требовательными к процессору и памяти, что лучше завершить эти задачи и поместить результаты в очередь, чтобы ресурсы могли быть освобождены, также очередь может использоваться несколькими потоками, работающими одновременно
4. Если у вас есть только один файл PDF и вам нужно обрабатывать часть файла одновременно, это полезная вещь. Однако я подозреваю, что вы можете обрабатывать несколько файлов одновременно, т. Е. у вас больше файлов, чем ядер, а добавление очереди увеличивает накладные расходы на кодирование и обработку и, вероятно, будет медленнее, чем более простое решение.