jfinal运行jar包, 如何不受影响重启。

现在重启都是直接kill 进程id,  然后再启动java 项目。这种容易出现请求处理了一部分,然后被强制关闭掉,可能造成数据错乱。

项目使用nginx代理,部署在centos,  整理了一个脚本 ,先把nginx端口映射到其他端口上,然后过10秒再重启项目,最好再把nginx端口映射回去。这样留点时间给程序处理请求。脚本如下。

#!/bin/bash
`sed -i -e 's/127.0.0.1:8081/127.0.0.1:7777/g' /etc/nginx/nginx.conf`
`nginx -t`
`nginx -s reload`
sleep 10
###重启app
sleep 10
`sed -i -e 's/127.0.0.1:7777/127.0.0.1:8081/g' /etc/nginx/nginx.conf`
`nginx -t`
`nginx -s reload`
	

这种会造成项目停止服务近1分钟 。

请问有其他优雅点的重启方式吗?

评论区

糊搞

2020-07-14 16:56

建立nginx负载均衡,重启其中一个JFinal应用时,其它应用还在服务中。。。

JFinal

2020-07-14 17:21

如果希望不停服重启,用一个 nginx + 多个 jfinal 做一个集群就可以了,共享数据放在数据库里头,该开启事务开事务,保障数据一致性就可以了

石头809155072

2020-07-14 18:01

@糊搞 负载均衡能解决无服务的情况 ,但程序 重启本身还有存在一定的丢数据风险,比如没请求了,但有任务运行一半给重启了。

石头809155072

2020-07-14 18:04

@JFinal 部分任务是没使用事务的,比如请求三方接口的,这种重启造成中断还是有影响的,我的重点在有没有办法重启时确保程序内是已经无请求无进程的。

JFinal

2020-07-14 22:28

@石头809155072 重启的时候并不一定耽误正在运行的任务

你有使用 linux kill 命令的时候,不要带上 -9 等等参数, JVM 的停止是会等待正在运行的线程执行完毕的

石头809155072

2020-07-15 09:17

@JFinal 好,多谢了。

热门分享

扫码入社