Egg: 何时启动只执行一次的函数(内部监听)

Created on 25 Nov 2017  ·  4Comments  ·  Source: eggjs/egg

  • Node Version: 8.9
  • Egg Version: 1.10
  • Plugin Name:
  • Plugin Version:
  • Platform:
  • Mini Showcase Repository:


请问,egg启动后应该在何时启动只需执行一次的函数?比如开启本地的RPC监听。项目当前的写法是在agent.js在agent.messenger.on('egg-ready')后通知app.js启动某些service,如下代码

`
agent.messenger.on('egg-ready', () => {
agent.messenger.sendToApp('init',{});
});

app.messenger.on('init', data => {
    const ctx = app.createAnonymousContext();
    ctx.service.kafkaService.initListener();
});

`

但是感觉这种写法有些不伦不类,请问标准的做法应该是怎样的? app中是否有类似于app.on('egg-ready')的回调可以用来启动这些内部监听?谢谢

Most helpful comment

All 4 comments

有 app.messenger.on('egg-ready'

但别忘了, app 就是 worker,它是 cluster 多进程的,必然会执行多次,除非你在 agent 里面随机通知一个。这类事情本来就是 agent 的职责。

发自我的 iPhone

在 2017年11月25日,14:15,leiyanggz notifications@github.com 写道:

agent.messenger.on('egg-ready'

@atian25 谢谢, 仍有几个疑问

  1. 上面的代码测试结果确实是只执行了一次,并没广播给所有worker,是否需要改为 agent.messenger.sendRandom(action, data) 以确保只执行一次?
  2. 如果说内部监听也应该放在agent里面的话,就只能把大量的内部监听代码(如Kafka)放在agent.js (agent本身无法启动其他service的函数), 监听到以后通知app启动其他服务, 这样agent会比较臃肿,是否会新的问题?

这类问题是使用这种方式解决的 https://eggjs.org/zh-cn/advanced/cluster-client.html

Was this page helpful?
0 / 5 - 0 ratings