Пример #1
0
 public void Correctly_close_a_AmqpRpcFlow_when_stream_is_closed_without_passing_any_elements()
 {
     Source.Empty <ByteString>()
     .Via(AmqpRpcFlow.CreateSimple(AmqpSinkSettings.Create(_connectionSettings)))
     .RunWith(this.SinkProbe <ByteString>(), _mat)
     .EnsureSubscription()
     .ExpectComplete();
 }
Пример #2
0
        public void Publish_via_RPC_which_expects_2_responses_per_message_and_then_consume_through_a_simple_queue_again_in_the_same_process()
        {
            var queueName        = "amqp-conn-it-spec-rpc-queue-" + Environment.TickCount;
            var queueDeclaration = QueueDeclaration.Create(queueName);

            var amqpRpcFlow = AmqpRpcFlow.CreateSimple(
                AmqpSinkSettings.Create(_connectionSettings).WithRoutingKey(queueName).WithDeclarations(queueDeclaration), repliesPerMessage: 2);

            var amqpSource = AmqpSource.AtMostOnceSource(NamedQueueSourceSettings.Create(_connectionSettings, queueName), bufferSize: 1);

            var input = new[] { "one", "two", "three", "four", "five" };

            var t =
                Source.From(input)
                .Select(ByteString.FromString)
                .ViaMaterialized(amqpRpcFlow, Keep.Right)
                .ToMaterialized(this.SinkProbe <ByteString>(), Keep.Both)
                .Run(_mat);

            var rpcQueueF = t.Item1;
            var probe     = t.Item2;

            rpcQueueF.Result.Should().NotBeNullOrWhiteSpace("RPC flow materializes into response queue name");

            var amqpSink = AmqpSink.ReplyTo(AmqpReplyToSinkSettings.Create(_connectionSettings));

            amqpSource
            .SelectMany(b =>
                        new[]
            {
                new OutgoingMessage(b.Bytes.Concat(ByteString.FromString("a")), false, false, b.Properties),
                new OutgoingMessage(b.Bytes.Concat(ByteString.FromString("aa")), false, false, b.Properties)
            })
            .RunWith(amqpSink, _mat);

            probe
            .Request(10)
            .ExpectNextUnorderedN(input.SelectMany(s => new[] { ByteString.FromString(s + "a"), ByteString.FromString(s + "aa") }))
            .ExpectComplete();
        }
        public static Flow <OutgoingMessage, CommittableIncomingMessage, Task <string> > SimpleRpc(Action <SimpleQueueOptions> opt)
        {
            var option = new SimpleQueueOptions();

            opt?.Invoke(option);

            var connectionSettings = AmqpConnectionDetails.Create(option.HostAndPorts.First().Host, option.HostAndPorts.First().Port)
                                     .WithHostsAndPorts(option.HostAndPorts.First(), option.HostAndPorts.ToArray())
                                     .WithCredentials(AmqpCredentials.Create(option.UserName, option.Password))
                                     .WithAutomaticRecoveryEnabled(true)
                                     .WithNetworkRecoveryInterval(TimeSpan.FromSeconds(1))
                                     .WithVirtualHost(option.VirtualHost ?? "/");

            var queueDeclaration = QueueDeclaration.Create(option.QueueName)
                                   .WithDurable(false)
                                   .WithAutoDelete(false);


            return(AmqpRpcFlow.CommittableFlow(AmqpSinkSettings.Create(connectionSettings)
                                               .WithRoutingKey(option.QueueName)
                                               .WithDeclarations(queueDeclaration), 1));
        }
Пример #4
0
        public void Publish_via_RPC_and_then_consume_through_a_simple_queue_again_in_the_same_process_without_autoAck()
        {
            var queueName        = "amqp-conn-it-spec-rpc-queue-" + Environment.TickCount;
            var queueDeclaration = QueueDeclaration.Create(queueName);

            var input = new[] { "one", "two", "three", "four", "five" };

            var amqpRpcFlow = AmqpRpcFlow.CommittableFlow(
                AmqpSinkSettings.Create(_connectionSettings).WithRoutingKey(queueName).WithDeclarations(queueDeclaration), bufferSize: 10);

            var t =
                Source.From(input)
                .Select(ByteString.FromString)
                .Select(bytes => new OutgoingMessage(bytes, false, false))
                .ViaMaterialized(amqpRpcFlow, Keep.Right)
                .SelectAsync(1, async cm =>
            {
                await cm.Ack();
                return(cm.Message);
            })
                .ToMaterialized(this.SinkProbe <IncomingMessage>(), Keep.Both)
                .Run(_mat);

            var rpcQueueF = t.Item1;
            var probe     = t.Item2;

            rpcQueueF.Wait();

            var amqpSink = AmqpSink.ReplyTo(AmqpReplyToSinkSettings.Create(_connectionSettings));

            var amqpSource = AmqpSource.AtMostOnceSource(NamedQueueSourceSettings.Create(_connectionSettings, queueName), bufferSize: 1);

            amqpSource
            .Select(b => new OutgoingMessage(b.Bytes, false, false, b.Properties))
            .RunWith(amqpSink, _mat);

            probe.ToStrict(TimeSpan.FromSeconds(3)).Select(x => x.Bytes.ToString()).Should().Equal(input);
        }