示例#1
0
    public TransportConfigurationResult Configure(SettingsHolder settings, TransportTransactionMode transactionMode)
    {
        var result    = new TransportConfigurationResult();
        var transport = new RabbitMQTransport();

        var connectionString = Environment.GetEnvironmentVariable("RabbitMQTransport_ConnectionString");

        if (string.IsNullOrEmpty(connectionString))
        {
            throw new Exception("The 'RabbitMQTransport_ConnectionString' environment variable is not set.");
        }

        connectionStringBuilder = new DbConnectionStringBuilder {
            ConnectionString = connectionString
        };

        queueBindings = settings.Get <QueueBindings>();

        new TransportExtensions <RabbitMQTransport>(settings).UseConventionalRoutingTopology();
        result.TransportInfrastructure  = transport.Initialize(settings, connectionStringBuilder.ConnectionString);
        isTransportInitialized          = true;
        result.PurgeInputQueueOnStartup = true;

        transportTransactionMode = result.TransportInfrastructure.TransactionMode;
        requestedTransactionMode = transactionMode;

        //work around for TransportTests not calling Start
        result.TransportInfrastructure.Start();

        return(result);
    }
        public async Task SetUp()
        {
            receivedMessages = new BlockingCollection <IncomingMessage>();

            var connectionString = Environment.GetEnvironmentVariable("RabbitMQTransport_ConnectionString") ?? "host=localhost";

            var useTls = connectionString.StartsWith("https", StringComparison.InvariantCultureIgnoreCase) || connectionString.StartsWith("amqps", StringComparison.InvariantCultureIgnoreCase);

            var transport        = new RabbitMQTransport(RoutingTopology.Conventional(QueueType.Classic), connectionString);
            var connectionConfig = transport.ConnectionConfiguration;

            connectionFactory = new ConnectionFactory(ReceiverQueue, connectionConfig, null, true, false, transport.HeartbeatInterval, transport.NetworkRecoveryInterval, null);

            infra = await transport.Initialize(new HostSettings(ReceiverQueue, ReceiverQueue, new StartupDiagnosticEntries(),
                                                                (_, __, ___) => { }, true), new[]
            {
                new ReceiveSettings(ReceiverQueue, new QueueAddress(ReceiverQueue), true, true, "error")
            }, AdditionalReceiverQueues.Concat(new[] { ErrorQueue }).ToArray());

            messageDispatcher   = infra.Dispatcher;
            messagePump         = infra.Receivers[ReceiverQueue];
            subscriptionManager = messagePump.Subscriptions;

            await messagePump.Initialize(new PushRuntimeSettings(MaximumConcurrency),
                                         (messageContext, cancellationToken) =>
            {
                receivedMessages.Add(new IncomingMessage(messageContext.NativeMessageId, messageContext.Headers,
                                                         messageContext.Body), cancellationToken);
                return(Task.CompletedTask);
            }, (_, __) => Task.FromResult(ErrorHandleResult.Handled)
                                         );

            await messagePump.StartReceive();
        }
示例#3
0
        private RabbitMQTransport GetTransport(IReadOnlyDictionary <string, object> primaryQueueArguments)
        {
            // Each Transport uses a unique Guid as the queue base to ensure the tests are isolated
            var transportGuid = Guid.NewGuid();

            usedGuids.Add(transportGuid);

            var config = new ConfigurationBuilder();

            config.ConfigureAndCreateContext(x =>
            {
                x.UsingAssemblyLocator <TestAssemblyLocator>();
                x.UseRabbitMQ(r =>
                {
                    r.UseConnectionString(connectionString);
                    r.UseExchange(exchange);
                    r.WithPrimaryQueueArguments(primaryQueueArguments);
                    r.OnSendingMessage(OnSendingMessage);
                });
            });

            var transport = new RabbitMQTransport(transportGuid.ToString(), config.ConfigurationContext);

            transport.InitializeForConsuming();
            transport.InitializeForPublishing();
            return(transport);
        }
    public TransportDefinition CreateTransportDefinition()
    {
        var connectionString = Environment.GetEnvironmentVariable("RabbitMQTransport_ConnectionString") ?? "host=localhost";

        var transport = new RabbitMQTransport(RoutingTopology.Conventional(QueueType.Classic), connectionString);

        return(transport);
    }
示例#5
0
    void UseConventionalRoutingTopology(EndpointConfiguration endpointConfiguration)
    {
        #region rabbitmq-config-useconventionalroutingtopology

        var transport = new RabbitMQTransport(Topology.Conventional, "host=localhost");

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#6
0
    void UseDirectRoutingTopology(EndpointConfiguration endpointConfiguration)
    {
        #region rabbitmq-config-usedirectroutingtopology

        var transport = new RabbitMQTransport(Topology.Direct, "host=localhost");

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#7
0
    void UseRoutingTopology5_0(EndpointConfiguration endpointConfiguration)
    {
        #region rabbitmq-config-useroutingtopologyDelegate

        var topology = new MyRoutingTopology(createDurableExchangesAndQueues: true);

        var transport = new RabbitMQTransport(topology, "host=localhost");

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#8
0
    void CertificatePath(EndpointConfiguration endpointConfiguration)
    {
        #region 6to7certificatepath7

        var transport = new RabbitMQTransport(Topology.Conventional, "host=localhost")
        {
            ClientCertificate = new X509Certificate2("path", "password")
        };

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#9
0
    public TransportDefinition CreateTransportDefinition()
    {
        var connectionString = Environment.GetEnvironmentVariable("RabbitMQTransport_ConnectionString");

        if (string.IsNullOrEmpty(connectionString))
        {
            throw new Exception("The 'RabbitMQTransport_ConnectionString' environment variable is not set.");
        }

        var transport = new RabbitMQTransport(Topology.Conventional, connectionString);

        return(transport);
    }
示例#10
0
    void SetClientCertificate(EndpointConfiguration endpointConfiguration)
    {
        #region rabbitmq-client-certificate

        var transport = new RabbitMQTransport(Topology.Conventional, "host=localhost")
        {
            ClientCertificate = new X509Certificate2()
        };

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#11
0
    void PrefetchCount(EndpointConfiguration endpointConfiguration)
    {
        #region rabbitmq-config-prefetch-count

        var transport = new RabbitMQTransport(Topology.Conventional, "host=localhost")
        {
            PrefetchCountCalculation = _ => 100
        };

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#12
0
    void DisableDurableExchangesAndQueues(EndpointConfiguration endpointConfiguration)
    {
        #region rabbitmq-disable-durable-exchanges

        var topology = new ConventionalRoutingTopology(
            useDurableExchanges:  false);

        var transport = new RabbitMQTransport(topology, "host=localhost");

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#13
0
    void UseCustomCircuitBreakerSettings(EndpointConfiguration endpointConfiguration)
    {
        #region rabbitmq-custom-breaker-settings-time-to-wait-before-triggering-code

        var transport = new RabbitMQTransport(Topology.Conventional, "host=localhost")
        {
            TimeToWaitBeforeTriggeringCircuitBreaker = TimeSpan.FromMinutes(2)
        };

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#14
0
    void ChangeNetworkRecoveryInterval(EndpointConfiguration endpointConfiguration)
    {
        #region change-network-recovery-interval

        var transport = new RabbitMQTransport(Topology.Conventional, "host=localhost")
        {
            NetworkRecoveryInterval = TimeSpan.FromSeconds(30)
        };

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#15
0
    void ChangeRequestedHeartbeat(EndpointConfiguration endpointConfiguration)
    {
        #region rabbitmq-connectionstring-debug

        var transport = new RabbitMQTransport(Topology.Conventional, "host=broker1;RequestedHeartbeat=600")
        {
            ClientCertificate = new X509Certificate2()
        };

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#16
0
    void ChangeRequestedHeartbeatForDebugging(EndpointConfiguration endpointConfiguration)
    {
        #region rabbitmq-debug-api

        var transport = new RabbitMQTransport(Topology.Conventional, "host=localhost")
        {
            HeartbeatInterval = TimeSpan.FromMinutes(10)
        };

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#17
0
    void DisableRemoteCertificateValidation(EndpointConfiguration endpointConfiguration)
    {
        #region rabbitmq-disable-remote-certificate-validation

        var transport = new RabbitMQTransport(Topology.Conventional, "host=localhost")
        {
            ValidateRemoteCertificate = false
        };

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#18
0
    void UseExternalAuthMechanism(EndpointConfiguration endpointConfiguration)
    {
        #region rabbitmq-external-auth-mechanism

        var transport = new RabbitMQTransport(Topology.Conventional, "host=localhost")
        {
            UseExternalAuthMechanism = true
        };

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#19
0
    void PrefetchMultiplier(EndpointConfiguration endpointConfiguration)
    {
        #region rabbitmq-config-prefetch-multiplier

        var transport = new RabbitMQTransport(Topology.Conventional, "host=localhost")
        {
            PrefetchCountCalculation = concurrency => concurrency * 4
        };

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#20
0
    void ChangeHeartbeatInterval(EndpointConfiguration endpointConfiguration)
    {
        #region change-heartbeat-interval

        var transport = new RabbitMQTransport(Topology.Conventional, "host=localhost")
        {
            HeartbeatInterval = TimeSpan.FromSeconds(30)
        };

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#21
0
    void UseDirectRoutingTopologyWithCustomConventions(EndpointConfiguration endpointConfiguration)
    {
        #region rabbitmq-config-usedirectroutingtopologywithcustomconventions

        var topology = new DirectRoutingTopology(
            useDurableExchanges: true,
            exchangeNameConvention: () => "MyTopic",
            routingKeyConvention: MyRoutingKeyConvention);

        var transport = new RabbitMQTransport(topology, "host=localhost");

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#22
0
    void CustomIdStrategy(EndpointConfiguration endpointConfiguration)
    {
        #region rabbitmq-config-custom-id-strategy

        var transport = new RabbitMQTransport(Topology.Conventional, "host=localhost")
        {
            MessageIdStrategy = deliveryArgs =>
            {
                var headers = deliveryArgs.BasicProperties.Headers;
                return(headers["MyCustomId"].ToString());
            }
        };

        endpointConfiguration.UseTransport(transport);

        #endregion
    }
示例#23
0
        static async Task Main()
        {
            Console.Title = "Samples.RabbitMQ.SimpleReceiver";
            var endpointConfiguration = new EndpointConfiguration("Samples.RabbitMQ.SimpleReceiver");
            var transport             = new RabbitMQTransport(Topology.Conventional, "host=localhost");

            endpointConfiguration.UseTransport(transport);
            endpointConfiguration.EnableInstallers();

            var endpointInstance = await Endpoint.Start(endpointConfiguration)
                                   .ConfigureAwait(false);

            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
            await endpointInstance.Stop()
            .ConfigureAwait(false);
        }
示例#24
0
    void PrefetchCount(EndpointConfiguration endpointConfiguration)
    {
        #region 6to7prefetchcount7

        var transportWithFixedPrefetchCount = new RabbitMQTransport(Topology.Conventional, "host=localhost")
        {
            PrefetchCountCalculation = _ => 100
        };
        endpointConfiguration.UseTransport(transportWithFixedPrefetchCount);

        //or

        var transportWithConcurrencyBasedPrefetchCount = new RabbitMQTransport(Topology.Conventional, "host=localhost")
        {
            PrefetchCountCalculation = concurrency => concurrency * 7
        };
        endpointConfiguration.UseTransport(transportWithConcurrencyBasedPrefetchCount);

        #endregion
    }
        public async Task SetUp()
        {
            receivedMessages = new BlockingCollection <IncomingMessage>();

            var connectionString = Environment.GetEnvironmentVariable("RabbitMQTransport_ConnectionString");

            if (string.IsNullOrEmpty(connectionString))
            {
                throw new Exception("The 'RabbitMQTransport_ConnectionString' environment variable is not set.");
            }

            var useTls = connectionString.StartsWith("https", StringComparison.InvariantCultureIgnoreCase) || connectionString.StartsWith("amqps", StringComparison.InvariantCultureIgnoreCase);

            var transport = new RabbitMQTransport(Topology.Conventional, connectionString);

            connectionFactory = new ConnectionFactory(ReceiverQueue, transport.Host, transport.Port ?? 5672,
                                                      transport.VHost, transport.UserName, transport.Password, useTls, null, false,
                                                      false, transport.HeartbeatInterval, transport.NetworkRecoveryInterval, null);

            infra = await transport.Initialize(new HostSettings(ReceiverQueue, ReceiverQueue, new StartupDiagnosticEntries(),
                                                                (_, __, ___) => { }, true), new[]
            {
                new ReceiveSettings(ReceiverQueue, ReceiverQueue, true, true, "error")
            }, AdditionalReceiverQueues.Concat(new[] { ErrorQueue }).ToArray());

            messageDispatcher   = infra.Dispatcher;
            messagePump         = infra.Receivers[ReceiverQueue];
            subscriptionManager = messagePump.Subscriptions;

            await messagePump.Initialize(new PushRuntimeSettings(MaximumConcurrency),
                                         (messageContext, cancellationToken) =>
            {
                receivedMessages.Add(new IncomingMessage(messageContext.NativeMessageId, messageContext.Headers,
                                                         messageContext.Body), cancellationToken);
                return(Task.CompletedTask);
            }, (_, __) => Task.FromResult(ErrorHandleResult.Handled)
                                         );

            await messagePump.StartReceive();
        }
示例#26
0
    static async Task Main()
    {
        Console.Title = "Samples.RabbitMQ.SimpleSender";

        #region ConfigureRabbit

        var endpointConfiguration = new EndpointConfiguration("Samples.RabbitMQ.SimpleSender");
        var transport             = new RabbitMQTransport(Topology.Conventional, "host=localhost");
        var routing = endpointConfiguration.UseTransport(transport);

        #endregion

        routing.RouteToEndpoint(typeof(MyCommand), "Samples.RabbitMQ.SimpleReceiver");
        endpointConfiguration.EnableInstallers();

        var endpointInstance = await Endpoint.Start(endpointConfiguration)
                               .ConfigureAwait(false);
        await SendMessages(endpointInstance);

        await endpointInstance.Stop()
        .ConfigureAwait(false);
    }
示例#27
0
    public TransportConfigurationResult Configure(SettingsHolder settings, TransportTransactionMode transactionMode)
    {
        var result    = new TransportConfigurationResult();
        var transport = new RabbitMQTransport();

        connectionString = Environment.GetEnvironmentVariable("RabbitMQTransport.ConnectionString");

        if (connectionString == null)
        {
            connectionString = "host=localhost";
        }

        queueBindings = settings.Get <QueueBindings>();

        result.TransportInfrastructure  = transport.Initialize(settings, connectionString);
        result.PurgeInputQueueOnStartup = true;

        transportTransactionMode = result.TransportInfrastructure.TransactionMode;
        requestedTransactionMode = transactionMode;

        return(result);
    }
示例#28
0
        public MyServiceConfiguration()
            : base("MyService")
        {
            var scanner = this.AssemblyScanner();

            scanner.IncludeOnly("MyService.dll", "MyMessages.dll");

            this.UseSerialization <NewtonsoftSerializer>();
            this.UsePersistence <LearningPersistence>();
            this.EnableInstallers();

            var transport = new RabbitMQTransport(Topology.Conventional, "host=localhost;username=guest;password=guest");
            var routing   = this.UseTransport(transport);

            routing.RouteToEndpoint(typeof(AMessage), "MyOtherService");

            this.SendFailedMessagesTo("error");

            Conventions()
            .DefiningMessagesAs(t => t.Namespace != null && t.Namespace.EndsWith(".Messages"))
            .DefiningEventsAs(t => t.Namespace != null && t.Namespace.EndsWith(".Messages.Events"))
            .DefiningCommandsAs(t => t.Namespace != null && t.Namespace.EndsWith(".Messages.Commands"));
        }
示例#29
0
        public static EndpointConfiguration Build(string endpointName, string rabbitMqConnectionString)
        {
            var config  = new EndpointConfiguration(endpointName);
            var scanner = config.AssemblyScanner();

            scanner.IncludeOnly("MyOtherService.dll", "MyMessages.dll");

            config.UseSerialization <NewtonsoftSerializer>();
            config.UsePersistence <LearningPersistence>();
            config.EnableInstallers();

            var transport = new RabbitMQTransport(Topology.Conventional, rabbitMqConnectionString);

            config.UseTransport(transport);

            config.SendFailedMessagesTo("error");

            config.Conventions()
            .DefiningMessagesAs(t => t.Namespace != null && t.Namespace.EndsWith(".Messages"))
            .DefiningEventsAs(t => t.Namespace != null && t.Namespace.EndsWith(".Messages.Events"))
            .DefiningCommandsAs(t => t.Namespace != null && t.Namespace.EndsWith(".Messages.Commands"));

            return(config);
        }