我想在服务启动成功之后执行一个定时任务,如果启动失败就不执行了
但是 echo 服务启动之后,就会”卡住“,后续逻辑无法继续执行了,这个其实和 echo 关系不大,其他的 web 服务也是这样的。
目前是用了一个笨办法,另启一个携程,然后不断的去 ping 服务,如果返回 200 则表示成功
感觉太 low 了,不知道有没有更好的解决办法
我想在服务启动成功之后执行一个定时任务,如果启动失败就不执行了
但是 echo 服务启动之后,就会”卡住“,后续逻辑无法继续执行了,这个其实和 echo 关系不大,其他的 web 服务也是这样的。
目前是用了一个笨办法,另启一个携程,然后不断的去 ping 服务,如果返回 200 则表示成功
感觉太 low 了,不知道有没有更好的解决办法
1
SorcererXW Aug 15, 2022 echo 内部用的就是原生的 http server ,可以看看这个 https://stackoverflow.com/questions/53332667/how-to-notify-when-http-server-starts-successfully
> 然后不断的去 ping 服务 这也不算笨吧,k8s 的健康检查判断服务是否启动也是这么做的 |
2
FrankAdler Aug 15, 2022 via iPhone
上代码
|
3
liaohongxing Aug 15, 2022
我也用 echo , 也有定时任务 ,没遇到你说的情况,我的定时任务自己造的轮子。
原理就是时间轮+协程, 不会阻塞 echo ,echo 也不会阻塞任务 。实在不会,github 整合一个 cron 库就行 |
4
liaohongxing Aug 15, 2022
你的服务要在 echo 之前运行
|
5
laolaowang OP @liaohongxing 我现在用的是 go-cron ,就是好奇怎么让定时任务不放在 echo 之前之后
|
6
liaohongxing Aug 15, 2022
你把任务放在 echo 之后,任务肯定会卡住,因为标准库基本原理就是 select chan , chan 没有数据自然卡住,后面的代码不会执行 ,无限循环在 Start 那里,go-cron 启动在 echo 前面, go-cron 本省不会阻塞,原理就是到了时间,启动一个协程运行 func 里面的代码,不会阻塞主线程
|
7
dzdh Aug 15, 2022
自己 net.Listen 或者 tls.Listen 。listen 成功,就一定能启动成功。listen 成功后启动你的定时任务 go func(){} 用协程。
然后再把 listen 传给 echo 再启动 echo 。 |
8
kidlj Aug 15, 2022
先在 goroutine 里启动任务,然后 Echo 启动不成功直接 panic.
|
9
lxz6597863 Aug 15, 2022
@dzdh +1
|
10
laolaowang OP @dzdh 学习了
|
11
laolaowang OP @kidlj 这个也可以,
|