ファイルシステムの変更について特定のディレクトリを監視する状況があります。そのディレクトリ内の特定のファイルが変更された場合、それを再度読み取り、既存のキャッシュされた情報をいくつか添付して、atom
.
関連するコードは次のようになります
(def posts (atom []))
(defn load-posts! []
(swap!
posts
(fn [old]
(vec
(map #(let [raw (json/parse-string % (fn [k] (keyword (.toLowerCase k))))]
(<snip some processing of raw, including getting some pieces from old>))
(line-seq (io/reader "watched.json")))))))
;; elsewhere, inside of -main
(watch/start-watch
[{:path "resources/"
:event-types [:modify]
:callback (fn [event filename]
(when (and (= :modify event) (= "watched.json" filename))
(println "Reloading posts.json ...")
(posts/load-posts!)))}
...])
これは最終的にローカルで正常に機能しますが、サーバーに展開すると、swap!
呼び出しが途中でハングします。
を介してデバッグしようとしましたがprintln
、それは私に言いました
- ファイルシステム トリガーが起動されています。
swap!
関数を複数回実行していない- 監視対象のファイルが開かれ、解析されています
- ファイルのいくつかのエントリが処理されていますが、その処理はエントリで停止します
111
(前のエントリと大きく異なるようには見えません)。 - 更新は完了しないため、その古い値が
atom
保持されます - このイベントがハングした後、ファイルシステム イベントは発生しません。
これは、どこかのメモリの問題か、Clojure-Watch (または基礎となる FS-watching ライブラリ) のバグであると思われます。
それを修正したり、さらに診断したりする方法はありますか?