odoo 将 longpolling 切换为 web socket,从此 odoo 具备了高效的双向通信能力
websocket 用在odoo web client的消息通知, 例如在 discuss 里面能接收到消息提醒,typing提示
服务端是 通过 http:// odoo.web.url/ websocket 提供的 endpoint,在 websocket 客户端连接上时,将协议升级为 WS ; 所以要使用 websocket 必须在 odoo 的前面增加一个 nginx 来处理 协议升级。 同时,还需要 将workers 参数设置为 大于0 ,这样才会启动 websocket 使用的单独进程
而客户端 则是在浏览器使用 service worker来单独启动一个线程,然后在此线程 加载 websocket client;它是通过 http:// odoo.web.url/ bus/websocket_worker_bundle 提供的。
odoo webclient 将消息通知的功能 封装在 bus_service 里面,因此 通过 bus_serivice 即可操作 websocket ; 它提供了一个核心方法来订阅 websocket
/**
* Subscribe to a single notification type.
*
* @param {string} notificationType
* @param {function} callback
*/
subscribe(notificationType, callback)
notificationType 是 消息类型; callback 则是对 返回的消息的处理函数/方法
odoo 后端给 websocket 发送消息时,使用 方法
@api.model
def _sendone(self, channel, notification_type, message)
这里的 notification_type 就是 客户端 订阅的 通知类型
技术架构