ディレクトリにドロップされた受信ファイルを処理する必要があるアプリケーションがあります。私はこれを行うための最良の方法を探しています。
私たちはループするBackgroundrbプロセスを使用してきましたが、正直なところ、Backgroundrbは信頼性が低く、可能であればそれから離れたいと考えています。
Delayed_jobは、進行中のタスク用ではなく、1回限りのもののようです。
DirectoryWatcher http://codeforpeople.rubyforge.org/directory_watcher/ を見つけました。これは有望に見えますが、理想的には、これをある程度制御し、稼働しているかどうかを監視できるようにする必要があります。 。
したがって、要件は次のとおりです。
ご入力いただきありがとうございます。これは難しいことではないはずです。ビジネスアプリケーションではこれは珍しいことではないと思っていたので、Web上で他の誰かがこれについて話しているのを見つけることができないことに驚いています。
そして、 guard :もあります。
Guardは、ファイルまたはディレクトリが変更されるたびにカスタムルールを実行することにより、さまざまなタスクを自動化します。
これは、ソフトウェア開発者、Webデザイナー、ライター、その他の専門家によって、ソースファイルや構成を変更した後のツールの「再起動」などのありふれた反復的なアクションやコマンドを回避するために頻繁に使用されます。
一般的な使用例は次のとおりです。IDE交換、Web開発ツール、「スマート」および「レスポンシブ」ビルドシステム/ワークフローの設計、さまざまなプロジェクトタスクの自動化、さまざまなシステムサービスのインストール/監視...
ありがとう @ emerge 、Railsの相対的な初心者として、コマンドからではなく、Railsアプリでファイルを監視したかったここにある他のオプションと比較すると、 Listen は非常に単純な2つのステップであることがわかりました。
これをgemファイルに追加しました:
gem 'listen', '~> 2.0'
次に、これをApplication.rbに追加して、アプリの起動時に実行します。
listener = Listen.to('public/json_import') do |added|
puts "added absolute path: #{added}"
end
listener.start # not blocking
複数のdirを聞いたり、変更/追加/削除したりすることもできます。
listener = Listen.to('dir/to/listen', 'dir/to/listen2') do |modified, added, removed|
小さなfilewatcherrubygemもあります。 gemには依存関係がなく、プラットフォーム固有のコードが含まれておらず、ポーリングによって更新、削除、追加を検出するだけです。
require 'filewatcher'
FileWatcher.new(["directory"]).watch() do |filename, event|
if(event == :changed)
puts "File updated: " + filename
end
if(event == :delete)
puts "File deleted: " + filename
end
if(event == :new)
puts "Added file: " + filename
end
end
私が知っている3つの昔ながらのオプション:
Ara T. HowardのDirWatch:
私自身のDirectoryWatcher:
Paul HormanのFileSystemWatcher:
https://github.com/nex3/rb-inotify でうまくいくと思います。この宝石の使用例
require 'rb-inotify'
notifier = INotify::Notifier.new
notifier.watch("/tmp", :moved_to, :create) do |event|
puts "#{event.absolute_name} is now in path /tmp!"
end
notifier.run
https://github.com/mynyml/watchr
これは通常、単体テストを自動的に実行するために使用されますが、ニーズにも合うはずです。