我正在设置一个每小时运行一次的GenServer来缓存数据。我按照JoséValim发布的示例回答了有关如何执行此操作的问题。
How to run some code every few hours in Phoenix framework?
它很有效,除非我给Process.send_after/3
调用的时间间隔是模块属性,它不会运行。有没有人知道为什么会这样?
所以以下内容不起作用,但如果在Process.send_after/3
的调用中,我将@interval
替换为60 * 60 * 1000
,它会按预期运行(这实际上是上面其他SO帖子中的代码) :
defmodule MyApp.Periodically do
use GenServer
def start_link do
GenServer.start_link(__MODULE__, %{})
end
@interval 60 * 60 * 1000
def init(state) do
Process.send_after(self(), :work, @interval)
{:ok, state}
end
def handle_info(:work, state) do
# Begin caching the new data.
MyApp.CacheManager.cache_new_data()
# Start the timer again
Process.send_after(self(), :work, @interval)
{:noreply, state}
end
end
答案 0 :(得分:1)
您是否发布了正在使用的确切代码?我刚试过这个:
iex(1)> defmodule T do
...(1)> @interval 60 * 60 * 1000
...(1)> @calc_int (60 * 60 * 1000)
...(1)> def t do
...(1)> IO.puts @interval
...(1)> IO.puts @calc_int
...(1)> end
...(1)> end
{:module, T,
<<70, 79, 82, 49, 0, 0, 4, 212, 66, 69, 65, 77, 69, 120, 68, 99, 0, 0, 0, 124, 131, 104, 2, 100, 0, 14, 101, 108, 105, 120, 105, 114, 95, 100, 111, 99, 115, 95, 118, 49, 108, 0, 0, 0, 4, 104, 2, ...>>,
{:t, 0}}
iex(2)> T.t
3600000
3600000
:ok
因为我认为问题可能是产品在电话会议之前没有计算,但从输出结果来看,我不认为这是问题所在。但我们需要查看您的确切代码,以便找出问题所在。