rocketmq-client-nodejs
Version:
RocketMQ Node.js Client
94 lines • 7.56 kB
JavaScript
;
/**
* 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.LiteFifoConsumeService = void 0;
const ConsumeResult_1 = require("./ConsumeResult");
const FifoConsumeService_1 = require("./FifoConsumeService");
const Logger_1 = require("../client/Logger");
/**
* FIFO consume service for lite push consumer.
*
* <p>Similar to {@link FifoConsumeService}, but groups messages by lite topic
* instead of message group. This ensures messages with the same lite topic are
* consumed sequentially, while messages with different lite topics can be
* consumed in parallel when the accelerator is enabled.</p>
*
* <p>When the message listener returns {@link ConsumeResultSuspend}, all
* remaining messages with the same lite topic in the current batch are also
* suspended, while messages with different lite topics continue to be consumed.</p>
*/
class LiteFifoConsumeService extends FifoConsumeService_1.FifoConsumeService {
#logger;
constructor(clientId, messageListener, enableFifoConsumeAccelerator) {
super(clientId, messageListener, enableFifoConsumeAccelerator);
this.#logger = (0, Logger_1.getDefaultLogger)();
}
/**
* Use lite topic as the group key for FIFO consumption.
*
* @param messageView - The message view
* @return {string} The lite topic, empty string if not present
*/
getMessageGroupKey(messageView) {
return messageView.liteTopic || '';
}
consumeIteratively(pq, messageViews, startIndex) {
if (!pq || !messageViews) {
this.#logger.error('[Bug] Invalid arguments for consumeIteratively, pq=%s, messageViews=%s, clientId=%s', pq, messageViews, this.clientId);
return Promise.resolve();
}
const next = this.getNextValidMessage(pq, messageViews, startIndex);
if (!next) {
return Promise.resolve();
}
const { messageView, nextIndex } = next;
return this.consumeMessage(messageView)
.then(async (result) => {
await pq.eraseFifoMessage(messageView, result);
return result;
})
.then(async (result) => {
if (result instanceof ConsumeResult_1.ConsumeResultSuspend) {
const currentLiteTopic = messageView.liteTopic ?? '';
const continuation = [];
const suspendTasks = [];
// Suspend all messages with the same liteTopic in this batch.
for (let i = nextIndex; i < messageViews.length; i++) {
const msg = messageViews[i];
if ((msg.liteTopic ?? '') === currentLiteTopic) {
suspendTasks.push(pq.eraseFifoMessage(msg, result));
}
else {
continuation.push(msg);
}
}
this.#logger.debug?.('LiteFifoConsumeService suspend, liteTopic=%s, suspendCount=%d, continuationCount=%d, '
+ 'clientId=%s', currentLiteTopic, suspendTasks.length, continuation.length, this.clientId);
await Promise.all(suspendTasks);
return this.consumeIteratively(pq, continuation, 0);
}
return this.consumeIteratively(pq, messageViews, nextIndex);
})
.catch(err => {
this.#logger.error('[Bug] Exception raised in lite FIFO consumption callback, clientId=%s, error=%s', this.clientId, err);
return this.consumeIteratively(pq, messageViews, nextIndex);
});
}
}
exports.LiteFifoConsumeService = LiteFifoConsumeService;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGl0ZUZpZm9Db25zdW1lU2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25zdW1lci9MaXRlRmlmb0NvbnN1bWVTZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7OztBQUdILG1EQUF1RDtBQUN2RCw2REFBMEQ7QUFHMUQsNkNBQTZEO0FBRTdEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBYSxzQkFBdUIsU0FBUSx1Q0FBa0I7SUFDbkQsT0FBTyxDQUFVO0lBRTFCLFlBQVksUUFBZ0IsRUFBRSxlQUFnQyxFQUFFLDRCQUFzQztRQUNwRyxLQUFLLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSw0QkFBNEIsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBQSx5QkFBZ0IsR0FBRSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNPLGtCQUFrQixDQUFDLFdBQXdCO1FBQ25ELE9BQU8sV0FBVyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVTLGtCQUFrQixDQUFDLEVBQWdCLEVBQUUsWUFBMkIsRUFBRSxVQUFrQjtRQUM1RixJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDekIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMscUZBQXFGLEVBQ3RHLEVBQUUsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25DLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzNCLENBQUM7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDVixPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUMzQixDQUFDO1FBQ0QsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFeEMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLFdBQVcsQ0FBQzthQUNwQyxJQUFJLENBQUMsS0FBSyxFQUFDLE1BQU0sRUFBQyxFQUFFO1lBQ25CLE1BQU0sRUFBRSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUMvQyxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsS0FBSyxFQUFDLE1BQU0sRUFBQyxFQUFFO1lBQ25CLElBQUksTUFBTSxZQUFZLG9DQUFvQixFQUFFLENBQUM7Z0JBQzNDLE1BQU0sZ0JBQWdCLEdBQUcsV0FBVyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUM7Z0JBQ3JELE1BQU0sWUFBWSxHQUFrQixFQUFFLENBQUM7Z0JBQ3ZDLE1BQU0sWUFBWSxHQUF5QixFQUFFLENBQUM7Z0JBRTlDLDhEQUE4RDtnQkFDOUQsS0FBSyxJQUFJLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDckQsTUFBTSxHQUFHLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUM1QixJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxFQUFFLENBQUMsS0FBSyxnQkFBZ0IsRUFBRSxDQUFDO3dCQUMvQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztvQkFDdEQsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3pCLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLHVGQUF1RjtzQkFDeEcsYUFBYSxFQUFFLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBRTlGLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDaEMsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUM5RCxDQUFDLENBQUM7YUFDRCxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDWCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxpRkFBaUYsRUFDbEcsSUFBSSxDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUN0QixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsWUFBWSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlELENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNGO0FBbEVELHdEQWtFQyJ9