Clojure - постоянно работающее приложение? - PullRequest
0 голосов
/ 04 мая 2018

Я видел несколько похожих вопросов, но ничего такого, что было бы очень конкретным, и, будучи новым разработчиком Clojure, не было уверенности в том, что какой-либо из них был лучшей практикой.

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

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

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Это зависит от того, как вы хотите, чтобы приложение было. Вы можете иметь кварцевый планировщик внутри и иметь задания, которые будут выполнять запрос. Поскольку приложение должно запрашивать БД каждую секунду или около того, имейте пул БД. Вы можете использовать фьючерсы для создания дополнительных рабочих потоков.

Другим способом было бы иметь планировщик вне приложения и использовать задание cron для вызова приложения или конечной точки.

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

0 голосов
/ 04 мая 2018

Я не вижу причин для создания нового потока из main, просто чтобы ждать его. Вы можете просто запустить «основной цикл» из основного потока, например:

(defn spawn-db-thread! []
  (doto (Thread. #(println "Doing something with the db here..."))
    (.start)))

(defn run-loop [max]
  (loop [n max]
    (when (pos? n)
      (spawn-db-thread!)
      (Thread/sleep 1000)
      (recur (dec n)))))

Этот фрагмент будет запускаться max раз, и на каждой итерации будет запускаться поток, который (в данном случае) просто выводит что-то на консоль. Тогда будет спать на секунду. Я только что добавил аргумент max для тестирования, вы можете его опустить, если хотите.

Конечно, если вы хотите создать что-то необычное, вам следует заглянуть в библиотеку core.async .

Кроме того, возможно, нет необходимости в том, чтобы обрабатывать вашу базу данных в отдельном потоке, я бы просто запустил ее в основном потоке. Но это зависит от вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...