undertow 自动服务重启失败

各路大神,小弟近日遇到个比较棘手的问题。在window中部署了应用,使用undertow作为服务器。

image.png

将启动脚本配置到了 service 服务中,并且设置了自动启动。

image.png

服务器停电重启后,yhis2自动启动失败,原因是数据库连接失败,日志报错如下:

2021-03-09 08:28:40 Apache Commons Daemon procrun stderr initialized.
java.lang.RuntimeException: Plugin start error: com.jfinal.plugin.activerecord.ActiveRecordPlugin. 
java.sql.SQLRecoverableException: ORA-01033: ORACLE initialization or shutdown in progress


	at com.jfinal.core.Config.startPlugins(Config.java:137)

	at com.jfinal.core.Config.configPluginWithOrder(Config.java:71)

	at com.jfinal.core.Config.configJFinal(Config.java:59)

	at com.jfinal.core.JFinal.init(JFinal.java:61)

	at com.jfinal.core.JFinalFilter.init(JFinalFilter.java:64)

	at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:111)

	at io.undertow.servlet.core.ManagedFilter.createFilter(ManagedFilter.java:80)

	at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:594)

	at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:559)

	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42)

	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)

	at io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:601)

	at com.jfinal.server.undertow.UndertowServer.configHttp(UndertowServer.java:287)

	at com.jfinal.server.undertow.UndertowServer.doStart(UndertowServer.java:265)

	at com.jfinal.server.undertow.UndertowServer.start(UndertowServer.java:158)

	at com.zshsoft.application.Application.main(Application.java:18)

Caused by: com.jfinal.plugin.activerecord.ActiveRecordException: java.sql.SQLRecoverableException: ORA-01033: ORACLE initialization or shutdown in progress


	at com.jfinal.plugin.activerecord.TableBuilder.build(TableBuilder.java:55)

	at com.jfinal.plugin.activerecord.ActiveRecordPlugin.start(ActiveRecordPlugin.java:226)

	at com.jfinal.core.Config.startPlugins(Config.java:128)

	... 15 more

Caused by: java.sql.SQLRecoverableException: ORA-01033: ORACLE initialization or shutdown in progress


	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)

	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:389)

	at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:382)

	at oracle.jdbc.driver.T4CTTIoauthenticate.processError(T4CTTIoauthenticate.java:441)

	at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)

	at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)

	at oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:404)

	at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:385)

	at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546)

	at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236)

	at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)

	at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)

	at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:156)

	at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:218)

	at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:150)

	at com.alibaba.druid.filter.FilterAdapter.connection_connect(FilterAdapter.java:787)

	at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:150)

	at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1646)

	at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1710)

	at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:939)

	at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1376)

	at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:1372)

	at com.alibaba.druid.pool.DruidDataSource.getConnection(DruidDataSource.java:109)

	at com.jfinal.plugin.activerecord.TableBuilder.build(TableBuilder.java:43)

	... 17 more

百度了下,说服务可以设置依赖关系,先启动A服务,再启动B服务,但也有一个缺点,如果A服务停止,B也会受影响。

Tomcat服务没有这个情况,请问下大家,undertow如何配置,用法也能跟Tomcat一样,可顺利自动重启?

评论区

要输就输给追求

2021-03-09 11:22

开机延迟2分钟启动试试?2分钟数据库应该启动起来了

zzutligang

2021-03-09 11:31

就是配置服务依赖!这个必须的。数据库没起来,就是延迟2分钟也没用。再说,如果中间数据库服务停了,你的程序还有什么用呢。

杜福忠

2021-03-09 11:53

@zzutligang 因为数据库和java放在同一个服务器,数据库启动到恢复访问,时间耗时一般比较长。而jfinal-undertow启动又非常快(Tomcat启动慢),并且configPlugin(Plugins me)插件配置ActiveRecordPlugin是有启动检测配置映射关系功能的,如果插件不可用,会快速失败,不启动整个项目。

那原因知道了, 我想到的有两个解决方案:

1:先检测数据库是否可用DruidPlugin.start,如果可用再启动UndertowServer.start方法即可,不可用的时候就休眠一会再检测。

2:ActiveRecordPlugin独立线程启动,不和configPlugin一起启动,在独立线程里面循环尝试启动ActiveRecordPlugin插件,如果不可用休眠一会儿再尝试。

JFinal

2021-03-09 14:25

@杜福忠 同学原因分析得应该挺对,但解决办法可以更简单点,我给一个更省事的办法,步骤如下:
1:在 YourJFinalConfig 中添加一个 onStart() 方法,在这个方法中手动启动 DruidPlugin 与 ActiveRecordPlugin

2:用一个 for 循环加一个try catch 处理一下,代码大致如下:
public onStart() {
DruidPlugin dp = new ...;
ActiveRecordPlugin arp = new ...;
for ( int i = 0 ; i < 10; i++ ) {
try {
dp.start();
arp.start();
} catch ( Exception e) {
Thread.sleep(3000); // 线程睡 3 秒
continue ;
}
}
}

杜福忠

2021-03-09 15:12

@JFinal 😺 onStart()里面启动确实简单一些,我之前想着是怕它容器有启动超时问题,所以想增加一个新线程启动数据库(启动项目后有数据库操作请求会报错问题),免得一直阻塞着,刚搜了一下undertow好像没有启动超时

北流家园网

2021-03-11 08:04

@杜福忠 @JFinal 问题已解决,谢谢两位。

JFinal

2021-03-11 12:09

@北流家园网 你这个好像是装启动封装在了一个带 UI 的程序中,分享一下怎么打包到这种项目中的

北流家园网

2021-03-11 13:02

@JFinal 应用程序放在服务器上,使用CEF开发一个客户端,客户端可以通过URL访问服务器应用,CEF通过客户端与html页面互相调用。这样可以实现一些本地化的功能,比如医院中的实验室、化验室设备,都是不放在互联上的,通过客户端可以调用数据,然后使用html.ajax调用java后台,上传到同一数据库里。再比如,医保接口,医保接口也是不给联网的,通过客户端就将医保与应用联系起来了。

JFinal

2021-03-11 15:45

@北流家园网 8 错 8 错 👍👍👍