【问题标题】:A copy of XXX has been removed from the module but is still activeXXX 的副本已从模块中删除,但仍处于活动状态
【发布时间】:2019-02-15 04:59:13
【问题描述】:

我基本上是在运行一个后台进程来检查文件,然后根据文件中发现的数据更新 rails 模型。但是,由于错误,我无法从线程内访问模型。

这是我的例子:

def check_logs
    while @start == 1
        results = Dir.glob("#{@path}/*.txt")
        unless results.empty?
            results.each do |result|
                file_name = result.split("/")[-1]
                data = File.open(result).read

                if file_name.include? "get"
                    data_contents = data.split("\n")
                    time = data_contents[0]
                    ExamResult.create(time: time)
                end
                FileUtils.rm_rf result
            end
        end

        sleep 5
    end
end

def start_agent
    @start = 1
    Thread.start {check_logs}
end

def stop_agent
   @start = 0
end

但是,当它在后台时,这是我在控制台中看到的错误:

以异常终止(report_on_exception 为真): Traceback(最近一次通话最后一次):5:来自 门户/lib/custom_rb/exam_results/exam_custom.rb:69:in block in start_monitoring_agent' 4: from portal/lib/custom_rb/exam_results/exam_custom.rb:40:incheck_logs' 3:来自门户/lib/custom_rb/exam_results/exam_custom.rb:40:in each' 2: from portal/lib/custom_rb/exam_results/exam_custom.rb:46:inblock 在 check_logs' 1: 从 /home/nutella/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active_support/dependencies.rb:202:in const_missing' /home/user/.rvm/gems/ruby-2.5.1/gems/activesupport-5.1.6/lib/active_support/dependencies.rb:496:inload_missing_constant':ExamResult 的副本已从 模块树,但仍处于活动状态! (参数错误)

我的目标只是有一个后台进程来监控日志。我看过其他一些关于同样确切错误的帖子,但也许除了为他们提供的解决方案之外,我可以做得更好。

任何想法或反馈将不胜感激。

【问题讨论】:

  • 你在用spring吗?

标签: ruby-on-rails ruby


【解决方案1】:

我不认为提供的错误与上面的代码有某种关系。 通常,当您在运行时使用元编程修改类时会发生此错误。

看看你需要的地方,定义ExamResult,看起来你在你的代码中多次需要它。

【讨论】:

  • 是的,这是 ExamResult 提到的唯一功能。如果我删除 Thread.start {check_logs},我永远不会收到错误。一开始它似乎工作得很好,但如果我刷新网页,几乎就像我调用那个模型的能力消失了一样。
  • 发生这种情况是因为 Rails 在页面刷新时重新加载您的模型,而之前指向 ExamResult 的常量不再可用。我不建议您在 Rails 应用程序范围内编写线程代码。例如,看看 Sidekiq gem。它会以安全的方式为您做到这一点。
  • 明白了。我试过sidekiq,但看起来你实际上不能阻止sidekiq工作者,对吧?例如,此代码检查实例变量以查看它是否已更改,如果更改则停止。但是,我认为我不能在 sidekiq 中做同样的事情吗?
  • 好吧,你可以在 sidekiq worker 内部实现几乎相同的逻辑。如果满足某些条件,那么您可以从 sidekiq 作业的perform 方法返回,它会停止,直到安排下一个作业。作为替代方案,您可以尝试github.com/thuehlinger/daemons gem,它是为编写长时间运行的应用程序和服务器而构建的。
  • 当然。 'my_object.reload' 应该从数据库中提取更改的属性。
猜你喜欢
  • 2015-06-20
  • 2013-07-07
  • 2011-11-28
  • 2013-09-24
  • 1970-01-01
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多