cronとscript/runnerを使用して実行するスケジュールされたジョブを持つRuby on Railsアプリがあります。Ruby/RailsアプリでTime.nowの動作が一貫していない
ジョブの目的は、延期された更新(「古い」、下記参照)を見つけ出し、(ジョブの実行後に)ジョブの「期日」を定義済みの分数に更新することです未来。
問題は私が 'due date'を設定すると、「GMT」時間が使用されることです。しかし、古いジョブを検索すると、「ローカル」時間が使用されているように見えます。サーバーの現地時間はGMTから-7時間ずれているため、更新の間隔は7時間延長されます。
例:ジョブの期日は、特定の日の06:00です。システムは、西海岸の06:00(7 GMT)の仕事を見つけます。ジョブが15分後に再度支払われる場合は、期日が06:15に設定され、オブジェクトの保存時(15分後と7時間後)に13:15に変更されます。
下記のコードを挿入します。違いがあれば、 'mark_updated'はモデルの一部であり、self.staleは同じモデルに含まれるモジュールのクラスレベル関数です。
ところで...ボーナス質問 - プロダクションのスクリプト/ランナージョブから実行されているSQLを取得するにはどうすればいいですか?これにより、デバッグが容易になります。私は何が起こっているのか少し推測しています。
def mark_updated
self.next_refresh_due_at = Time.now + update_interval_in_minutes.minutes
save
end
def self.stale(max = 3)
news_sources = NewsSource.find(:all,
:conditions => ["next_refresh_due_at < ?", Time.now],
:order => 'next_refresh_due_at ASC',
:limit => max)
return news_sources
end
アプリサーバーがSQLサーバーと別の場合はありますか? – Chuck
両方が同じサーバーにあります –