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