rocketmq-client-nodejs
Version:
RocketMQ Node.js Client
115 lines • 9.01 kB
JavaScript
"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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