Многопоточное консольное Java-приложение для чтения из базы данных и обновления REST-сервера - PullRequest
0 голосов
/ 28 июня 2019

Я разработал консольное приложение Java, которое выполняет следующие действия:

  1. Извлечение сведений о продукте, таких как идентификатор продукта, имя, стоимость и т. Д., Из базы данных Oracle и размещение их на карте (скажем, в dbMap) - один продукт может иметь несколько записей, поскольку имеются под-продукты.

  2. Получить аналогичные сведения о продукте с сервера REST и сохранить их на карте (скажем, restMap)

  3. Поскольку БД имеет правильные данные, сравнивает две карты - dbMap и restMap и определяет, что следует добавить, заменить и удалить с сервера REST.

  4. Для этой цели я создаю один запрос исправления JSON для каждого продукта - с операциями добавления, замены, удаления (около ста или около того для каждого продукта) и отправляю его на сервер REST.

Тем не менее, я вижу, что для выполнения всех этих операций требуется несколько минут, и все эти операции происходят линейно - вызов базы данных, вызов остального сервера, сравнение и, наконец, сервер Patch to REST.

Я предполагаю, что вместо того, чтобы обрабатывать все данные в одном потоке, если я смогу получить список продуктов и перейти по каждому продукту, с каждым продуктом в отдельном потоке и запустить эти потоки параллельно, это может быть быстрее .

Итак, каждый поток может делать следующее: получать сведения о продукте одного продукта из базы данных, а также с сервера REST, сравнивать их оба, генерировать запрос исправления (с операциями добавления / удаления / замены) для этого продукта и отправлять его по адресу REST сервер.

Не могли бы вы подсказать, как я могу реализовать этот тип архитектуры потоков в Java? (Кажется, есть несколько способов, таких как пулы, AKKA и т. Д., И я в замешательстве.)

1 Ответ

0 голосов
/ 28 июня 2019

Поскольку dbCall и restCall не являются взаимозависимыми, вы можете выполнять параллельные вызовы в 2 потоках.И один выделенный поток для сравнения процессов.

Здесь вы можете использовать подход производителя-потребителя.

Вы можете использовать пулы потоков для одного и того же сервиса Executor:

http://tutorials.jenkov.com/java-util-concurrent/executorservice.html

...