diff --git a/developing-with-nats/intro-3/reply.md b/developing-with-nats/intro-3/reply.md index 82b0009..b1eaad0 100644 --- a/developing-with-nats/intro-3/reply.md +++ b/developing-with-nats/intro-3/reply.md @@ -4,5 +4,136 @@ Incoming messages have an optional reply-to field. If that field is set, it will For example, the following code will listen for that request and respond with the time. -!INCLUDE "../../\_examples/subscribe\_w\_reply.html" +{% tabs %} +{% tab title="Go" %} +```go +nc, err := nats.Connect("demo.nats.io") +if err != nil { + log.Fatal(err) +} +defer nc.Close() + +// Subscribe +sub, err := nc.SubscribeSync("time") +if err != nil { + log.Fatal(err) +} + +// Read a message +msg, err := sub.NextMsg(10 * time.Second) +if err != nil { + log.Fatal(err) +} + +// Get the time +timeAsBytes := []byte(time.Now().String()) + +// Send the time as the response. +msg.Respond(timeAsBytes) +``` +{% endtab %} + +{% tab title="Java" %} +```java +Connection nc = Nats.connect("nats://demo.nats.io:4222"); + +// Subscribe +Subscription sub = nc.subscribe("time"); + +// Read a message +Message msg = sub.nextMessage(Duration.ZERO); + +// Get the time +Calendar cal = Calendar.getInstance(); +SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); +byte[] timeAsBytes = sdf.format(cal.getTime()).getBytes(StandardCharsets.UTF_8); + +// Send the time +nc.publish(msg.getReplyTo(), timeAsBytes); + +// Flush and close the connection +nc.flush(Duration.ZERO); +nc.close(); +``` +{% endtab %} + +{% tab title="JavaScript" %} +```javascript +let nc = NATS.connect({ + url: "nats://demo.nats.io:4222" +}); + +// set up a subscription to process a request +nc.subscribe('time', (msg, reply) => { + if (msg.reply) { + nc.publish(msg.reply, new Date().toLocaleTimeString()); + } +}); + +``` +{% endtab %} + +{% tab title="Python" %} +```python +nc = NATS() + +await nc.connect(servers=["nats://demo.nats.io:4222"]) + +future = asyncio.Future() + +async def cb(msg): + nonlocal future + future.set_result(msg) + +await nc.subscribe("time", cb=cb) + +await nc.publish_request("time", new_inbox(), b'What is the time?') +await nc.flush() + +# Read the message +msg = await asyncio.wait_for(future, 1) + +# Send the time +time_as_bytes = "{}".format(datetime.now()).encode() +await nc.publish(msg.reply, time_as_bytes) +``` +{% endtab %} + +{% tab title="Ruby" %} +```ruby +require 'nats/client' +require 'fiber' + +NATS.start(servers:["nats://127.0.0.1:4222"]) do |nc| + Fiber.new do + f = Fiber.current + + nc.subscribe("time") do |msg, reply| + f.resume Time.now + end + + nc.publish("time", 'What is the time?', NATS.create_inbox) + + # Use the response + msg = Fiber.yield + puts "Reply: #{msg}" + + end.resume +end +``` +{% endtab %} + +{% tab title="TypeScript" %} +```typescript +// set up a subscription to process a request +await nc.subscribe('time', (err, msg) => { + if (msg.reply) { + nc.publish(msg.reply, new Date().toLocaleTimeString()); + } else { + t.log('got a request for the time, but no reply subject was set.'); + } +}); +``` +{% endtab %} +{% endtabs %}