Beispiel #1
0
        internal MessagePublisher(IMessagingEntityFactory messagingEntityFactory, IMessageSerializer serializer, IMessagePropertyProvider <TMessage> propertyProvider, IMessageOutgoingPropertiesTable messageOutgoingPropertiesTable)
        {
            if (messagingEntityFactory == null)
            {
                throw new ArgumentNullException(nameof(messagingEntityFactory));
            }
            if (serializer == null)
            {
                throw new ArgumentNullException(nameof(serializer));
            }
            if (propertyProvider == null)
            {
                throw new ArgumentNullException(nameof(propertyProvider));
            }
            if (messageOutgoingPropertiesTable == null)
            {
                throw new ArgumentNullException(nameof(messageOutgoingPropertiesTable));
            }

            _messagingEntityFactory         = messagingEntityFactory;
            _serializer                     = serializer;
            _propertyProvider               = propertyProvider;
            _messageOutgoingPropertiesTable = messageOutgoingPropertiesTable;

            _messageTypeMessageSenderMap = new ConcurrentDictionary <Type, IMessageSender>();
        }
        internal MessageSource(IMessagingEntityFactory messagingEntityFactory, IEnumerable <IMessageDeserializer <TMessage> > deserializers, IMessageBrokeredMessageTable messageBrokeredMessageTable)
        {
            if (messagingEntityFactory == null)
            {
                throw new ArgumentNullException(nameof(messagingEntityFactory));
            }

            IObservable <BrokeredMessage> brokeredMessages = CreateBrokeredMessageObservableFromMessageReceiver(messagingEntityFactory);

            Initialize(brokeredMessages, deserializers, messageBrokeredMessageTable);
        }
        private IObservable <BrokeredMessage> CreateBrokeredMessageObservableFromMessageReceiver(IMessagingEntityFactory messagingEntityFactory)
        {
            _messageReceiverBrokeredMessageObservableCancellationTokenSource = new CancellationTokenSource();

            return(Observable.Create <BrokeredMessage>(async(observer, cancellationToken) =>
            {
                IMessageReceiver messageReceiver = messagingEntityFactory.CreateMessageReceiver(typeof(TMessage));

                while (!cancellationToken.IsCancellationRequested
                       &&
                       !_messageReceiverBrokeredMessageObservableCancellationTokenSource.IsCancellationRequested
                       &&
                       !messageReceiver.IsClosed)
                {
                    BrokeredMessage nextMessage = await messageReceiver.ReceiveAsync(); // NOTE: could pass the CancellationToken in here if ReceiveAsync is ever updated to accept it

                    if (nextMessage != null)
                    {
                        observer.OnNext(nextMessage);
                    }
                }

                return () => messageReceiver.Dispose();
            }).Publish().RefCount());
        }