/*! * nats-broker.cpp * * Copyright (c) 2015-2019, NADAL Jean-Baptiste. All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA * * @Author: NADAL Jean-Baptiste * @Date: 13/11/2019 * */ // This is an independent project of an individual developer. Dear PVS-Studio, please check it. // PVS-Studio Static Code Analyzer for C, C++, C#, and Java: http://www.viva64.com /*------------------------------- INCLUDES ----------------------------------*/ #include #include "nats-broker.h" #include #define kNatsServerURL "nats.nadal-fr.com" static void onMsg(natsConnection *nc, natsSubscription *sub, natsMsg *msg, void *closure) { printf("Received msg: %s - %.*s\n", natsMsg_GetSubject(msg), natsMsg_GetDataLength(msg), natsMsg_GetData(msg)); // Need to destroy the message! natsMsg_Destroy(msg); } /*! ---------------------------------------------------------------------------- * @fn NatsBroker * * @brief Constructor of the Nats Broker. */ NatsBroker::NatsBroker(void) : m_conn(NULL), m_opts(NULL), m_sub(NULL) { } /*! ---------------------------------------------------------------------------- * @fn ~NatsBroker * * @brief Destructor of the Nats. */ NatsBroker::~NatsBroker(void) { } /*! ---------------------------------------------------------------------------- * @fn setup * * @brief Setup the Broker. */ int NatsBroker::setup(uv_loop_t *an_evt_loop) { natsStatus the_status; nats_Open(-1); // One time initialization of things that we need. natsLibuv_Init(); // Libuv is not thread-safe. Almost all calls to libuv need to // occur from the thread where the loop is running. NATS library // may have to call into the event loop from different threads. // This call allows natsLibuv APIs to know if they are executing // from the event loop thread or not. natsLibuv_SetThreadLocalLoop(an_evt_loop); if (natsOptions_Create(&m_opts) != NATS_OK) return -1; if (natsOptions_UseGlobalMessageDelivery(m_opts, true) != NATS_OK) return -2; // Indicate which loop and callbacks to use once connected. if (natsOptions_SetEventLoop(m_opts, (void *)an_evt_loop, natsLibuv_Attach, natsLibuv_Read, natsLibuv_Write, natsLibuv_Detach) != NATS_OK) return -3; if (natsOptions_SetURL(m_opts, kNatsServerURL) != NATS_OK) return -4; return 0; } /*! ---------------------------------------------------------------------------- * @fn terminate * * @brief Terminate the Broker. */ int NatsBroker::terminate(void) { // Destroy all our objects to avoid report of memory leak if (m_sub != NULL) natsSubscription_Destroy(m_sub); if (m_conn != NULL) natsConnection_Destroy(m_conn); if (m_opts != NULL) natsOptions_Destroy(m_opts); return 0; } /*! ---------------------------------------------------------------------------- * @fn connect * * @brief Ccnnect to the Broker server. */ int NatsBroker::connect(void) { if (natsConnection_Connect(&m_conn, m_opts) != NATS_OK) return -1; if (natsConnection_Subscribe(&m_sub, m_conn, "foo", onMsg, NULL) != NATS_OK) return -2; // For maximum performance, set no limit on the number of pending messages. if (natsSubscription_SetPendingLimits(m_sub, -1, -1)!= NATS_OK) return -3; return 0; }