public void TestDurable() { Context.RunInJsServer(c => { // create the stream. CreateDefaultTestStream(c); // Create our JetStream context. IJetStream js = c.CreateJetStreamContext(); // Build our subscription options normally PullSubscribeOptions options1 = PullSubscribeOptions.Builder().WithDurable(DURABLE).Build(); _testDurable(js, () => js.PullSubscribe(SUBJECT, options1)); // bind long form PullSubscribeOptions options2 = PullSubscribeOptions.Builder() .WithStream(STREAM) .WithDurable(DURABLE) .WithBind(true) .Build(); _testDurable(js, () => js.PullSubscribe(null, options2)); // bind short form PullSubscribeOptions options3 = PullSubscribeOptions.BindTo(STREAM, DURABLE); _testDurable(js, () => js.PullSubscribe(null, options3)); }); }
public void TestBindDurableDeliverSubject() { Context.RunInJsServer(c => { CreateDefaultTestStream(c); IJetStream js = c.CreateJetStreamContext(); IJetStreamManagement jsm = c.CreateJetStreamManagementContext(); // create a durable push subscriber - has deliver subject ConsumerConfiguration ccDurPush = ConsumerConfiguration.Builder() .WithDurable(Durable(1)) .WithDeliverSubject(Deliver(1)) .Build(); jsm.AddOrUpdateConsumer(STREAM, ccDurPush); // create a durable pull subscriber - notice no deliver subject ConsumerConfiguration ccDurPull = ConsumerConfiguration.Builder() .WithDurable(Durable(2)) .Build(); jsm.AddOrUpdateConsumer(STREAM, ccDurPull); // try to pull subscribe against a push durable NATSJetStreamClientException e = Assert.Throws <NATSJetStreamClientException>( () => js.PullSubscribe(SUBJECT, PullSubscribeOptions.Builder().WithDurable(Durable(1)).Build())); Assert.Contains(JsSubConsumerAlreadyConfiguredAsPush.Id, e.Message); // try to pull bind against a push durable e = Assert.Throws <NATSJetStreamClientException>( () => js.PullSubscribe(SUBJECT, PullSubscribeOptions.BindTo(STREAM, Durable(1)))); Assert.Contains(JsSubConsumerAlreadyConfiguredAsPush.Id, e.Message); // this one is okay IJetStreamPullSubscription sub = js.PullSubscribe(SUBJECT, PullSubscribeOptions.Builder().WithDurable(Durable(2)).Build()); sub.Unsubscribe(); // so I can re-use the durable // try to push subscribe against a pull durable e = Assert.Throws <NATSJetStreamClientException>( () => js.PushSubscribeSync(SUBJECT, PushSubscribeOptions.Builder().WithDurable(Durable(2)).Build())); Assert.Contains(JsSubConsumerAlreadyConfiguredAsPull.Id, e.Message); // try to push bind against a pull durable e = Assert.Throws <NATSJetStreamClientException>( () => js.PushSubscribeSync(SUBJECT, PushSubscribeOptions.BindTo(STREAM, Durable(2)))); Assert.Contains(JsSubConsumerAlreadyConfiguredAsPull.Id, e.Message); // this one is okay js.PushSubscribeSync(SUBJECT, PushSubscribeOptions.Builder().WithDurable(Durable(1)).Build()); }); }
public void TestBindErrors() { Context.RunInJsServer(c => { CreateDefaultTestStream(c); IJetStream js = c.CreateJetStreamContext(); PushSubscribeOptions pushso = PushSubscribeOptions.BindTo(STREAM, DURABLE); NATSJetStreamClientException e = Assert.Throws <NATSJetStreamClientException>(() => js.PushSubscribeSync(SUBJECT, pushso)); Assert.Contains(JsSubConsumerNotFoundRequiredInBind.Id, e.Message); PullSubscribeOptions pullso = PullSubscribeOptions.BindTo(STREAM, DURABLE); e = Assert.Throws <NATSJetStreamClientException>(() => js.PullSubscribe(SUBJECT, pullso)); Assert.Contains(JsSubConsumerNotFoundRequiredInBind.Id, e.Message); }); }
public void TestBindPull() { Context.RunInJsServer(c => { CreateDefaultTestStream(c); IJetStream js = c.CreateJetStreamContext(); JsPublish(js, SUBJECT, 1, 1); PullSubscribeOptions pso = PullSubscribeOptions.Builder() .WithDurable(DURABLE) .Build(); IJetStreamPullSubscription s = js.PullSubscribe(SUBJECT, pso); s.Pull(1); Msg m = s.NextMessage(1000); Assert.NotNull(m); Assert.Equal(Data(1), Encoding.ASCII.GetString(m.Data)); m.Ack(); s.Unsubscribe(); JsPublish(js, SUBJECT, 2, 1); pso = PullSubscribeOptions.Builder() .WithStream(STREAM) .WithDurable(DURABLE) .WithBind(true) .Build(); s = js.PullSubscribe(SUBJECT, pso); s.Pull(1); m = s.NextMessage(1000); Assert.NotNull(m); Assert.Equal(Data(2), Encoding.ASCII.GetString(m.Data)); m.Ack(); s.Unsubscribe(); JsPublish(js, SUBJECT, 3, 1); pso = PullSubscribeOptions.BindTo(STREAM, DURABLE); s = js.PullSubscribe(SUBJECT, pso); s.Pull(1); m = s.NextMessage(1000); Assert.NotNull(m); Assert.Equal(Data(3), Encoding.ASCII.GetString(m.Data)); }); }
public void TestConsumerIsNotModified() { Context.RunInJsServer(c => { CreateDefaultTestStream(c); IJetStreamManagement jsm = c.CreateJetStreamManagementContext(); // test with config in issue 105 ConsumerConfiguration cc = ConsumerConfiguration.Builder() .WithDescription("desc") .WithAckPolicy(AckPolicy.Explicit) .WithDeliverPolicy(DeliverPolicy.All) .WithDeliverSubject(Deliver(1)) .WithDeliverGroup(Queue(1)) .WithDurable(Durable(1)) .WithMaxAckPending(65000) .WithMaxDeliver(5) .WithReplayPolicy(ReplayPolicy.Instant) .Build(); jsm.AddOrUpdateConsumer(STREAM, cc); IJetStream js = c.CreateJetStreamContext(); PushSubscribeOptions pushOpts = PushSubscribeOptions.BindTo(STREAM, Durable(1)); js.PushSubscribeSync(SUBJECT, Queue(1), pushOpts); // should not throw an error // testing numerics cc = ConsumerConfiguration.Builder() .WithDeliverPolicy(DeliverPolicy.ByStartSequence) .WithDeliverSubject(Deliver(21)) .WithDurable(Durable(21)) .WithStartSequence(42) .WithMaxDeliver(43) .WithRateLimitBps(44) .WithMaxAckPending(45) .Build(); jsm.AddOrUpdateConsumer(STREAM, cc); pushOpts = PushSubscribeOptions.BindTo(STREAM, Durable(21)); js.PushSubscribeSync(SUBJECT, pushOpts); // should not throw an error cc = ConsumerConfiguration.Builder() .WithDurable(Durable(22)) .WithMaxPullWaiting(46) .Build(); jsm.AddOrUpdateConsumer(STREAM, cc); PullSubscribeOptions pullOpts = PullSubscribeOptions.BindTo(STREAM, Durable(22)); js.PullSubscribe(SUBJECT, pullOpts); // should not throw an error // testing DateTime cc = ConsumerConfiguration.Builder() .WithDeliverPolicy(DeliverPolicy.ByStartTime) .WithDeliverSubject(Deliver(3)) .WithDurable(Durable(3)) .WithStartTime(DateTime.Now.AddHours(1)) .Build(); jsm.AddOrUpdateConsumer(STREAM, cc); pushOpts = PushSubscribeOptions.BindTo(STREAM, Durable(3)); js.PushSubscribeSync(SUBJECT, pushOpts); // should not throw an error // testing boolean and duration cc = ConsumerConfiguration.Builder() .WithDeliverSubject(Deliver(4)) .WithDurable(Durable(4)) .WithFlowControl(1000) .WithHeadersOnly(true) .WithAckWait(2000) .Build(); jsm.AddOrUpdateConsumer(STREAM, cc); pushOpts = PushSubscribeOptions.BindTo(STREAM, Durable(4)); js.PushSubscribeSync(SUBJECT, pushOpts); // should not throw an error // testing enums cc = ConsumerConfiguration.Builder() .WithDeliverSubject(Deliver(5)) .WithDurable(Durable(5)) .WithDeliverPolicy(DeliverPolicy.Last) .WithAckPolicy(AckPolicy.None) .WithReplayPolicy(ReplayPolicy.Original) .Build(); jsm.AddOrUpdateConsumer(STREAM, cc); pushOpts = PushSubscribeOptions.BindTo(STREAM, Durable(5)); js.PushSubscribeSync(SUBJECT, pushOpts); // should not throw an error }); }