如何在部署的时候先执行创建数据表的SQL脚本,然后启动服务

先粘一下代码image image 我们创建了一个component类ChooseShelfJobManager,构造函数是依赖数据库的,docker部署的时候发现spring容器的托管ChooseShelfJobManager的时候比执行创建表的sql脚本要提前,此时数据表未创建,程序报错,数据库创建数据表没有完成,请问一下如何让创建数据表能在服务启动开始的时候就创建或者是在此之前?image

请参考这里:https://doc.cuba-platform.cn/manual-7.2-chs/app_lifecycle_events.html#AppContextStartedEvent

AppContextInitializedEvent 之后并且运行完所有 AppContext.Listener.applicationStarted() 之后触发。此时:

  • AppContext.isStarted() 方法返回 true
  • AppContext.isReady() 方法返回 false
  • 在中间件上,如果启用了 cuba.automaticDatabaseUpdate应用程序属性,所有数据库更新脚本已成功执行。

订阅合适的事件来处理依赖数据库表的任务。

感谢回答,但是这些监听器好像还是太晚了,容器已经初始化完成了,image ,我想要在它还没有初始化之前去执行数据库脚本,image 。因为我的容器中有依赖数据库的image ,不清楚能不能实现?

明白你的意思 。
现在是出现了什么错误,如果有异常的话把异常日志发上来?

container (3).log (44.0 KB)
日志已上传,问题是他会在容器初始化的时候去数据库中查找“SYS_CONFIG”这张表,找不到后容器初始化失败了,其他依赖它的同样无法初始化,程序报错,同时创建数据表的SQL脚本不会执行。

当然可以将代码优化,让容器初始化不依赖数据库。不过就是出现这个问题觉得CUBA是不是应该在服务启动之前去执行脚本更好一些。

看起来在容器初始化完成之前有读取属性的操作,建议优化代码,在 AppContextStartedEvent 后再读取DB 属性。或者改为使用APP属性。

CUBA 提供的应用程序生命周期事件就是为了协调这类逻辑的先后顺序 。

嗯,好的,感谢