Notice
Recent Posts
Recent Comments
Link
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Archives
Today
Total
관리 메뉴

Code Habit

[c++] Nats Client 본문

카테고리 없음

[c++] Nats Client

코드베어 2024. 2. 4. 12:12

Nats는 오픈소스 메시징 시스템을 지원하는 서비스의 한 종류로 다양한 응용프로그램 간의 효율적인 통신을 지원한다. 기본적으로 publisher와 subscriber로 구성되어 있으며 다양한 프로그래밍 언어에 대한 클라이언트 라이브러리를 제공하므로 다양한 언어로 작성된 애플리케이션 간의 통신을 할 수 있다. 

 

c++로 작성된 client 예제이다.

#include <iostream>
#include <nats/nats.h>

void messageHandler(natsConnection* conn, natsSubscription* sub, natsMsg* msg, void* closure)
{
    // get data
    const char* data = natsMsg_GetData(msg);
    int dataLen = natsMsg_GetDataLength(msg);

    // print data
    std::cout << "Received message: " << std::string(data, dataLen) << std::endl;

    // free msg
    natsMsg_Destroy(msg);
}

int main() 
{
    natsConnection* conn = NULL;
    natsOptions* opts = NULL;
    natsSubscription* subscription = NULL;
    natsMsg* msg = NULL;
    natsStatus status;

    // create opt
    status = natsOptions_Create(&opts);
    if (status != NATS_OK) {
        std::cerr << "Error creating NATS options : " << natsStatus_GetText(status) << std::endl;
        return 1;
    }

    // set servers to opt
    const char* servers[] = {"nats://server1:4222", "nats://servers:4222"};
    status = natsOptions_SetServers(opts, servers, 2);
    if (status != NATS_OK) {
        std::cerr << "Error setting NATS Server URLs : " << natsStatus_GetText(status) << std::endl;
        natsOptions_Destroy(opts);
        return 1;
    }

    // connect nats server
    status = natsConnection_Connect(&conn, opts);
    if (status != NATS_OK) {
        std::cerr << "Error connecting to NATS Server : " << natsStatus_GetText(status) << std::endl;
        natsOptions_Destory(opts);
        return 1;
    }

    // subscribe for get message
    const char* subject = "example_subject";
    status = natsConnection_Subscribe(&subscription, conn, subject, messageHandler, NULL);
    if (status != NATS_OK) {
        std::cerr << "Error subscribing to subject : " << natsStatus_GetText(status) << std::endl;
        natsConnection_Destroy(conn);
        natsOptions_Destroy(opts);
        return 1;
    }

    // create message object
    const char* subject = "example_subject";
    const char* message = "Hello,";
    status = natsMsg_Create(&msg, subject, NULL, (const void*)mmessage, stelen(message));
    if (status != NATS_OK) {
        std::cerr << "Error Creating NATS message : " << natsStatus_GetText(status) << std::endl;
    } else {
        // publish message
        status = natsConnection_PublishMsg(conn, msg);
        if (status != NATS_OK) {
            std::cerr << "Error publishing message : "
        }

        natsMsg_Destroy(msg);
    }

    // free
    natsSubscription_Destory(subscription);
    natsConnection_Destroy(conn);
    natsOptions_Destroy(opts);

    return 0;
}

publisher가 특정 subject 메시지를 송신하면 해당 subject를 구독하는 subscriber들이 이를 수신하게 된다.