Постановка заданий в очередь в цепочке обработки в Java

#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 и вам нужно обрабатывать часть файла одновременно, это полезная вещь. Однако я подозреваю, что вы можете обрабатывать несколько файлов одновременно, т. Е. у вас больше файлов, чем ядер, а добавление очереди увеличивает накладные расходы на кодирование и обработку и, вероятно, будет медленнее, чем более простое решение.