UNPKG

@ones-op/node-host

Version:
114 lines (113 loc) 4.14 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MessageQueue = void 0; const config_1 = require("../config"); const logger_1 = require("../logger"); const protocol_1 = require("../protocol"); const api_1 = require("@opentelemetry/api"); const zeromq_1 = require("zeromq"); const message_pool_1 = require("./message-pool"); class MessageQueue { constructor(address, receiveTimeout) { this.dealer = new zeromq_1.Dealer({ receiveTimeout: receiveTimeout, }); this.dealer.events.on('connect', () => { this.connected = true; logger_1.logger.debug(`Platform MessageQueue connected`); }); this.dealer.events.on('disconnect', () => { this.connected = false; logger_1.logger.debug(`Platform MessageQueue disconnected`); }); this.address = address; this.sendLoopSign = true; this.loopSign = true; this.connected = false; this.tracer = api_1.trace.getTracer('message-queue', '1.0.0'); } async start() { if (this.messageHandler == undefined) { throw new Error('messageHandler is not assigned'); } this.dealer.routingId = config_1.config.host.id; this.dealer.probeRouter = true; this.dealer.connect(this.address); this.loopReceive(); this.loopSend(); } AssignMessageHandler(messageHandler) { this.messageHandler = messageHandler; } async sendMessage(message) { message_pool_1.SendMessagePool.push(message); if (!this.sendLoopSign) { this.sendLoopSign = true; this.loopSend(); } } async loopSend() { while (this.sendLoopSign) { if (!this.connected) { this.sendLoopSign = false; return; } const message = message_pool_1.SendMessagePool.shift(); if (message == undefined) { this.sendLoopSign = false; return; } try { const buff = protocol_1.protocol.PlatformMessage.encode(message).finish(); await this.send(buff); logger_1.logger.debug(`SeqNo:[${message.Header?.SeqNo}] send success`); } catch (error) { logger_1.logger.info(`Platform MessageQueue send error:`, error); } } } async loopReceive() { while (this.loopSign) { let platformMessage; try { const [msg] = await this.dealer.receive(); platformMessage = protocol_1.protocol.PlatformMessage.decode(msg); logger_1.logger.debug(`SeqNo:[${platformMessage.Header?.SeqNo}] receive success`); } catch { logger_1.logger.debug(`MessageQueue no message`); } if (platformMessage) { const activeContext = api_1.propagation.extract(api_1.context.active(), platformMessage.Header?.Headers || {}); const message = platformMessage; this.tracer.startActiveSpan('message-queue', { attributes: { 'message-queue.seqno': platformMessage.Header?.SeqNo?.toString() ?? '', }, }, activeContext, (span) => { try { this.messageHandler.onMessage(message); } catch (error) { span.setStatus({ code: api_1.SpanStatusCode.ERROR, message: String(error) }); throw error; } finally { span.end(); } }); } } } async send(byteArray) { try { return await this.dealer.send(byteArray); } catch (error) { // 发送失败不处理 logger_1.logger.error('Platform zeromq send err', error); } } } exports.MessageQueue = MessageQueue;