Odoo client具备即时刷新数据的能力
它是通过 message bus 实现的, 它的技术架构是这样的
后端业务逻辑里面 往 bus 发送一个消息,这消息会被 client 侦听,也就是 long polling 服务;在 odoo 16 之后,改用 web socket 模式。 Client 启动时,会订阅 bus, 当 client 收到 消息后,它会触发一个 事件, 这事件将会 触发一个 数据刷新的 业务逻辑, 这个逻辑它执行 数据刷新,并将数据显示在 client 页面上。
下面,以 odoo 15 systray menu 上的 活动计数器为例 说明
在 客户端, 它会 侦听 activity_updated 这个 事件 event
收到 事件, 调用 _updateCounter 更新 页面
在来看看, client 是怎么 收到 后端发送过来的 消息的,它会轮询 bus service ;在 web socket 中,则是 订阅它
它是当 bus_serivice 收到 消息时, 在client 的 bus 触发一个 事件
最后,来看看 业务逻辑里面是 如何发送 消息的。它是直接往 bus.bus 发送一个消息, 当然这个消息,会被所有的 client 接收到。
Bus service 会持续不断的 polling 后端的 bus.bus 实现的 /longpolling/poll 服务
这也是 在 浏览器的 network 持续看到 longpolling 日志的原因