需求是这样的,使用了egg-sequelize,为了分表外加新建项目后自动生成新建,除了固定的表之后,拟写了一个动态创建表的逻辑。
对egg摸的不是很透彻,所以只能按照自己思路搞了。
大概流程是在新建一个产品的时候会以产品名动态生成5个表,然后sync,然后每个model手动挂载在app.model上(每次启动时在didReady 进行所有动态表同步导入)。
获取model的时候ctx.model和app.model都能获取到动态的表,但是因为开多线程模式只有一个线程能同步所以我使用了this.app.messenger进行发送和监听。
What happens?这里会出现一个BUG:
app.js didReady里创建:
const ctx = this.app.createAnonymousContext();
ctx.model是Sequelize {} 空对象。
所以导致在其他线程work里的service里无法使用ctx.model,改用app了。
有可能和我只给app.model赋值了有关?然后非多线程模式我却能在ctx获取到model。
this.app.model正常,但是有个奇怪的问题:
我需要生成的表有5个,所以写了一个循环生成。
在messenger.on里执行的生成表逻辑循环里如果直接操作app.model[modelName] = model 手动挂载的话,其中一个线程work走完后,到第二个去挂载的话会自动崩溃重启,没有报错,原因不明。
如果在用一个额外变量储存好所有的model后,待循环完了之后在赋值给app.model就不会崩溃重启,也不是很明白原因。
最小可复现仓库复现步骤,错误日志以及相关配置暂无。
- 开启多线程。
- 操作线程动态的创建model.define对象逻辑,挂载,然后发送给其他线程。
- 其他线程同样执行创建model.define对象逻辑,挂载。
另外有个疑问,多线程通信是否可以排除发送者? 我在文档中似乎没有这个配置。
静待答复,拜谢各位大佬。
相关环境信息- 操作系统:win10
- Node 版本:node version v10.12.0
- Egg 版本:egg version 2.22.2