UNPKG

rocketmq-client-nodejs

Version:
115 lines 9.01 kB
"use strict"; /** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); exports.FifoConsumeService = void 0; const ConsumeService_1 = require("./ConsumeService"); const Logger_1 = require("../client/Logger"); class FifoConsumeService extends ConsumeService_1.ConsumeService { #enableFifoConsumeAccelerator; #logger; constructor(clientId, messageListener, enableFifoConsumeAccelerator) { super(clientId, messageListener); this.#enableFifoConsumeAccelerator = enableFifoConsumeAccelerator ?? false; this.#logger = (0, Logger_1.getDefaultLogger)(); } consume(pq, messageViews) { if (!pq || !messageViews) { this.#logger.error('[Bug] Invalid arguments for consume, pq=%s, messageViews=%s, clientId=%s', pq, messageViews, this.clientId); return; } if (!this.#enableFifoConsumeAccelerator || messageViews.length <= 1) { this.consumeIteratively(pq, messageViews, 0).catch(() => { // Error already logged, ignore }); return; } // Group messages by group key. Default to null-key group for unkeyed messages. const messageViewsGroupByGroupKey = new Map(); for (const messageView of messageViews) { const groupKey = this.getMessageGroupKey(messageView); let group = messageViewsGroupByGroupKey.get(groupKey); if (!group) { group = []; messageViewsGroupByGroupKey.set(groupKey, group); } group.push(messageView); } this.#logger.debug?.('FifoConsumeService parallel consume, messageViewsNum=%d, groupNum=%d', messageViews.length, messageViewsGroupByGroupKey.size); for (const list of messageViewsGroupByGroupKey.values()) { this.consumeIteratively(pq, list, 0).catch(() => { // Error already logged, ignore }); } } /** * Get the group key for the given message view. * Subclasses can override this method to provide different grouping logic. * * @param messageView - The message view * @return {string} The group key, empty string means no grouping */ getMessageGroupKey(messageView) { return messageView.messageGroup || ''; } /** * Consume messages iteratively using the provided message view array. * This method handles corrupted messages and continues processing the next valid message. * * @param pq - The process queue * @param messageViews - The message views to consume * @param startIndex - The index to start consuming from * @return {Promise<void>} Promise that resolves when all messages are consumed */ consumeIteratively(pq, messageViews, startIndex) { const next = this.getNextValidMessage(pq, messageViews, startIndex); if (!next) { return Promise.resolve(); } const { messageView, nextIndex } = next; return this.consumeMessage(messageView) .then(result => pq.eraseFifoMessage(messageView, result)) .then(() => this.consumeIteratively(pq, messageViews, nextIndex)) .catch(() => this.consumeIteratively(pq, messageViews, nextIndex)); } /** * Get the next valid message from the message view array. * Skip corrupted messages and return the first valid one. * Returns null if there are no more messages. * * @param pq - The process queue * @param messageViews - The message views * @param startIndex - The index to start searching from * @return {{ messageView: MessageView; nextIndex: number } | null} The next valid message and the index after it, or null */ getNextValidMessage(pq, messageViews, startIndex) { for (let i = startIndex; i < messageViews.length; i++) { const messageView = messageViews[i]; if (messageView.corrupted) { // Discard corrupted message. this.#logger.error('Message is corrupted for FIFO consumption, prepare to discard it, mq=%s, ' + 'messageId=%s, clientId=%s', pq.getMessageQueue(), messageView.messageId, this.clientId); pq.discardFifoMessage(messageView); continue; } return { messageView, nextIndex: i + 1 }; } return null; } } exports.FifoConsumeService = FifoConsumeService; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlmb0NvbnN1bWVTZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN1bWVyL0ZpZm9Db25zdW1lU2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHOzs7QUFHSCxxREFBa0Q7QUFHbEQsNkNBQTZEO0FBRTdELE1BQWEsa0JBQW1CLFNBQVEsK0JBQWM7SUFDM0MsNkJBQTZCLENBQVU7SUFDdkMsT0FBTyxDQUFVO0lBRTFCLFlBQVksUUFBZ0IsRUFBRSxlQUFnQyxFQUFFLDRCQUFzQztRQUNwRyxLQUFLLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyw2QkFBNkIsR0FBRyw0QkFBNEIsSUFBSSxLQUFLLENBQUM7UUFDM0UsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFBLHlCQUFnQixHQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVELE9BQU8sQ0FBQyxFQUFnQixFQUFFLFlBQTJCO1FBQ25ELElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQywwRUFBMEUsRUFDM0YsRUFBRSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbkMsT0FBTztRQUNULENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLDZCQUE2QixJQUFJLFlBQVksQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRTtnQkFDdEQsK0JBQStCO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTztRQUNULENBQUM7UUFFRCwrRUFBK0U7UUFDL0UsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FB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