7 changed files with 152 additions and 102 deletions
@ -0,0 +1,117 @@ |
|||||
|
/* |
||||
|
* Copyright © 2016-2020 The Thingsboard Authors |
||||
|
* |
||||
|
* Licensed 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. |
||||
|
*/ |
||||
|
const { logLevel, Kafka } = require('kafkajs'); |
||||
|
|
||||
|
const config = require('config'), |
||||
|
JsInvokeMessageProcessor = require('../../api/jsInvokeMessageProcessor'), |
||||
|
logger = require('../../config/logger')._logger('main'), |
||||
|
KafkaJsWinstonLogCreator = require('../../config/logger').KafkaJsWinstonLogCreator; |
||||
|
|
||||
|
var kafkaClient; |
||||
|
var consumer; |
||||
|
var producer; |
||||
|
|
||||
|
function KafkaProducer() { |
||||
|
this.send = async (responseTopic, scriptId, rawResponse, headers) => { |
||||
|
return producer.send( |
||||
|
{ |
||||
|
topic: responseTopic, |
||||
|
messages: [ |
||||
|
{ |
||||
|
key: scriptId, |
||||
|
value: rawResponse, |
||||
|
headers: headers |
||||
|
} |
||||
|
] |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
(async() => { |
||||
|
try { |
||||
|
logger.info('Starting ThingsBoard JavaScript Executor Microservice...'); |
||||
|
|
||||
|
const kafkaBootstrapServers = config.get('kafka.bootstrap.servers'); |
||||
|
const kafkaRequestTopic = config.get('kafka.request_topic'); |
||||
|
|
||||
|
logger.info('Kafka Bootstrap Servers: %s', kafkaBootstrapServers); |
||||
|
logger.info('Kafka Requests Topic: %s', kafkaRequestTopic); |
||||
|
|
||||
|
kafkaClient = new Kafka({ |
||||
|
brokers: kafkaBootstrapServers.split(','), |
||||
|
logLevel: logLevel.INFO, |
||||
|
logCreator: KafkaJsWinstonLogCreator |
||||
|
}); |
||||
|
|
||||
|
consumer = kafkaClient.consumer({ groupId: 'js-executor-group' }); |
||||
|
producer = kafkaClient.producer(); |
||||
|
const messageProcessor = new JsInvokeMessageProcessor(new KafkaProducer()); |
||||
|
await consumer.connect(); |
||||
|
await producer.connect(); |
||||
|
await consumer.subscribe({ topic: kafkaRequestTopic}); |
||||
|
|
||||
|
logger.info('Started ThingsBoard JavaScript Executor Microservice.'); |
||||
|
await consumer.run({ |
||||
|
eachMessage: async ({ topic, partition, message }) => { |
||||
|
messageProcessor.onJsInvokeMessage(message); |
||||
|
}, |
||||
|
}); |
||||
|
|
||||
|
} catch (e) { |
||||
|
logger.error('Failed to start ThingsBoard JavaScript Executor Microservice: %s', e.message); |
||||
|
logger.error(e.stack); |
||||
|
exit(-1); |
||||
|
} |
||||
|
})(); |
||||
|
|
||||
|
process.on('exit', () => { |
||||
|
exit(0); |
||||
|
}); |
||||
|
|
||||
|
async function exit(status) { |
||||
|
logger.info('Exiting with status: %d ...', status); |
||||
|
if (consumer) { |
||||
|
logger.info('Stopping Kafka Consumer...'); |
||||
|
var _consumer = consumer; |
||||
|
consumer = null; |
||||
|
try { |
||||
|
await _consumer.disconnect(); |
||||
|
logger.info('Kafka Consumer stopped.'); |
||||
|
await disconnectProducer(); |
||||
|
process.exit(status); |
||||
|
} catch (e) { |
||||
|
logger.info('Kafka Consumer stop error.'); |
||||
|
await disconnectProducer(); |
||||
|
process.exit(status); |
||||
|
} |
||||
|
} else { |
||||
|
process.exit(status); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
async function disconnectProducer() { |
||||
|
if (producer) { |
||||
|
logger.info('Stopping Kafka Producer...'); |
||||
|
var _producer = producer; |
||||
|
producer = null; |
||||
|
try { |
||||
|
await _producer.disconnect(); |
||||
|
logger.info('Kafka Producer stopped.'); |
||||
|
} catch (e) { |
||||
|
logger.info('Kafka Producer stop error.'); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue