📝Clojure Bot Development

📝Clojure Bot Development

August 16, 2022

bot/scheduler development.

Overview #

ClojureのBot開発についての知見をまとめていく. フロントエンドを持たないバックエンド開発, バックグラウンドタスク, スケジューラ, Botなどなど…

Clojureで手続きプログラミングなloopを書いたり状態を管理するベストプラクティスを知りたい. どうも手続き的な方法をそのまま導入することには違和感がある. もしくはフレームワークつかうか.

HTTPプロトコルに依存するものは📝Clojure Web Development, もしくは📝Clojure API Server Development.

クローラー開発の定期実行はこのメモに, スクレイピング技術は📝Clojure Scrapingへ.

ドメイン特化はサブメモへ.

Clojureでの無限ループ実装方法 #

cronをclojureで実現しようとしたときは無限の遅延シーケンスを扱うことになる. ネットの情報だとwebサーバが多いのだが, もはや📝Web Server Abstructionやそのフレームワークは内部の仕組みが隠蔽されて完成されているので, なかなかサーバのなかがなにをやっているのかよくわからない.

これはライブラリを使うのがいい. chimeがまず選択肢として上がる.

Clojure Schedular: 定期実行 #

📝cron的なものをClojureでどうやるか.

状態管理 #

うっかりREPLとかで無限ループを走らせるとREPLを再起動しないと止められないため, 状態管理の工夫が必要(start/stop). Clojureには状態管理ライブラリがあるのでそれらとくみあわせるといい.

📝Clojure Integrant

以下の例ではduct(integrant)にchimeを組み込んでいる.

duct-frameworkに定時起動ジョブを仕込む - Hash λ Bye

バックグラウンド実行 #

Clojure: Chime #

Clojureのスケジューラ開発のためのフレームワークで有名. チャイムと読む.

https://github.com/jarohen/chime

  • chime/chime-at: で指定時刻に実行.
  • chime/periodic-seq で無限ループ

chimeの設計 #

時間ごとの無限シーケンスをperiodic-seqで作成して, chime-atでその無限シーケンスを一つずつ消費していく. source(GitHub)

java.util.concurrent.ScheduleExecutorServiceの .schedule をつかっている.

ref. ScheduledExecutorService 使い方メモ - Qiita

💡chimeのループを止める方法 #

Returns an AutoCloseable that you can `.close` to stop the schedule. You can also deref the return value to wait for the schedule to finish.

(chime/chime-at)の戻り値をatomなどに保持しておいて, そのvalueに対して.closeを呼ぶと止まる.

(def state
  (atom ((chime/chime-at interval-seq
                         exec
                         {:on-finished stop})))
(.close @state)

💡 chimeのループを一時停止/再開する方法 #

integrantなどの状態管理フレームワークと連携して無限ループ一時停止と再開する方法.

💡 エラー発生時の運用継続/中断 #

:error-handlerのタグにハンドラーを渡すとエラー時の処理を記述できる.

さらに関数がtrueを返すと運用継続, not trueならば運用中断する.

🔗 References #

💡 Clojure Bot Development Topics #

無限ループを止めるにはどうすればいいの? #

Javaの仕組みを利用しているのでJavaの方法を検索するといろいろでてくる.

  • フラグで制御
  • 外部からのinterrupt
  • java.io.Closableを継承することによって.close呼び出し.

あまり自分で頑張らずになんかのフレームワークにのっかったほうがいいかも.

🔗 References #


Tags