/// /// Copyright © 2016-2022 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. /// import config from 'config'; import { _logger } from './config/logger'; import { HttpServer } from './api/httpServer'; import { IQueue } from './queue/queue.models'; import { KafkaTemplate } from './queue/kafkaTemplate'; import { PubSubTemplate } from './queue/pubSubTemplate'; import { AwsSqsTemplate } from './queue/awsSqsTemplate'; import { RabbitMqTemplate } from './queue/rabbitmqTemplate'; import { ServiceBusTemplate } from './queue/serviceBusTemplate'; const logger = _logger('main'); logger.info('===CONFIG BEGIN==='); logger.info(JSON.stringify(config, null, 4)); logger.info('===CONFIG END==='); const serviceType: string = config.get('queue_type'); const httpPort = Number(config.get('http_port')); let queues: IQueue | null; let httpServer: HttpServer | null; (async () => { logger.info('Starting ThingsBoard JavaScript Executor Microservice...'); try { queues = await createQueue(serviceType); logger.info(`Starting ${queues.name} template...`); await queues.init(); logger.info(`${queues.name} template started.`); httpServer = new HttpServer(httpPort); } catch (e: any) { logger.error('Failed to start ThingsBoard JavaScript Executor Microservice: %s', e.message); logger.error(e.stack); await exit(-1); } })(); async function createQueue(serviceType: string): Promise { switch (serviceType) { case 'kafka': return new KafkaTemplate(); case 'pubsub': return new PubSubTemplate(); case 'aws-sqs': return new AwsSqsTemplate(); case 'rabbitmq': return new RabbitMqTemplate(); case 'service-bus': return new ServiceBusTemplate(); default: throw new Error('Unknown service type: ' + serviceType); } } [`SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`, `SIGTERM`].forEach((eventType) => { process.on(eventType, async () => { logger.info(`${eventType} signal received`); await exit(0); }) }) process.on('exit', (code: number) => { logger.info(`ThingsBoard JavaScript Executor Microservice has been stopped. Exit code: ${code}.`); }); async function exit(status: number) { logger.info('Exiting with status: %d ...', status); if (httpServer) { const _httpServer = httpServer; httpServer = null; await _httpServer.stop(); } if (queues) { const _queues = queues; queues = null; await _queues.destroy(); } process.exit(status); }