node-red-contrib-kafka-node
Version:
Node-RED nodes of HighLevel Kafka Producer and Consumer
134 lines (114 loc) • 3.84 kB
JavaScript
/**
* Created by fwang1 on 3/25/15.
*/
module.exports = function(RED) {
/*
* Kafka Producer
* Parameters:
- topics
- zkquorum(example: zkquorum = “[host]:2181")
*/
function kafkaNode(config) {
RED.nodes.createNode(this,config);
var topic = config.topic;
var clusterZookeeper = config.zkquorum;
var debug = (config.debug == "debug");
var node = this;
var kafka = require('kafka-node');
var HighLevelProducer = kafka.HighLevelProducer;
var Client = kafka.Client;
var topics = config.topics;
var client = new Client(clusterZookeeper);
try {
this.on("input", function(msg) {
var payloads = [];
// check if multiple topics
if (topics.indexOf(",") > -1){
var topicArry = topics.split(',');
for (i = 0; i < topicArry.length; i++) {
payloads.push({topic: topicArry[i], messages: msg.payload});
}
}
else {
payloads = [{topic: topics, messages: msg.payload}];
}
producer.send(payloads, function(err, data){
if (err){
node.error(err);
}
node.log("Message Sent: " + data);
});
});
}
catch(e) {
node.error(e);
}
var producer = new HighLevelProducer(client);
this.status({fill:"green",shape:"dot",text:"connected to "+clusterZookeeper});
}
RED.nodes.registerType("kafka",kafkaNode);
/*
* Kafka Consumer
* Parameters:
- topics
- groupId
- zkquorum(example: zkquorum = “[host]:2181")
*/
function kafkaInNode(config) {
RED.nodes.createNode(this,config);
var node = this;
var kafka = require('kafka-node');
var HighLevelConsumer = kafka.HighLevelConsumer;
var Client = kafka.Client;
var topics = String(config.topics);
var clusterZookeeper = config.zkquorum;
var groupId = config.groupId;
var debug = (config.debug == "debug");
var client = new Client(clusterZookeeper);
var topicJSONArry = [];
// check if multiple topics
if (topics.indexOf(",") > -1){
var topicArry = topics.split(',');
if (debug) {
console.log(topicArry)
console.log(topicArry.length);
}
for (i = 0; i < topicArry.length; i++) {
if (debug) {
console.log(topicArry[i]);
}
topicJSONArry.push({topic: topicArry[i]});
}
topics = topicJSONArry;
}
else {
topics = [{topic:topics}];
}
var options = {
groupId: groupId,
autoCommit: config.autoCommit,
autoCommitMsgCount: 10
};
try {
var consumer = new HighLevelConsumer(client, topics, options);
this.log("Consumer created...");
this.status({fill:"green",shape:"dot",text:"connected to "+clusterZookeeper});
consumer.on('message', function (message) {
if (debug) {
console.log(message);
node.log(message);
}
var msg = {payload: message};
node.send(msg);
});
consumer.on('error', function (err) {
console.error(err);
});
}
catch(e){
node.error(e);
return;
}
}
RED.nodes.registerType("kafka in", kafkaInNode);
};