Asynchronous subscriptions use callbacks of some form to notify an application when a message arrives. These subscriptions are usually easier to work with, but do represent some form of internal work and resource usage, i.e. threads, by the library. Check your library's documentation for any resource usage associated with asynchronous subscriptions.
Note: For a given subscription, messages are dispatched serially, one message at a time. If your application does not care about processing ordering and would prefer the messages to be dispatched concurrently, it is the application's responsibility to move them to some internal queue to be picked up by threads/go routines.
The following example subscribes to the subject updates
and handles the incoming messages:
nc, err := nats.Connect("demo.nats.io")if err != nil {log.Fatal(err)}defer nc.Close()​// Use a WaitGroup to wait for a message to arrivewg := sync.WaitGroup{}wg.Add(1)​// Subscribeif _, err := nc.Subscribe("updates", func(m *nats.Msg) {wg.Done()}); err != nil {log.Fatal(err)}​// Wait for a message to come inwg.Wait()
Connection nc = Nats.connect("nats://demo.nats.io:4222");​// Use a latch to wait for a message to arriveCountDownLatch latch = new CountDownLatch(1);​// Create a dispatcher and inline message handlerDispatcher d = nc.createDispatcher((msg) -> {String str = new String(msg.getData(), StandardCharsets.UTF_8);System.out.println(str);latch.countDown();});​// Subscribed.subscribe("updates");​// Wait for a message to come inlatch.await();​// Close the connectionnc.close();
let nc = NATS.connect({url: "nats://demo.nats.io:4222"});nc.subscribe("updates", (msg) => {t.log(msg);});
nc = NATS()​await nc.connect(servers=["nats://demo.nats.io:4222"])​future = asyncio.Future()​async def cb(msg):nonlocal futurefuture.set_result(msg)​await nc.subscribe("updates", cb=cb)await nc.publish("updates", b'All is Well')await nc.flush()​# Wait for message to come inmsg = await asyncio.wait_for(future, 1)
require 'nats/client'​NATS.start(servers:["nats://127.0.0.1:4222"]) do |nc|nc.subscribe("updates") do |msg|puts msgnc.closeend​nc.publish("updates", "All is Well")end
nc.subscribe("updates", (err, msg) => {if(err) {console.log('error', err);} else {t.log(msg.data);}});
static voidonMsg(natsConnection *conn, 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);}​(...)​natsConnection *conn = NULL;natsSubscription *sub = NULL;natsStatus s;​s = natsConnection_ConnectTo(&conn, NATS_DEFAULT_URL);if (s == NATS_OK){// Creates an asynchronous subscription on subject "foo".// When a message is sent on subject "foo", the callback// onMsg() will be invoked by the client library.// You can pass a closure as the last argument.s = natsConnection_Subscribe(&sub, conn, "foo", onMsg, NULL);}​(...)​​// Destroy objects that were creatednatsSubscription_Destroy(sub);natsConnection_Destroy(conn);