提前感谢您的回复。
在工作中,我们使用sucker punch gem为rails应用程序发送电子邮件以及我们想要异步执行的其他操作。
我们实现了几个没有问题的actor,甚至成功地为它们编写了一些测试,使用推荐的配置(在规范中需要sucker_punch/testing/inline
并使用截断作为数据库清理策略)。
一切都像魅力一样,直到我们决定实施的最后一个演员。它与其他产品没有什么不同,但现在,在运行测试套件时,会引发ActiveRecord::ConnectionTimeoutError
。
我在互联网上搜索了一个解决方案,但没有任何结果。大多数答案(如this one)建议使用ActiverRecord::Base.connection_pool.with_connection
方法将块传递给它。我们已经这样做了。
我唯一可以想到的是我们正在处理演员的错误,拯救例外,如下:
def perform
ActiveRecord::Base.connection_pool.with_connection do
begin
... # do something
rescue SomeException => e
... # handle exception
end
end
end
但是看source这不是问题,因为with_connection
确保释放它。
如果我有新闻,我将在sucker punch上打开一个问题,并会更新这个问题。
有问题的发布可以等待,但这也让我想知道我们是否在生产中遇到同样的问题......
干杯, 阿尔达纳。
修改 gem的作者告诉我,显然代码没有任何问题,并建议增加池大小。我将使用这种方法,如果错误仍然存在,我们将更改代码的某些部分,而不是使用sucker punch。