Elixir GenServer无法使用模块属性?

时间:2016-03-09 14:35:58

标签: elixir gen-server

我正在设置一个每小时运行一次的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

1 个答案:

答案 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

因为我认为问题可能是产品在电话会议之前没有计算,但从输出结果来看,我不认为这是问题所在。但我们需要查看您的确切代码,以便找出问题所在。