// ReSharper disable once SuggestBaseTypeForParameter
        async Task Dispatch(MulticastTransportOperation transportOperation, HashSet <string> messageIdsOfMulticastedEvents)
        {
            var message = await PrepareMessage <SnsPreparedMessage>(transportOperation, messageIdsOfMulticastedEvents)
                          .ConfigureAwait(false);

            if (message == null)
            {
                return;
            }

            if (string.IsNullOrEmpty(message.Destination))
            {
                return;
            }

            var publishRequest = message.ToPublishRequest();

            if (Logger.IsDebugEnabled)
            {
                Logger.Debug($"Publishing message with '{message.MessageId}' to topic '{publishRequest.TopicArn}'");
            }

            await snsClient.PublishAsync(publishRequest)
            .ConfigureAwait(false);

            if (Logger.IsDebugEnabled)
            {
                Logger.Debug($"Published message with '{message.MessageId}' to topic '{publishRequest.TopicArn}'");
            }
        }
Beispiel #2
0
        Task PublishMessage(MulticastTransportOperation transportOperation)
        {
            var messageWrapper = BuildMessageWrapper(transportOperation, TimeSpan.MaxValue,
                                                     transportOperation.MessageType.ToString());

            var topicsToSendTo = SubscriptionManager.GetTypeHierarchy(transportOperation.MessageType);

            var messageStream = new MemoryStream();

            KafkaTransportInfrastructure.GetSerializer().Serialize(messageWrapper, messageStream);

            var publishTasks = new List <Task>(topicsToSendTo.Count);

            foreach (var t in topicsToSendTo)
            {
                Logger.Debug("Publish to " + t);
                var topic = producerFactory.GetProducer().Topic(t);

                publishTasks.Add(topic.Produce(messageStream.ToArray())
                                 .ContinueWith(
                                     result => Logger.Info("new partition and offset: " + result.Result.Partition + " " +
                                                           result.Result.Offset), TaskContinuationOptions.ExecuteSynchronously));
            }

            return(Task.WhenAll(publishTasks));
        }
        Task PublishMessage(MulticastTransportOperation transportOperation, ConfirmsAwareChannel channel)
        {
            var message = transportOperation.Message;

            var properties = channel.CreateBasicProperties();

            properties.Fill(message, transportOperation.DeliveryConstraints, channel.SupportsDelayedDelivery, out _);

            return(channel.PublishMessage(transportOperation.MessageType, message, properties));
        }
        Task PublishMessage(MulticastTransportOperation transportOperation, ConfirmsAwareChannel channel, CancellationToken cancellationToken)
        {
            var message = transportOperation.Message;

            var properties = channel.CreateBasicProperties();

            properties.Fill(message, transportOperation.Properties);

            return(channel.PublishMessage(transportOperation.MessageType, message, properties, cancellationToken));
        }
        public void Should_not_share_constraints_when_not_provided()
        {
            var transportOperation       = new MulticastTransportOperation(new OutgoingMessage(Guid.NewGuid().ToString(), new Dictionary <string, string>(), new byte[0]), typeof(Guid), new DispatchProperties());
            var secondTransportOperation = new MulticastTransportOperation(new OutgoingMessage(Guid.NewGuid().ToString(), new Dictionary <string, string>(), new byte[0]), typeof(Guid), new DispatchProperties());

            transportOperation.Properties.DiscardIfNotReceivedBefore = new DiscardIfNotReceivedBefore(TimeSpan.FromDays(1));

            Assert.IsEmpty(secondTransportOperation.Properties);
            Assert.IsNotEmpty(transportOperation.Properties);
        }
        async Task ApplyMulticastOperationMappingIfNecessary(MulticastTransportOperation transportOperation, SnsPreparedMessage snsPreparedMessage)
        {
            if (transportOperation == null || snsPreparedMessage == null)
            {
                return;
            }

            var existingTopicArn = await topicCache.GetTopicArn(transportOperation.MessageType).ConfigureAwait(false);

            snsPreparedMessage.Destination = existingTopicArn;
        }
 private void DispatchMulticastMessage(MulticastTransportOperation multicastTransportOperation)
 {
     try
     {
         MessagePublished?.Invoke(multicastTransportOperation);
     }
     catch (Exception e)
     {
         Console.WriteLine(e);
     }
 }
        public async Task <List <UnicastTransportOperation> > Convert(MulticastTransportOperation transportOperation)
        {
            var subscribers = await subscriptions.GetSubscribers(transportOperation.MessageType).ConfigureAwait(false);

            return((from subscriber in subscribers
                    select new UnicastTransportOperation(
                        transportOperation.Message,
                        subscriber,
                        transportOperation.RequiredDispatchConsistency,
                        transportOperation.DeliveryConstraints
                        )).ToList());
        }
Beispiel #9
0
        Task PublishMessage(MulticastTransportOperation transportOperation, ConfirmsAwareChannel channel, RabbitMQMessagePriority priority)
        {
            var message = transportOperation.Message;

            var properties = channel.CreateBasicProperties();

            properties.Fill(message, transportOperation.DeliveryConstraints, out _);
            if (priority != null)
            {
                properties.Priority = priority.Priority;
            }
            return(channel.PublishMessage(transportOperation.MessageType, message, properties));
        }
Beispiel #10
0
        async Task<IEnumerable<UnicastTransportOperation>> ConvertTo(MulticastTransportOperation transportOperation,
            CancellationToken cancellationToken)
        {
            var subscribers =
                await subscriptionStore.GetSubscribers(transportOperation.MessageType, cancellationToken)
                    .ConfigureAwait(false);

            return from subscriber in subscribers
                   select new UnicastTransportOperation(
                       transportOperation.Message,
                       subscriber,
                       transportOperation.Properties,
                       transportOperation.RequiredDispatchConsistency
                   );
        }
        private void DispatcherOnMessagePublished(MulticastTransportOperation operation)
        {
            Dictionary <string, MessagePump> subscribers = new Dictionary <string, MessagePump>();

            foreach (var infrastructure in infrastructures)
            {
                if (infrastructure.SubscriptionManager.subscriptions.Any(subscription => subscription.IsAssignableFrom(operation.MessageType)))
                {
                    subscribers[infrastructure.MainPump.inputQueue] = infrastructure.MainPump;
                }
            }

            foreach (var subscriber in subscribers.Values)
            {
                Task.Run(() =>
                         subscriber.Push(operation.Message.Body, operation.Message.MessageId, operation.Message.Headers));
            }
        }
        async Task PublishMessage(MulticastTransportOperation transportOperation)
        {
            var messageWrapper = BuildMessageWrapper(transportOperation, TimeSpan.MaxValue, transportOperation.MessageType.ToString());

            var topicsToSendTo = SubscriptionManager.GetTypeHierarchy(transportOperation.MessageType);

            var messageStream = new MemoryStream();

            KafkaTransportInfrastructure.GetSerializer().Serialize(messageWrapper, messageStream);

            foreach (var t in topicsToSendTo)
            {
                Logger.Debug("Publish to " + t);
                var topic = producerFactory.GetProducer().Topic(t);

                await topic.Produce(messageStream.ToArray()).ContinueWith(result => Logger.Info("new partition and offset: " + result.Result.Partition + " " + result.Result.Offset));
            }
        }
Beispiel #13
0
    async Task SendMessage(MulticastTransportOperation transportOperation)
    {
        var generateRoutingKey = DefaultRoutingKeyConvention.GenerateRoutingKey(transportOperation.MessageType);
        var publisher          = await PublisherClient.CreateAsync();

        var message          = transportOperation.Message;
        var transportMessage = new PubsubMessage
        {
            MessageId = message.MessageId,
            Data      = ByteString.CopyFrom(message.Body)
        };

        transportMessage.Attributes.Add(message.Headers);
        await publisher.PublishAsync(new TopicName(projectId, generateRoutingKey), new[]
        {
            transportMessage
        })
        .ConfigureAwait(false);
    }
 public Task <List <UnicastTransportOperation> > Convert(MulticastTransportOperation transportOperation, CancellationToken cancellationToken = default)
 {
     return(Task.FromResult(new List <UnicastTransportOperation>()));
 }
Beispiel #15
0
 public Task <List <UnicastTransportOperation> > Convert(MulticastTransportOperation transportOperation)
 {
     return(Task.FromResult(new List <UnicastTransportOperation>()));
 }