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 =newString(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.
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);