rocketmq-client-nodejs
Version:
RocketMQ Node.js Client
112 lines • 9.8 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.SimpleConsumer = void 0;
const definition_pb_1 = require("../../proto/apache/rocketmq/v2/definition_pb");
const service_pb_1 = require("../../proto/apache/rocketmq/v2/service_pb");
const util_1 = require("../util");
const FilterExpression_1 = require("./FilterExpression");
const SimpleSubscriptionSettings_1 = require("./SimpleSubscriptionSettings");
const SubscriptionLoadBalancer_1 = require("./SubscriptionLoadBalancer");
const Consumer_1 = require("./Consumer");
class SimpleConsumer extends Consumer_1.Consumer {
#simpleSubscriptionSettings;
#subscriptionExpressions = new Map();
#subscriptionRouteDataCache = new Map();
#awaitDuration;
#topicIndex = 0;
constructor(options) {
options.topics = Array.from(options.subscriptions.keys());
super(options);
for (const [topic, filter] of options.subscriptions.entries()) {
if (typeof filter === 'string') {
// filter is tag string
this.#subscriptionExpressions.set(topic, new FilterExpression_1.FilterExpression(filter));
}
else {
this.#subscriptionExpressions.set(topic, filter);
}
}
this.#awaitDuration = options.awaitDuration ?? 30000;
this.#simpleSubscriptionSettings = new SimpleSubscriptionSettings_1.SimpleSubscriptionSettings(options.namespace, this.clientId, this.endpoints, this.consumerGroup, this.requestTimeout, this.#awaitDuration, this.#subscriptionExpressions);
}
getSettings() {
return this.#simpleSubscriptionSettings;
}
wrapHeartbeatRequest() {
return new service_pb_1.HeartbeatRequest()
.setClientType(definition_pb_1.ClientType.SIMPLE_CONSUMER)
.setGroup((0, util_1.createResource)(this.consumerGroup));
}
wrapNotifyClientTerminationRequest() {
return new service_pb_1.NotifyClientTerminationRequest()
.setGroup((0, util_1.createResource)(this.consumerGroup));
}
onTopicRouteDataUpdate(topic, topicRouteData) {
this.#updateSubscriptionLoadBalancer(topic, topicRouteData);
}
#updateSubscriptionLoadBalancer(topic, topicRouteData) {
let subscriptionLoadBalancer = this.#subscriptionRouteDataCache.get(topic);
if (!subscriptionLoadBalancer) {
subscriptionLoadBalancer = new SubscriptionLoadBalancer_1.SubscriptionLoadBalancer(topicRouteData);
}
else {
subscriptionLoadBalancer = subscriptionLoadBalancer.update(topicRouteData);
}
this.#subscriptionRouteDataCache.set(topic, subscriptionLoadBalancer);
return subscriptionLoadBalancer;
}
async #getSubscriptionLoadBalancer(topic) {
let loadBalancer = this.#subscriptionRouteDataCache.get(topic);
if (!loadBalancer) {
const topicRouteData = await this.getRouteData(topic);
loadBalancer = this.#updateSubscriptionLoadBalancer(topic, topicRouteData);
}
return loadBalancer;
}
async subscribe(topic, filterExpression) {
await this.getRouteData(topic);
this.#subscriptionExpressions.set(topic, filterExpression);
}
unsubscribe(topic) {
this.#subscriptionExpressions.delete(topic);
}
async receive(maxMessageNum = 10, invisibleDuration = 15000) {
const topic = this.#nextTopic();
const filterExpression = this.#subscriptionExpressions.get(topic);
const loadBalancer = await this.#getSubscriptionLoadBalancer(topic);
const mq = loadBalancer.takeMessageQueue();
const request = this.wrapReceiveMessageRequest(maxMessageNum, mq, filterExpression, invisibleDuration, this.#awaitDuration);
return await this.receiveMessage(request, mq, this.#awaitDuration);
}
async ack(message) {
await this.ackMessage(message);
}
async changeInvisibleDuration0(message, invisibleDuration) {
await this.changeInvisibleDuration0(message, invisibleDuration);
}
#nextTopic() {
const topics = Array.from(this.#subscriptionExpressions.keys());
if (this.#topicIndex >= topics.length) {
this.#topicIndex = 0;
}
return topics[this.#topicIndex++];
}
}
exports.SimpleConsumer = SimpleConsumer;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2ltcGxlQ29uc3VtZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3VtZXIvU2ltcGxlQ29uc3VtZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRzs7O0FBRUgsZ0ZBQTBFO0FBQzFFLDBFQUE2RztBQUc3RyxrQ0FBeUM7QUFDekMseURBQXNEO0FBQ3RELDZFQUEwRTtBQUMxRSx5RUFBc0U7QUFDdEUseUNBQXVEO0FBa0J2RCxNQUFhLGNBQWUsU0FBUSxtQkFBUTtJQUNqQywyQkFBMkIsQ0FBNkI7SUFDeEQsd0JBQXdCLEdBQUcsSUFBSSxHQUFHLEVBQTRCLENBQUM7SUFDL0QsMkJBQTJCLEdBQUcsSUFBSSxHQUFHLEVBQW9DLENBQUM7SUFDMUUsY0FBYyxDQUFTO0lBQ2hDLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFFaEIsWUFBWSxPQUE4QjtRQUN4QyxPQUFPLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzFELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLEtBQUssTUFBTSxDQUFFLEtBQUssRUFBRSxNQUFNLENBQUUsSUFBSSxPQUFPLENBQUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUM7WUFDaEUsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDL0IsdUJBQXVCO2dCQUN2QixJQUFJLENBQUMsd0JBQXdCLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLG1DQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7WUFDekUsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ25ELENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGNBQWMs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