【发布时间】:2014-07-10 01:12:53
【问题描述】:
我对 scotty web 应用程序和 mongodb 服务以正确的顺序启动有一个愚蠢的问题。
我先使用 systemd 启动 mongodb,然后再启动 scotty web 应用程序。由于某种原因它不起作用。应用程序错误,来自 mongodb 驱动程序的 connect: does not exist (Connection refused) 表示连接尚未准备好。
所以我的问题。如何以 0.5 秒的间隔测试连接可用性说 3 次,然后才出现错误?
这是应用程序的主要功能
main :: IO ()
main = do
pool <- createPool (runIOE $ connect $ host "127.0.0.1") close 1 300 5
clearSessions pool
let r = \x -> runReaderT x pool
scottyT 3000 r r basal
basal :: ScottyD ()
basal = do
middleware $ staticPolicy (noDots >-> addBase "static")
notFound $ runSession
routes
虽然应用服务是在 mongodb 服务之后排序的,但在应用启动期间与 mongodb 的连接仍然不可用。所以我得到了上面提到的错误。 这是 systemd 服务文件,以避免有关正确服务顺序的问题。
[Unit]
Description=Basal Web Application
Requires=mongodb.service
After=mongodb.service iptables.service network-online.target
[Service]
User=http
Group=http
WorkingDirectory=/srv/http/basal/
ExecStart=/srv/http/basal/bin/basal
StandardOutput=journal
StandardError=journal
[Install]
WantedBy=multi-user.target
我不知道为什么在正确的服务顺序下无法连接到 mongodb。 所以我想用 0.5 秒的延迟用 haskell 代码探测连接可用性三次,然后出错。我该怎么做?
谢谢。
【问题讨论】:
-
嘿,如果你的 systemd 服务文件中有 After=mongodb.service,mongodb 应该真的准备好接受连接了。您是否介意告诉我您的发行版(如果这是您获得 mongo 服务文件的地方)或粘贴您的 mongodb 服务文件(以及告诉我是您自己编写的还是从某个地方获得的)。非常感谢。
-
@CameronNemo 抱歉回复晚了 - 长假。我的发行版是 Arch。上面的服务文件显然是我自己的。 mongodb 服务文件随包一起提供。我不再尝试修复实际的 systemd 优先级。我在应用程序级别解决了它,尝试连接几次,直到 mongodb 准备好。
标签: mongodb haskell systemd scotty