Synchronous subscriptions require the application to wait for messages. This type of subscription is easy to set-up and use, but requires the application to deal with looping if multiple messages are expected. For situations where a single message is expected, synchronous subscriptions are sometimes easier to manage, depending on the language.
For example, to subscribe to the subject updates
and receive a single message you could do:
nc, err := nats.Connect("demo.nats.io")if err != nil {log.Fatal(err)}defer nc.Close()​// Subscribesub, err := nc.SubscribeSync("updates")if err != nil {log.Fatal(err)}​// Wait for a messagemsg, err := sub.NextMsg(10 * time.Second)if err != nil {log.Fatal(err)}​// Use the responselog.Printf("Reply: %s", msg.Data)
Connection nc = Nats.connect("nats://demo.nats.io:4222");​// SubscribeSubscription sub = nc.subscribe("updates");​// Read a messageMessage msg = sub.nextMessage(Duration.ZERO);​String str = new String(msg.getData(), StandardCharsets.UTF_8);System.out.println(str);​// Close the connectionnc.close();
// node-nats subscriptions are always async.
# Asyncio NATS client currently does not have a sync subscribe API
# The Ruby NATS client subscriptions are all async.
/ Typescript NATS subscriptions are always async.
natsConnection *conn = NULL;natsSubscription *sub = NULL;natsMsg *msg = NULL;natsStatus s = NATS_OK;​s = natsConnection_ConnectTo(&conn, NATS_DEFAULT_URL);​// Subscribeif (s == NATS_OK)s = natsConnection_SubscribeSync(&sub, conn, "updates");​// Wait for messagesif (s == NATS_OK)s = natsSubscription_NextMsg(&msg, sub, 10000);​if (s == NATS_OK){printf("Received msg: %s - %.*s\n",natsMsg_GetSubject(msg),natsMsg_GetDataLength(msg),natsMsg_GetData(msg));​// Destroy message that was receivednatsMsg_Destroy(msg);}​(...)​// Destroy objects that were creatednatsSubscription_Destroy(sub);natsConnection_Destroy(conn);