Rakefile からスケジュールされたタスクで更新したい Sinatra アプリケーションにグローバル変数があります。アプリケーションは Heroku でホストされていることに注意してください。この変数にアクセスするためにヘルパーを設定しました。
get '/' do
@@var
end
helpers do
def get_var
return @@var
end
def set_var(value)
@@var = value
end
end
私のRakefileのタスクは次のとおりです。
task :do_something do
Sinatra::Application.set_var(get_data)
end
def get_data
# Retrieve value from external source
...
return val
end
私が遭遇した問題は、タスクが適切に実行されることですが、Sinatra アプリケーションの変数が更新されないことです。これはSinatra::Application
、Rakefile 内から呼び出すと、更新しようとしているプライマリ インスタンスとは別のアプリケーション インスタンスが実際に作成されるためだと思います。
Rakefile タスク内から実行中の Sinatra Web アプリのスコープにアクセスする方法があるかどうかを知りたいです。
*注意: スケジュールされたタスクで取得した値をデータベースに書き込んで、Sinatra アプリからアクセスすることもできますが、この変数は更新頻度が低いのに定期的に取得されるため、データベースに保持したいのでやり過ぎです。簡単にアクセスできるメモリ。データベースへの移行を避けるために Memcache と Redis を調べましたが、これも単一の値では過剰であると感じています。これに同意しないでください。
編集: Alexey Sukhoviy のコメントに関して、Heroku は tmp ディレクトリ外のファイルへの書き込みを許可しておらず、これらはアプリケーションのニーズを満たすのに十分な時間保持されていません。