Example #1
0
        public async Task ReceiverSenderAsync()
        {
            string testName = "ReceiverSenderAsync";

            ConnectionFactory connectionFactory = new ConnectionFactory();

            // Creating first ReceiverLink
            Connection firstReceiverConnection = await connectionFactory.CreateAsync(this.testTarget.Address);

            Session      firstReceiverSession = new Session(firstReceiverConnection);
            ReceiverLink firstReceiverLink    = new ReceiverLink(firstReceiverSession, "receiver-link", testName);

            // Does not work when creating SenderLink after first ReceiverLink
            var senderConnection = await connectionFactory.CreateAsync(this.testTarget.Address);

            var senderSession = new Session(senderConnection);
            var senderLink    = new SenderLink(senderSession, "sender-link", testName);

            // Send and receive message
            await senderLink.SendAsync(new Message(testName));

            Message firstMessageReceived = await firstReceiverLink.ReceiveAsync(TimeSpan.FromMilliseconds(1000));

            // Close first reveiver link
            await firstReceiverLink.CloseAsync();

            await firstReceiverSession.CloseAsync();

            await firstReceiverConnection.CloseAsync();

            // Creating second ReceiverLink
            Connection secondReceiverConnection = await connectionFactory.CreateAsync(this.testTarget.Address);

            Session      secondReceiverSession = new Session(secondReceiverConnection);
            ReceiverLink secondReceiverLink    = new ReceiverLink(secondReceiverSession, "receiver-link", testName);

            // Send and receive message
            await senderLink.SendAsync(new Message(testName));

            Message message = await secondReceiverLink.ReceiveAsync(TimeSpan.FromMilliseconds(1000));

            Assert.IsTrue(message != null, "No message received");
            secondReceiverLink.Accept(message);

            // Close second reveiver link
            await secondReceiverLink.CloseAsync();

            await secondReceiverSession.CloseAsync();

            await secondReceiverConnection.CloseAsync();

            // Close sender link
            await senderLink.CloseAsync();

            await senderSession.CloseAsync();

            await senderConnection.CloseAsync();
        }
Example #2
0
        static async Task Run()
        {
            string address = "amqp://*****:*****@localhost:5672";

            Connection connection = await Connection.Factory.CreateAsync(new Address(address));

            Session    session = new Session(connection);
            SenderLink sender  = new SenderLink(session, "test-sender", "q1");

            Message message1 = new Message("Hello AMQP!");
            await sender.SendAsync(message1);

            ReceiverLink receiver = new ReceiverLink(session, "test-receiver", "q1");
            Message      message2 = await receiver.ReceiveAsync();

            Console.WriteLine(message2.GetBody <string>());
            receiver.Accept(message2);

            await sender.CloseAsync();

            await receiver.CloseAsync();

            await session.CloseAsync();

            await connection.CloseAsync();
        }
Example #3
0
        static async Task RunSampleAsync()
        {
            ConnectionFactory factory = new ConnectionFactory();

            factory.SASL.Profile = SaslProfile.External;

            Trace.WriteLine(TraceLevel.Information, "Establishing a connection...");
            Address address    = new Address(sbNamespace, 5671, null, null, "/", "amqps");
            var     connection = await factory.CreateAsync(address);

            // before any operation can be performed, a token must be put to the $cbs node
            Trace.WriteLine(TraceLevel.Information, "Putting a token to the $cbs node...");
            await PutTokenAsync(connection);

            Trace.WriteLine(TraceLevel.Information, "Sending a message...");
            var session = new Session(connection);
            var sender  = new SenderLink(session, "ServiceBus.Cbs:sender-link", entity);
            await sender.SendAsync(new Message("test"));

            await sender.CloseAsync();

            Trace.WriteLine(TraceLevel.Information, "Receiving the message back...");
            var receiver = new ReceiverLink(session, "ServiceBus.Cbs:receiver-link", entity);
            var message  = await receiver.ReceiveAsync();

            receiver.Accept(message);
            await receiver.CloseAsync();

            Trace.WriteLine(TraceLevel.Information, "Closing the connection...");
            await session.CloseAsync();

            await connection.CloseAsync();
        }
Example #4
0
        public void SendWithInvalidRemoteChannelTest()
        {
            this.testListener.RegisterTarget(TestPoint.Transfer, (stream, channel, fields) =>
            {
                // send an end with invalid channel
                TestListener.FRM(stream, 0x17UL, 0, 33);
                return(TestOutcome.Stop);
            });

            string testName = "SendWithProtocolErrorTest";

            Trace.WriteLine(TraceLevel.Information, "sync test");
            {
                Connection connection = new Connection(this.address);
                Session    session    = new Session(connection);
                SenderLink sender     = new SenderLink(session, "sender-" + testName, "any");
                try
                {
                    sender.Send(new Message("test")
                    {
                        Properties = new Properties()
                        {
                            MessageId = testName
                        }
                    });
                    Assert.IsTrue(false, "Send should throw exception");
                }
                catch (AmqpException exception)
                {
                    Assert.AreEqual(ErrorCode.NotFound, (string)exception.Error.Condition);
                }
                connection.Close();
                Assert.AreEqual(ErrorCode.NotFound, (string)connection.Error.Condition);
            }

            Trace.WriteLine(TraceLevel.Information, "async test");
            Task.Factory.StartNew(async() =>
            {
                Connection connection = await Connection.Factory.CreateAsync(this.address);
                Session session       = new Session(connection);
                SenderLink sender     = new SenderLink(session, "sender-" + testName, "any");
                try
                {
                    await sender.SendAsync(new Message("test")
                    {
                        Properties = new Properties()
                        {
                            MessageId = testName
                        }
                    });
                    Assert.IsTrue(false, "Send should throw exception");
                }
                catch (AmqpException exception)
                {
                    Assert.AreEqual(ErrorCode.NotFound, (string)exception.Error.Condition);
                }
                await connection.CloseAsync();
                Assert.AreEqual(ErrorCode.NotFound, (string)connection.Error.Condition);
            }).Unwrap().GetAwaiter().GetResult();
        }
Example #5
0
        static void Main(string[] args)
        {
            Console.WriteLine("Producer Started");
            try
            {
                Address    address    = new Address("amqp://*****:*****@localhost:5672");
                Connection connection = new Connection(new Address("amqp://*****:*****@localhost:5672"));
                Session    session    = new Session(connection);
                //SenderLink sender = new SenderLink(session, "sender-link", "q1");
                SenderLink sender = new SenderLink(session, "sender-link", "topic://q1");

                while (true)
                {
                    Console.WriteLine("write something to send");
                    string  msgstr  = Console.ReadLine();
                    Message message = new Message(msgstr);
                    sender.SendAsync(message);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
            Console.ReadLine();
        }
Example #6
0
        public async Task SendAsync <T>(T @event) where T : class
        {
            var data      = JsonConvert.SerializeObject(@event);
            var eventType = @event.GetType().FullName;
            var address   = Settings.Address + @event.GetType().Name;

            var session = CreateSession();
            var sender  = new SenderLink(session, Settings.AppName, address);
            var message = new Message(data)
            {
                ApplicationProperties = new ApplicationProperties(),
                Properties            = new Properties {
                    MessageId = Guid.NewGuid().ToString(),
                    GroupId   = eventType
                }
            };

            message.ApplicationProperties[MESSAGE_TYPE_KEY] = eventType;

            try {
                await sender.SendAsync(message);
            } finally {
                await sender.CloseAsync(TimeSpan.Zero);
            }
        }
Example #7
0
        public async Task SendMessage <T>(T body)
        {
            try
            {
                var settings = new JsonSerializerSettings();
                settings.TypeNameHandling         = TypeNameHandling.None;
                settings.MetadataPropertyHandling = MetadataPropertyHandling.Ignore;
                settings.DateParseHandling        = DateParseHandling.None;
                Message newMessage = new Message(JsonConvert.SerializeObject(body, settings));
                newMessage.Header                   = new Header();
                newMessage.Properties               = new Properties();
                newMessage.Header.Durable           = true;
                newMessage.Properties.MessageId     = Guid.NewGuid().ToString();
                newMessage.Properties.CorrelationId = newMessage.Properties.MessageId;
                newMessage.Properties.GroupId       = "group1";
                if (cntr % 2 == 0)
                {
                    //newMessage.Properties.GroupId = "group1";
                }
                else
                {
                    //newMessage.Properties.GroupId = "group2";
                }
                await _producer.SendAsync(newMessage);

                cntr = cntr + 1;
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }
        public async Task AddToQueue(IEnumerable <T> data)
        {
            await Connect();

            var target = new Target
            {
                Address = queue.IndexOf("topic", StringComparison.InvariantCultureIgnoreCase) == 0
                    ? $"topic://{queue}"
                    : $"queue://{queue}"
            };

            SenderLink sender = new SenderLink(session, receiverName, target, null);

            foreach (var d in data)
            {
                var message = new Message(JsonConvert.SerializeObject(d))
                {
                    Properties = new Properties {
                        CreationTime = DateTime.UtcNow
                    },
                };

                await sender.SendAsync(message);
            }

            await sender.CloseAsync();
        }
        public void ConnectionMaxFrameSizeTest()
        {
            this.testListener.RegisterTarget(TestPoint.Open, (stream, channel, fields) =>
            {
                TestListener.FRM(stream, 0x10UL, 0, 0, "TestListener", "localhost", 512u);
                return(TestOutcome.Stop);
            });

            this.testListener.RegisterTarget(TestPoint.Begin, (stream, channel, fields) =>
            {
                TestListener.FRM(stream, 0x11UL, 0, channel, channel, 0u, 100u, 100u, 8u, null, null, null,
                                 new Fields()
                {
                    { new Symbol("big-string"), new string('a', 1024) }
                });
                return(TestOutcome.Stop);
            });

            string testName = "ConnectionMaxFrameSizeTest";

            Trace.WriteLine(TraceLevel.Information, "sync test");
            {
                Open open = new Open()
                {
                    ContainerId = testName, HostName = "localhost", MaxFrameSize = 2048
                };
                Connection connection = new Connection(this.address, null, open, null);
                Session    session    = new Session(connection);
                SenderLink sender     = new SenderLink(session, "sender-" + testName, "any");
                sender.Send(new Message("test")
                {
                    Properties = new Properties()
                    {
                        MessageId = testName
                    }
                });
                connection.Close();
                Assert.IsTrue(connection.Error == null, "connection has error!" + connection.Error);
            }

            Trace.WriteLine(TraceLevel.Information, "async test");
            Task.Factory.StartNew(async() =>
            {
                ConnectionFactory factory = new ConnectionFactory();
                factory.AMQP.MaxFrameSize = 2048;
                Connection connection     = await factory.CreateAsync(this.address);
                Session session           = new Session(connection);
                SenderLink sender         = new SenderLink(session, "sender-" + testName, "any");
                await sender.SendAsync(new Message("test")
                {
                    Properties = new Properties()
                    {
                        MessageId = testName
                    }
                });
                await connection.CloseAsync();
                Assert.IsTrue(connection.Error == null, "connection has error!" + connection.Error);
            }).Unwrap().GetAwaiter().GetResult();
        }
Example #10
0
        public async Task SendAsync(string eventType, string address, string data, string correlationId)
        {
            var messageId = Guid.NewGuid().ToString();

            using (Logger.BeginScope(new Dictionary <string, object> {
                ["CorrelationId"] = correlationId,
                ["MessageId"] = messageId,
                ["MessageType"] = eventType
            })) {
                Logger.LogTrace($"Publishing message {messageId} to {address} with body: {data}");
                var session = CreateSession();
                var attach  = new Attach()
                {
                    Target = new Target()
                    {
                        Address = address, Durable = Settings.Durable
                    },
                    Source = new Source()
                };
                var sender = new SenderLink(session, Settings.AppName, attach, null);
                sender.Closed += OnClosed;
                var message = new Message(data)
                {
                    Header = new Header {
                        Durable = (Settings.Durable == 2)
                    },
                    ApplicationProperties = new ApplicationProperties(),
                    Properties            = new Properties {
                        MessageId     = messageId,
                        GroupId       = eventType,
                        CorrelationId = correlationId
                    }
                };
                message.ApplicationProperties[MESSAGE_TYPE_KEY] = eventType;

                try {
                    await sender.SendAsync(message);

                    Logger.LogInformation($"Published message {messageId}");
                } finally {
                    if (sender.Error != null)
                    {
                        Error             = new DomainEventError();
                        Error.Condition   = sender.Error.Condition.ToString();
                        Error.Description = sender.Error.Description;
                        Closed?.Invoke(this, Error);
                    }
                    if (!sender.IsClosed)
                    {
                        await sender.CloseAsync(TimeSpan.FromSeconds(5));
                    }
                    await session.CloseAsync();

                    await session.Connection.CloseAsync();
                }
            }
        }
Example #11
0
        public async Task PublishAsync <T>(T model, string topic)
        {
            var sender = new SenderLink(Session, $"{GetType().FullName}.sender", topic);

            var message = GetMessage(model);
            await sender.SendAsync(message);

            await sender.CloseAsync();
        }
Example #12
0
        private async Task <IoTHubAmqpDeviceClient> Telemetry(SenderLink sl, Action <Message> handler)
        {
            var message = NewMessage();

            handler(message);
            await sl.SendAsync(message);

            return(this);
        }
Example #13
0
        private static async Task <bool> PutCbsToken(Connection connection, string shareAccessSignature, string audience)
        {
            Log.Debug("Sending authentication token");
            bool result  = true;
            var  session = new Session(connection);

            const string cbsReplyToAddress = "cbs-reply-to";
            var          cbsSender         = new SenderLink(session, "cbs-sender", "$cbs");
            var          cbsReceiver       = new ReceiverLink(session, cbsReplyToAddress, "$cbs");

            // construct the put-token message
            var request = new Message(shareAccessSignature)
            {
                Properties = new Properties
                {
                    MessageId = Guid.NewGuid().ToString(),
                    ReplyTo   = cbsReplyToAddress
                },
                ApplicationProperties = new ApplicationProperties
                {
                    ["operation"] = "put-token",
                    ["type"]      = "azure-devices.net:sastoken",
                    ["name"]      = audience
                }
            };
            await cbsSender.SendAsync(request);

            // receive the response
            var response = await cbsReceiver.ReceiveAsync();

            if (response?.Properties == null || response.ApplicationProperties == null)
            {
                result = false;
            }
            else
            {
                var statusCode            = (int)response.ApplicationProperties["status-code"];
                var statusCodeDescription = (string)response.ApplicationProperties["status-description"];
                if (statusCode != 202 && statusCode != 200)
                {
                    result = false;
                    Log.ErrorFormat("Authentication failure {status}", statusCodeDescription);
                }
            }

            // the sender/receiver may be kept open for refreshing tokens
            await cbsSender.CloseAsync();

            await cbsReceiver.CloseAsync();

            await session.CloseAsync();

            Log.Debug("Authentication complete");

            return(result);
        }
Example #14
0
        /// <summary>
        /// renews the cbs token
        /// </summary>
        /// <param name="sharedAccessToken">token to renew</param>
        /// <returns>Task to wait on</returns>
        private async Task RenewTokenAsync(string sharedAccessToken)
        {
            var    session          = new Session(m_connection);
            string cbsClientAddress = "cbs-client-reply-to";
            var    cbsSender        = new SenderLink(session, "cbs-sender", "$cbs");
            var    receiverAttach   = new Attach()
            {
                Source = new Source()
                {
                    Address = "$cbs"
                },
                Target = new Target()
                {
                    Address = cbsClientAddress
                }
            };
            var cbsReceiver = new ReceiverLink(session, "cbs-receiver", receiverAttach, null);

            // construct the put-token message
            var request = new Message(sharedAccessToken);

            request.Properties            = new Properties();
            request.Properties.MessageId  = "1";
            request.Properties.ReplyTo    = cbsClientAddress;
            request.ApplicationProperties = new ApplicationProperties();

            request.ApplicationProperties["operation"] = "put-token";
            request.ApplicationProperties["type"]      = TokenType;
            request.ApplicationProperties["name"]      = TokenScope;

            await cbsSender.SendAsync(request);

            // receive the response
            var response = await cbsReceiver.ReceiveAsync();

            if (response == null || response.Properties == null || response.ApplicationProperties == null)
            {
                throw new Exception("invalid response received");
            }

            int statusCode = (int)response.ApplicationProperties["status-code"];

            await cbsSender.CloseAsync();

            await cbsReceiver.CloseAsync();

            await session.CloseAsync();

            if (statusCode != (int)HttpStatusCode.Accepted && statusCode != (int)HttpStatusCode.OK)
            {
                throw new Exception("put-token message was not accepted. Error code: " + statusCode);
            }

            // Now create new link
            await ResetLinkAsync();
        }
Example #15
0
        public static void PutCsbToken(Connection connection, ServiceBusConfiguration config, string audience)
        {
            var tokenProvider = new ManagedIdentityTokenProvider();
            var token         = tokenProvider.GetTokenAsync($"sb://{config.Host}/");

            var session = new Session(connection);

            var cbsClientAddress = "cbs-client-reply-to";
            var cbsSender        = new SenderLink(session, config.Subscription, "$cbs");
            var cbsReceiver      = new ReceiverLink(session, cbsClientAddress, "$cbs");

            // construct the put-token message
            var request = new Message(token.TokenValue)
            {
                Properties = new Properties
                {
                    MessageId = Guid.NewGuid().ToString(),
                    ReplyTo   = cbsClientAddress
                },
                ApplicationProperties = new ApplicationProperties
                {
                    ["operation"]  = "put-token",
                    ["type"]       = token.TokenType,
                    ["expiration"] = token.ExpiresAtUtc,
                    ["name"]       = audience
                }
            };

            cbsSender.SendAsync(request).Wait();
            Trace.WriteLine(TraceLevel.Information, " request: {0}", request.Properties);
            Trace.WriteLine(TraceLevel.Information, " request: {0}", request.ApplicationProperties);

            // receive the response
            var response = cbsReceiver.ReceiveAsync().Result;

            if (response?.Properties == null || response.ApplicationProperties == null)
            {
                throw new Exception("invalid response received");
            }

            // validate message properties and status code.
            Trace.WriteLine(TraceLevel.Information, " response: {0}", response.Properties);
            Trace.WriteLine(TraceLevel.Information, " response: {0}", response.ApplicationProperties);
            int statusCode = (int)response.ApplicationProperties["status-code"];

            if (statusCode != (int)HttpStatusCode.Accepted && statusCode != (int)HttpStatusCode.OK)
            {
                throw new Exception("put-token message was not accepted. Error code: " + statusCode);
            }

            // the sender/receiver may be kept open for refreshing tokens
            cbsSender.Close();
            cbsReceiver.Close();
            session.Close();
        }
Example #16
0
        public void SendTimeoutTest()
        {
            this.testListener.RegisterTarget(TestPoint.Transfer, (stream, channel, fields) =>
            {
                return(TestOutcome.Stop);
            });

            string   testName = "SendTimeoutTest";
            TimeSpan timeout  = TimeSpan.FromMilliseconds(600);

            Trace.WriteLine(TraceLevel.Information, "sync test");
            {
                Connection connection = new Connection(this.address);
                Session    session    = new Session(connection);
                SenderLink sender     = new SenderLink(session, "sender-" + testName, "any");
                try
                {
                    sender.Send(new Message("test")
                    {
                        Properties = new Properties()
                        {
                            MessageId = testName
                        }
                    }, timeout);
                    Assert.IsTrue(false, "Send should throw exception");
                }
                catch (TimeoutException)
                {
                }
                connection.Close();
            }

            Trace.WriteLine(TraceLevel.Information, "async test");
            Task.Factory.StartNew(async() =>
            {
                Connection connection = await Connection.Factory.CreateAsync(this.address);
                Session session       = new Session(connection);
                SenderLink sender     = new SenderLink(session, "sender-" + testName, "any");
                try
                {
                    await sender.SendAsync(new Message("test")
                    {
                        Properties = new Properties()
                        {
                            MessageId = testName
                        }
                    }, timeout);
                    Assert.IsTrue(false, "Send should throw exception");
                }
                catch (TimeoutException)
                {
                }
                await connection.CloseAsync();
            }).Unwrap().GetAwaiter().GetResult();
        }
        async Task SendReceiveAsync(int count)
        {
            // it is also possible to create the Address object form a Uri string as follows,
            //   wss://[sas-policy]:[sas-key]@[ns].servicebus.windows.net/$servicebus/websocket
            // note that [sas-policy] and [sas-key] should be URL encoded
            Address wsAddress = new Address(this.Namespace, 443, this.KeyName, this.KeyValue, "/$servicebus/websocket", "wss");
            WebSocketTransportFactory wsFactory = new WebSocketTransportFactory("AMQPWSB10");

            Trace.WriteLine(TraceLevel.Information, "Establishing a connection...");
            ConnectionFactory connectionFactory = new ConnectionFactory(new TransportProvider[] { wsFactory });
            Connection        connection        = await connectionFactory.CreateAsync(wsAddress);

            Trace.WriteLine(TraceLevel.Information, "Creating a session...");
            Session session = new Session(connection);

            Trace.WriteLine(TraceLevel.Information, "Creating a sender link...");
            SenderLink sender = new SenderLink(session, "websocket-sender-link", this.Entity);

            Trace.WriteLine(TraceLevel.Information, "Sending {0} messages...", count);
            for (int i = 0; i < count; i++)
            {
                Message message = new Message("testing");
                message.Properties = new Properties()
                {
                    MessageId = "websocket-test-" + i
                };
                await sender.SendAsync(message);
            }

            Trace.WriteLine(TraceLevel.Information, "Closing sender...");
            await sender.CloseAsync();

            Trace.WriteLine(TraceLevel.Information, "Receiving messages...");
            ReceiverLink receiver = new ReceiverLink(session, "websocket-receiver-link", this.Entity);

            for (int i = 0; i < count; i++)
            {
                Message message = await receiver.ReceiveAsync(30000);

                if (message == null)
                {
                    break;
                }

                receiver.Accept(message);
            }

            Trace.WriteLine(TraceLevel.Information, "Closing receiver...");
            await receiver.CloseAsync();

            Trace.WriteLine(TraceLevel.Information, "Shutting down...");
            await session.CloseAsync();

            await connection.CloseAsync();
        }
        private async Task InnerSendAsync(Message message, EventProperties properties)
        {
            using (Logger.BeginScope(new Dictionary <string, object> {
                ["CorrelationId"] = message.Properties.CorrelationId,
                ["MessageId"] = message.Properties.MessageId,
                ["MessageType"] = message.Properties.GroupId
            })) {
                Logger.LogTrace($"Publishing message {message.Properties.MessageId} to {properties.Address} with body: {message.Body}");

                var disconnectAfter = false;
                if (conn == null)
                {
                    Connect();
                    disconnectAfter = true;
                }

                var session = new Session(conn);
                var attach  = new Attach()
                {
                    Target = new Target()
                    {
                        Address = properties.Address, Durable = Settings.Durable
                    },
                    Source = new Source()
                };
                var sender = new SenderLink(session, Settings.AppName + Guid.NewGuid().ToString(), attach, null);
                sender.Closed += OnClosed;

                try {
                    await sender.SendAsync(message).ConfigureAwait(false);

                    Logger.LogInformation($"Published message {message.Properties.MessageId}");
                } finally {
                    if (sender.Error != null)
                    {
                        Error             = new DomainEventError();
                        Error.Condition   = sender.Error.Condition.ToString();
                        Error.Description = sender.Error.Description;
                        Closed?.Invoke(this, Error);
                    }

                    if (disconnectAfter)
                    {
                        if (!sender.IsClosed)
                        {
                            await sender.CloseAsync(TimeSpan.FromSeconds(5)).ConfigureAwait(false);
                        }
                        await session.CloseAsync().ConfigureAwait(false);

                        await session.Connection.CloseAsync().ConfigureAwait(false);
                    }
                }
            }
        }
Example #19
0
        public async Task SendMessage(string addressName)
        {
            string     message  = $"Hello AMQP! at time {DateTime.Now}";
            SenderLink sender   = new SenderLink(MqSession, "Client", addressName);
            Message    message1 = new Message(message);
            await sender.SendAsync(message1);

            await sender.CloseAsync();

            Console.WriteLine("Sent a message: " + message);
        }
Example #20
0
        public async Task ConcurrentWritersMultipleConnections()
        {
            // Up to version 2.1.3, multiple writers from a single task could cause
            // a deadlock (cf issue https://github.com/Azure/amqpnetlite/issues/287)
            // This test checks that it's fixed
            const int NbProducerTasks = 4;
            var       data            = Enumerable.Range(0, 100 * 1024).Select(x => (byte)x).ToArray();

            // Open 2 connections and sender links to 2 queues
            var connection1 = await Connection.Factory.CreateAsync(
                testTarget.Address, new Open()
            {
                ContainerId = "c1", MaxFrameSize = 4096
            }, null);

            var connection2 = await Connection.Factory.CreateAsync(
                testTarget.Address, new Open()
            {
                ContainerId = "c2", MaxFrameSize = 4096
            }, null);

            var senderLink1 = new SenderLink(new Session(connection1), "Sender 1", "q1");
            var senderLink2 = new SenderLink(new Session(connection2), "Sender 2", "q2");

            // Start multiple sender tasks that will use both sender links concurrently
            var tasks = Enumerable.Range(0, NbProducerTasks).Select(_ =>
                                                                    Task.Run(async() =>
            {
                // Send 10 messages on both queues
                for (int i = 0; i < 10; i++)
                {
                    var message = new Message()
                    {
                        BodySection = new Data()
                        {
                            Binary = data
                        }
                    };
                    await senderLink1.SendAsync(message, TimeSpan.FromSeconds(10));
                    await senderLink2.SendAsync(message, TimeSpan.FromSeconds(10));
                }
            }));

            var sendersFinished = Task.WhenAll(tasks);
            var timeoutTask     = Task.Delay(TestTimeout);

            Assert.AreEqual(sendersFinished, await Task.WhenAny(sendersFinished, timeoutTask),
                            "Probable deadlock detected: timeout while waiting for concurrent sender tasks to complete");

            await connection1.CloseAsync();

            await connection2.CloseAsync();
        }
Example #21
0
        async Task SendReceiveAsync(int count)
        {
            Trace.WriteLine(TraceLevel.Information, "Establishing a connection...");
            Connection connection = await Connection.Factory.CreateAsync(this.GetAddress());

            Trace.WriteLine(TraceLevel.Information, "Creating a session...");
            Session session = new Session(connection);

            Trace.WriteLine(TraceLevel.Information, "Creating a sender link...");
            SenderLink sender = new SenderLink(session, "topic-sender-link", this.Entity);

            Trace.WriteLine(TraceLevel.Information, "Sending {0} messages...", count);
            for (int i = 0; i < count; i++)
            {
                Message message = new Message();
                message.Properties = new Properties()
                {
                    MessageId = "topic-test-" + i
                };
                message.BodySection = new Data()
                {
                    Binary = Encoding.UTF8.GetBytes("message #" + i)
                };
                await sender.SendAsync(message);
            }

            Trace.WriteLine(TraceLevel.Information, "Closing sender...");
            await sender.CloseAsync();

            Trace.WriteLine(TraceLevel.Information, "Receiving messages from subscription...");
            ReceiverLink receiver = new ReceiverLink(session, "receiver-link", this.Entity + "/Subscriptions/sub1");

            for (int i = 0; i < count; i++)
            {
                Message message = await receiver.ReceiveAsync(30000);

                if (message == null)
                {
                    break;
                }

                receiver.Accept(message);
            }

            Trace.WriteLine(TraceLevel.Information, "Closing receiver...");
            await receiver.CloseAsync();

            Trace.WriteLine(TraceLevel.Information, "Shutting down...");
            await session.CloseAsync();

            await connection.CloseAsync();
        }
Example #22
0
        public async Task SendEmailAsync(string email, EmailMessage emailMessage, string sender = null)
        {
            try
            {
                bool hasAttachments = emailMessage.Attachments != null && emailMessage.Attachments.Any();

                var message = new Message(emailMessage.Body)
                {
                    Properties = new Properties {
                        MessageId = Guid.NewGuid().ToString()
                    },
                    ApplicationProperties = new ApplicationProperties
                    {
                        ["email"]         = email,
                        ["sender"]        = !string.IsNullOrEmpty(sender) && sender.IsValidEmail() ? sender : string.Empty,
                        ["isHtml"]        = emailMessage.IsHtml,
                        ["subject"]       = emailMessage.Subject,
                        ["hasAttachment"] = hasAttachments
                    }
                };

                if (hasAttachments)
                {
                    message.ApplicationProperties["contentType"] = emailMessage.Attachments[0].ContentType;
                    message.ApplicationProperties["fileName"]    = emailMessage.Attachments[0].FileName;

                    using (var ms = new MemoryStream())
                    {
                        emailMessage.Attachments[0].Stream.CopyTo(ms);
                        message.ApplicationProperties["file"] = ms.ToArray();
                    }
                }

                string policyName       = WebUtility.UrlEncode(_settings.PolicyName);
                string key              = WebUtility.UrlEncode(_settings.Key);
                string connectionString = $"amqps://{policyName}:{key}@{_settings.NamespaceUrl}/";

                var connection = await Connection.Factory.CreateAsync(new Address(connectionString));

                var        amqpSession = new Session(connection);
                SenderLink senderLink  = new SenderLink(amqpSession, "sender-link", _settings.QueueName);

                await senderLink.SendAsync(message);

                amqpSession.Close(0);
                connection.Close(0);
            }
            catch (Exception ex)
            {
                await _log.WriteErrorAsync("EmailSender", "SendEmailAsync", string.Empty, ex);
            }
        }
Example #23
0
        public async Task WebSocketSendReceiveAsync()
        {
            if (Environment.GetEnvironmentVariable("CoreBroker") == "1")
            {
                // No Websocket listener on .Net Core
                return;
            }

            string testName = "WebSocketSendReceiveAsync";

            // assuming it matches the broker's setup and port is not taken
            Address wsAddress = new Address(address);
            int     nMsgs     = 50;

            ConnectionFactory connectionFactory = new ConnectionFactory(
                new TransportProvider[] { new WebSocketTransportFactory() });
            Connection connection = await connectionFactory.CreateAsync(wsAddress);

            Session    session = new Session(connection);
            SenderLink sender  = new SenderLink(session, "sender-" + testName, "q1");

            for (int i = 0; i < nMsgs; ++i)
            {
                Message message = new Message();
                message.Properties = new Properties()
                {
                    MessageId = "msg" + i, GroupId = testName
                };
                message.ApplicationProperties       = new ApplicationProperties();
                message.ApplicationProperties["sn"] = i;
                await sender.SendAsync(message);
            }

            ReceiverLink receiver = new ReceiverLink(session, "receiver-" + testName, "q1");

            for (int i = 0; i < nMsgs; ++i)
            {
                Message message = await receiver.ReceiveAsync();

                Trace.WriteLine(TraceLevel.Information, "receive: {0}", message.ApplicationProperties["sn"]);
                receiver.Accept(message);
            }

            await sender.CloseAsync();

            await receiver.CloseAsync();

            await session.CloseAsync();

            await connection.CloseAsync();
        }
        static async Task <int> SslConnectionTestAsync()
        {
            try{
                ConnectionFactory factory = new ConnectionFactory();

                String certFile = "C:\\location\\certificate.cer";
                factory.SSL.RemoteCertificateValidationCallback = ValidateServerCertificate;
                factory.SSL.LocalCertificateSelectionCallback   = (a, b, c, d, e) => X509Certificate.CreateFromCertFile(certFile);
                factory.SSL.ClientCertificates.Add(X509Certificate.CreateFromCertFile(certFile));

                factory.SASL.Profile = SaslProfile.External;
                Connection.DisableServerCertValidation = false;

                Address    address    = new Address("amqps://*****:*****@host:5671");
                Connection connection = await factory.CreateAsync(address);

                Session    session = new Session(connection);
                SenderLink sender  = new SenderLink(session, "sender-link", "amqp");
                Message    message = null;

                DateTime d1 = DateTime.Now;
                Console.WriteLine(d1);
                Console.WriteLine("Send Start time : {0}!", d1);

                for (int i = 0; i < 5; i++)
                {
                    string msg = "num --" + i + "-->this is a testing message for sender, to test sending proformance";
                    message = new Message(msg);
                    sender.SendAsync(message);
                    Console.WriteLine("Sent messaging {0}!", msg);
                }

                DateTime d2 = DateTime.Now;
                Console.WriteLine("Send End time : {0}!", d2);
                Console.WriteLine("Press enter key to exit...");
                Console.ReadLine();

                await sender.CloseAsync();

                await session.CloseAsync();

                await connection.CloseAsync();

                return(0);
            }
            catch (Exception e)
            {
                Console.WriteLine("Exception {0}.", e);
                return(1);
            }
        }
Example #25
0
        public static void SendDtoMessage(FiniteDto messageDto)
        {
            var serialized = JsonDtoSerializer.SerializeDto(messageDto);
            var message    = new Message(serialized);

            try
            {
                sender.SendAsync(message);
            }
            catch (Exception ex)
            {
                Windows.WriteMainWindowDescriptiveText(ex.ToString());
            }
        }
        public async Task StartNewCup(Maker.Interfaces.DTOs.RequestCup requestCup)
        {
            Connection connection = await Connection.Factory.CreateAsync(await GetAmqpAddressAsync());

            Amqp.Session session = new Amqp.Session(connection);
            SenderLink   sender  = new SenderLink(session, "barista-sender", "StartNewCup");

            //create message
            Message message = new Message(JsonConvert.SerializeObject(requestCup));
            await sender.SendAsync(message);

            await sender.CloseAsync();

            await connection.CloseAsync();
        }
Example #27
0
        public async Task LargeMessageSendReceiveAsync()
        {
            string testName = "LargeMessageSendReceiveAsync";
            int    nMsgs    = 50;

            Connection connection = await Connection.Factory.CreateAsync(
                this.testTarget.Address, new Open()
            {
                ContainerId = "c1", MaxFrameSize = 4096
            }, null);

            Session    session = new Session(connection);
            SenderLink sender  = new SenderLink(session, "sender-" + testName, testTarget.Path);

            int messageSize = 100 * 1024;

            for (int i = 0; i < nMsgs; ++i)
            {
                Message message = new Message(new string('D', messageSize));
                message.Properties = new Properties()
                {
                    MessageId = "msg" + i, GroupId = testName
                };
                message.ApplicationProperties       = new ApplicationProperties();
                message.ApplicationProperties["sn"] = i;
                await sender.SendAsync(message);
            }

            ReceiverLink receiver = new ReceiverLink(session, "receiver-" + testName, testTarget.Path);

            for (int i = 0; i < nMsgs; ++i)
            {
                Message message = await receiver.ReceiveAsync();

                string value = message.GetBody <string>();
                Trace.WriteLine(TraceLevel.Information, "receive: {0} body {1}x{2}",
                                message.ApplicationProperties["sn"], value[0], value.Length);
                receiver.Accept(message);
            }

            await sender.CloseAsync();

            await receiver.CloseAsync();

            await session.CloseAsync();

            await connection.CloseAsync();
        }
        protected override async Task SendAsync(Message message, EventProperties properties)
        {
            var disconnectAfter = false;

            if (conn == null)
            {
                Connect();
                disconnectAfter = true;
            }

            var session = new Session(conn);
            var attach  = new Attach()
            {
                Target = new Target()
                {
                    Address = properties.Address, Durable = Settings.Durable
                },
                Source = new Source()
            };
            var sender = new SenderLink(session, Settings.AppName + Guid.NewGuid().ToString(), attach, null);

            sender.Closed += OnClosed;

            try {
                await sender.SendAsync(message).ConfigureAwait(false);

                Logger.LogInformation($"Published message {message.Properties.MessageId}");
            } finally {
                if (sender.Error != null)
                {
                    Error             = new DomainEventError();
                    Error.Condition   = sender.Error.Condition.ToString();
                    Error.Description = sender.Error.Description;
                    Closed?.Invoke(this, Error);
                }

                if (disconnectAfter)
                {
                    if (!sender.IsClosed)
                    {
                        await sender.CloseAsync(TimeSpan.FromSeconds(5)).ConfigureAwait(false);
                    }
                    await session.CloseAsync().ConfigureAwait(false);

                    await session.Connection.CloseAsync().ConfigureAwait(false);
                }
            }
        }
Example #29
0
        public async Task SendMessageToDevice(string messageToDevice)
        {
            var sender = new SenderLink(session, "sender-link", "/messages/devicebound");

            var message = new Message(System.Text.Encoding.UTF8.GetBytes(messageToDevice));

            message.Properties            = new Properties();
            message.Properties.To         = BuzzerDeviceTo;
            message.Properties.MessageId  = Guid.NewGuid().ToString();
            message.ApplicationProperties = new ApplicationProperties();
            message.ApplicationProperties["iothub-ack"] = "full";

            await sender.SendAsync(message);

            await sender.CloseAsync();
        }
Example #30
0
        public async Task SetBuzzerStateAsync(bool doorState)
        {
            var sender = new SenderLink(session, "sender-link", "/messages/devicebound");

            var message = new Message(doorState);

            message.Properties            = new Properties();
            message.Properties.To         = Constants.BuzzerDeviceTo;
            message.Properties.MessageId  = Guid.NewGuid().ToString();
            message.ApplicationProperties = new ApplicationProperties();
            message.ApplicationProperties ["iothub-ack"] = "full";

            await sender.SendAsync(message);

            await sender.CloseAsync();
        }