rocketmq-client-nodejs
Version:
RocketMQ Node.js Client
222 lines • 13 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.LitePushConsumerImpl = void 0;
const definition_pb_1 = require("../../proto/apache/rocketmq/v2/definition_pb");
const Resource_1 = require("../route/Resource");
const PushConsumer_1 = require("./PushConsumer");
const LiteSubscriptionManager_1 = require("./LiteSubscriptionManager");
const FilterExpression_1 = require("./FilterExpression");
const LiteFifoConsumeService_1 = require("./LiteFifoConsumeService");
const LiteStandardConsumeService_1 = require("./LiteStandardConsumeService");
/**
* Implementation of LitePushConsumer.
*
* <p>LitePushConsumer extends PushConsumer to provide lightweight message consumption
* with reduced metadata and storage overhead. It supports dynamic subscription
* management for lite topics.</p>
*
* <p>Key features:</p>
* <ul>
* <li>Dynamic lite topic subscription/unsubscription</li>
* <li>Quota management for lite subscriptions</li>
* <li>Reduced resource consumption compared to standard PushConsumer</li>
* <li>Automatic synchronization with server settings</li>
* </ul>
*
* <p>Note: Unlike LiteSimpleConsumer, LitePushConsumer does not perform route optimization
* because it uses the assignment-based message delivery mechanism managed by the server.</p>
*/
class LitePushConsumerImpl extends PushConsumer_1.PushConsumer {
liteSubscriptionManager;
bindTopic;
#messageListener;
#enableFifoConsumeAccelerator;
constructor(options) {
// Create subscription expressions with bind topic
const subscriptions = new Map();
subscriptions.set(options.bindTopic, FilterExpression_1.FilterExpression.SUB_ALL);
super({
...options,
subscriptions,
});
this.#messageListener = options.messageListener;
this.#enableFifoConsumeAccelerator = options.enableFifoConsumeAccelerator ?? false;
this.bindTopic = new Resource_1.Resource(options.namespace, options.bindTopic);
const groupResource = new Resource_1.Resource(options.namespace, options.consumerGroup);
this.liteSubscriptionManager = new LiteSubscriptionManager_1.LiteSubscriptionManager(this, this.bindTopic, groupResource);
}
/**
* Create the consume service for lite push consumer.
*
* <p>Lite push consumer uses lite-topic-specific consume services to ensure
* correct grouping and retry behavior.</p>
*/
createConsumeService() {
if (!this.#messageListener) {
throw new Error('messageListener should not be null');
}
if (this.getPushConsumerSettings().isFifo()) {
this.logger.info('Create lite FIFO consume service, consumerGroup=%s, clientId=%s, enableFifoConsumeAccelerator=%s', this.consumerGroup, this.clientId, this.#enableFifoConsumeAccelerator);
return new LiteFifoConsumeService_1.LiteFifoConsumeService(this.clientId, this.#messageListener, this.#enableFifoConsumeAccelerator);
}
this.logger.info('Create lite standard consume service, consumerGroup=%s, clientId=%s', this.consumerGroup, this.clientId);
return new LiteStandardConsumeService_1.LiteStandardConsumeService(this.clientId, this.#messageListener);
}
/**
* Get the client type.
*
* @return The client type identifier for lite push consumer
*/
getClientType() {
return definition_pb_1.ClientType.LITE_PUSH_CONSUMER;
}
/**
* Override to disable standard assignment scanning for lite consumers.
* LitePushConsumer uses Lite Subscription mechanism instead of assignments.
*/
// eslint-disable-next-line @typescript-eslint/no-unused-vars
onTopicRouteDataUpdate(_topic, _topicRouteData) {
// Lite consumers do not use standard assignment mechanism
// They rely on LiteSubscriptionManager for message delivery
}
/**
* Start up the consumer.
*
* <p>This method initializes the consumer and starts the lite subscription manager.
* It must be called before the consumer can receive messages.</p>
*/
async startup() {
await super.startup();
this.liteSubscriptionManager.startUp();
}
/**
* Shutdown the consumer.
*
* <p>This method gracefully shuts down the consumer, releasing all resources
* and stopping the lite subscription manager.</p>
*/
async shutdown() {
this.liteSubscriptionManager.shutdown();
await super.shutdown();
}
async subscribeLite(liteTopic, offsetOption) {
if (!liteTopic || liteTopic.trim().length === 0) {
throw new Error('liteTopic should not be blank');
}
await this.liteSubscriptionManager.subscribeLite(liteTopic, offsetOption ?? null);
}
/**
* Unsubscribe from a lite topic.
*
* <p>This method removes the subscription and notifies the server.
* After unsubscribing, the consumer will no longer receive messages from this topic.</p>
*
* @param liteTopic - The name of the lite topic to unsubscribe from
*/
async unsubscribeLite(liteTopic) {
if (!liteTopic || liteTopic.trim().length === 0) {
throw new Error('liteTopic should not be blank');
}
await this.liteSubscriptionManager.unsubscribeLite(liteTopic);
}
/**
* Get the lite topic set.
*
* <p>Returns an immutable set of currently subscribed lite topics.
* This set reflects the current state of subscriptions managed by the lite subscription manager.</p>
*
* @return Set of lite topic names
*/
getLiteTopicSet() {
return this.liteSubscriptionManager.getLiteTopicSet();
}
/**
* Get the load balancing group for the consumer.
*
* <p>The consumer group is used for load balancing across multiple consumer instances.
* All consumers in the same group will share the message load.</p>
*
* @return Consumer group name
*/
getConsumerGroup() {
return this.liteSubscriptionManager.getConsumerGroupName();
}
/**
* Handle notify unsubscribe lite command from server.
*
* <p>This method is called when the server sends a notification to unsubscribe
* from a lite topic, typically due to quota violations or administrative actions.</p>
*
* @param command - The unsubscribe command from the server
*/
onNotifyUnsubscribeLiteCommand(command) {
this.liteSubscriptionManager.onNotifyUnsubscribeLiteCommand(command);
}
/**
* Handle settings command from server.
*
* <p>This method processes configuration updates from the server and synchronizes
* the lite subscription manager with the latest settings.</p>
*
* @param endpoints - The server endpoints
* @param settings - The settings configuration
*/
onSettingsCommand(endpoints, settings) {
super.onSettingsCommand(endpoints, settings);
this.liteSubscriptionManager.sync(settings);
}
/**
* Close the consumer.
*/
async close() {
await this.shutdown();
}
/**
* Get the logger.
*/
getLogger() {
return this.logger;
}
/**
* Get the RPC client manager (protected access for internal use).
*
* @internal
*/
getRpcClientManager() {
return this.rpcClientManager;
}
/**
* Get the endpoints (protected access for internal use).
*
* @internal
*/
getEndpoints() {
return this.endpoints;
}
/**
* Get the request timeout (protected access for internal use).
*
* @internal
*/
getRequestTimeout() {
return this.requestTimeout;
}
}
exports.LitePushConsumerImpl = LitePushConsumerImpl;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGl0ZVB1c2hDb25zdW1lckltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3VtZXIvTGl0ZVB1c2hDb25zdW1lckltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRzs7O0FBRUgsZ0ZBQTBFO0FBRTFFLGdEQUE2QztBQUU3QyxpREFBbUU7QUFHbkUsdUVBQW9FO0FBQ3BFLHlEQUFzRDtBQUN0RCxxRUFBa0U7QUFDbEUsNkVBQTBFO0FBUTFFOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQWEsb0JBQXFCLFNBQVEsMkJBQVk7SUFDbkMsdUJBQXVCLENBQTBCO0lBQ2pELFNBQVMsQ0FBVztJQUM1QixnQkFBZ0IsQ0FBa0I7SUFDbEMsNkJBQTZCLENBQVU7SUFFaEQsWUFBWSxPQUFnQztRQUMxQyxrREFBa0Q7UUFDbEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7UUFDMUQsYUFBYSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLG1DQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRS9ELEtBQUssQ0FBQztZQUNKLEdBQUcsT0FBTztZQUNWLGFBQWE7U0FDUyxDQUFDLENBQUM7UUFFMUIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUM7UUFDaEQsSUFBSSxDQUFDLDZCQUE2QixHQUFHLE9BQU8sQ0FBQyw0QkFBNEIsSUFBSSxLQUFLLENBQUM7UUFFbkYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLG1CQUFRLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFcEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxtQkFBUSxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzdFLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLGlE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