Skip to content

Commit 610c94c

Browse files
committed
Test conflicts of messageRoutingMode and messageRouter
1 parent 47d45f2 commit 610c94c

2 files changed

Lines changed: 32 additions & 5 deletions

File tree

src/ProducerConfig.cc

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,10 @@ ProducerConfig::ProducerConfig(const Napi::Object& producerConfig) : topic("") {
157157
pulsar_producer_configuration_set_block_if_queue_full(this->cProducerConfig.get(), blockIfQueueFull);
158158
}
159159

160+
bool useCustomPartition = false;
160161
if (producerConfig.Has(CFG_ROUTING_MODE) && producerConfig.Get(CFG_ROUTING_MODE).IsString()) {
161162
std::string messageRoutingMode = producerConfig.Get(CFG_ROUTING_MODE).ToString().Utf8Value();
163+
useCustomPartition = (messageRoutingMode == "CustomPartition");
162164
if (MESSAGE_ROUTING_MODE.count(messageRoutingMode))
163165
pulsar_producer_configuration_set_partitions_routing_mode(this->cProducerConfig.get(),
164166
MESSAGE_ROUTING_MODE.at(messageRoutingMode));
@@ -251,15 +253,12 @@ ProducerConfig::ProducerConfig(const Napi::Object& producerConfig) : topic("") {
251253
this->cProducerConfig.get()->conf.setBatchingType(PRODUCER_BATCHING_TYPE.at(batchingType));
252254
}
253255

254-
if (producerConfig.Has(CFG_MESSAGE_ROUTER)) {
256+
if (useCustomPartition && producerConfig.Has(CFG_MESSAGE_ROUTER)) {
255257
auto value = producerConfig.Get(CFG_MESSAGE_ROUTER);
256258
if (value.IsFunction()) {
257259
messageRouter = Napi::Persistent(value.As<Napi::Function>());
258260
pulsar_producer_configuration_set_message_router(this->cProducerConfig.get(), choosePartition,
259261
&messageRouter);
260-
} else {
261-
Napi::TypeError::New(producerConfig.Env(), "messageRouter should be a function")
262-
.ThrowAsJavaScriptException();
263262
}
264263
}
265264
}

tests/producer.test.js

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@
2020
const Pulsar = require('../index');
2121
const httpUtils = require('./http_utils');
2222

23+
function getPartition(msgId) {
24+
// The message id string is in the format of "entryId,ledgerId,partition,batchIndex"
25+
return Number(msgId.toString().split(',')[2]);
26+
}
27+
2328
(() => {
2429
describe('Producer', () => {
2530
let client;
@@ -187,7 +192,7 @@ const httpUtils = require('./http_utils');
187192
console.log(`All messages have been sent. IDs: ${allMsgIds.join(', ')}`);
188193
for (let i = 0; i < allMsgIds.length; i += 1) {
189194
// The message id string is in the format of "entryId,ledgerId,partition,batchIndex"
190-
const partition = Number(allMsgIds[i].toString().split(',')[2]);
195+
const partition = getPartition(allMsgIds[i]);
191196
expect(i % numPartitions).toBe(partition);
192197
}
193198
} catch (error) {
@@ -210,6 +215,29 @@ const httpUtils = require('./http_utils');
210215
producer.send({ data: Buffer.from('test') }),
211216
).rejects.toThrow('Failed to send message: UnknownError');
212217
}, 30000);
218+
test('Not CustomPartition', async () => {
219+
const topic = `test-not-custom-part-${Date.now()}`;
220+
const numPartitions = 2;
221+
const response = await httpUtils.createPartitionedTopic(topic, numPartitions);
222+
expect(response.statusCode).toBe(204);
223+
224+
let index = 0;
225+
const producer = await client.createProducer({
226+
topic,
227+
messageRouter: (_, topicMetadata) => {
228+
const result = index % topicMetadata.numPartitions;
229+
index += 1;
230+
return result;
231+
},
232+
messageRoutingMode: 'UseSinglePartition',
233+
});
234+
const partitions = new Set();
235+
for (let i = 0; i < 10; i += 1) {
236+
const msgId = await producer.send({ data: Buffer.from('msg') });
237+
partitions.add(getPartition(msgId));
238+
}
239+
expect(partitions.size).toBe(1);
240+
}, 30000);
213241
});
214242
});
215243
})();

0 commit comments

Comments
 (0)