static void SendMessages(IOutputChannel clientChannel, Binding binding) { // Send messages to queue: Console.WriteLine("Started sending messages..."); Random rand = new Random(); for (int i = 0; i < SampleManager.NumMessages; ++i) { string sessionName = rand.Next(SampleManager.NumSessions).ToString(); // Creating BrokeredMessageProperty BrokeredMessageProperty property = new BrokeredMessageProperty(); property.SessionId = sessionName; string soapBody = "Order_" + Guid.NewGuid().ToString().Substring(0, 5); property.Label = soapBody; // Creating message and adding BrokeredMessageProperty to the properties bag Message message = Message.CreateMessage(binding.MessageVersion, "SoapAction", soapBody); message.Properties.Add(BrokeredMessageProperty.Name, property); // Sending message clientChannel.Send(message); SampleManager.OutputMessageInfo("Send", message); Thread.Sleep(senderDelay); } Console.WriteLine("Finished sending messages"); }
static void ProcessMessage(BrokeredMessage message, MessageSession session = null) { DateTime startProcessingNewMessage = DateTime.Now; TimeSpan elapsed = startProcessingNewMessage - lastReceive; lastReceive = startProcessingNewMessage; // Using the Session State to track how much processing time was spent on a group. // This value will persist even if a receiver process is killed and the remaining // messages are picked up by another receiver. string readState = null; if (session != null) { TimeSpan totalElapsed = elapsed; readState = GetState(session); if (readState != null) { TimeSpan prevElapsed = TimeSpan.FromSeconds(Double.Parse(readState)); totalElapsed = elapsed + prevElapsed; } SetState(session, totalElapsed.TotalSeconds.ToString()); } SampleManager.OutputMessageInfo("RECV: ", message, "State: " + readState); Thread.Sleep(receiverDelay); }
private static void ReceiveMessages() { // Read messages from queue until queue is empty Console.WriteLine("Reading messages from queue {0}...", SampleManager.SessionlessQueueName); Console.WriteLine("Receiver Type: Receive and Delete"); // Create channel listener and channel using NetMessagingBinding NetMessagingBinding messagingBinding = new NetMessagingBinding("messagingBinding"); EndpointAddress address = SampleManager.GetEndpointAddress(SampleManager.SessionlessQueueName, serviceBusNamespace); TransportClientEndpointBehavior securityBehavior = new TransportClientEndpointBehavior(); securityBehavior.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(serviceBusKeyName, serviceBusKey); IChannelListener <IInputChannel> inputChannelListener = null; IInputChannel inputChannel = null; try { inputChannelListener = messagingBinding.BuildChannelListener <IInputChannel>(address.Uri, securityBehavior); inputChannelListener.Open(); inputChannel = inputChannelListener.AcceptChannel(); inputChannel.Open(); while (true) { try { // Receive message from queue. If no more messages available, the operation throws a TimeoutException. Message receivedMessage = inputChannel.Receive(receiveMessageTimeout); SampleManager.OutputMessageInfo("Receive", receivedMessage); // Since the message body contains a serialized string one can access it like this: //string soapBody = receivedMessage.GetBody<string>(); } catch (TimeoutException) { break; } } // Close inputChannel.Close(); inputChannelListener.Close(); } catch (Exception) { if (inputChannel != null) { inputChannel.Abort(); } if (inputChannelListener != null) { inputChannelListener.Abort(); } throw; } }
static void SendMessages(QueueClient queueClient) { // Send messages to queue: Console.WriteLine("Sending messages to queue {0}", queueClient.Path); System.Random rand = new Random(); for (int i = 0; i < SampleManager.NumMessages; ++i) { string sessionName = rand.Next(SampleManager.NumSessions).ToString(); BrokeredMessage message = CreateSessionMessage(sessionName); queueClient.Send(message); SampleManager.OutputMessageInfo("SEND: ", message); Thread.Sleep(senderDelay); } Console.WriteLine(); }
static void Main(string[] args) { try { ParseArgs(args); Console.Title = "Message Sender"; // Get credentials as Endpoint behavior TransportClientEndpointBehavior securityBehavior = new TransportClientEndpointBehavior(); securityBehavior.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(serviceBusKeyName, serviceBusKey); // Create factory and channel using NetMessagingBinding NetMessagingBinding messagingBinding = new NetMessagingBinding("messagingBinding"); EndpointAddress address = SampleManager.GetEndpointAddress(SampleManager.SessionlessQueueName, serviceBusNamespace); IChannelFactory <IOutputChannel> messagingChannelFactory = null; IOutputChannel messagingOutputChannel = null; try { messagingChannelFactory = messagingBinding.BuildChannelFactory <IOutputChannel>(securityBehavior); messagingChannelFactory.Open(); messagingOutputChannel = messagingChannelFactory.CreateChannel(address); messagingOutputChannel.Open(); // Send messages to queue which does not require session Console.WriteLine("Preparing to send messages to {0}...", SampleManager.SessionlessQueueName); Thread.Sleep(3000); SendMessages(messagingOutputChannel, messagingBinding); messagingOutputChannel.Close(); messagingChannelFactory.Close(); } catch (Exception) { if (messagingOutputChannel != null) { messagingOutputChannel.Abort(); } if (messagingChannelFactory != null) { messagingChannelFactory.Abort(); } throw; } // Wait for all receivers to receive message Thread.Sleep(TimeSpan.FromSeconds(5.0d)); Console.Clear(); // Create factory and channel using custom binding CustomBinding customBinding = new CustomBinding("customBinding"); address = SampleManager.GetEndpointAddress(SampleManager.SessionQueueName, serviceBusNamespace); IChannelFactory <IOutputChannel> customChannelFactory = null; IOutputChannel customOutputChannel = null; try { customChannelFactory = customBinding.BuildChannelFactory <IOutputChannel>(securityBehavior); customChannelFactory.Open(); customOutputChannel = customChannelFactory.CreateChannel(address); customOutputChannel.Open(); // Send messages to queue which requires session Console.Title = "Session MessageSender"; Console.WriteLine("Preparing to send messages to {0}...", SampleManager.SessionQueueName); Thread.Sleep(3000); SendMessages(customOutputChannel, customBinding); customOutputChannel.Close(); customChannelFactory.Close(); } catch (Exception) { if (customOutputChannel != null) { customOutputChannel.Abort(); } if (customChannelFactory != null) { customChannelFactory.Abort(); } throw; } } catch (Exception exception) { Console.WriteLine("Exception Occurred: {0}", exception); SampleManager.ExceptionOccurred = true; } // All messages sent Console.WriteLine("\nSender complete. Press [Enter] to exit."); Console.ReadLine(); }
static void ReceiveSessionMessages() { // Read messages from queue until queue is empty: Console.WriteLine("Reading messages from queue {0}...", SampleManager.SessionQueueName); Console.WriteLine("Receiver Type: PeekLock"); // Create listener and channel using custom binding CustomBinding customBinding = new CustomBinding("customBinding"); EndpointAddress address = SampleManager.GetEndpointAddress(SampleManager.SessionQueueName, serviceBusNamespace); TransportClientEndpointBehavior securityBehavior = new TransportClientEndpointBehavior(); securityBehavior.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(serviceBusKeyName, serviceBusKey); customBinding.GetProperty <IReceiveContextSettings>(new BindingParameterCollection()).Enabled = true; IChannelListener <IInputSessionChannel> inputSessionChannelListener = null; try { inputSessionChannelListener = customBinding.BuildChannelListener <IInputSessionChannel>(address.Uri, securityBehavior); inputSessionChannelListener.Open(); while (true) { IInputSessionChannel inputSessionChannel = null; try { // Create a new session channel for every new session available. If no more sessions available, // then the operation throws a TimeoutException. inputSessionChannel = inputSessionChannelListener.AcceptChannel(acceptSessionReceiverTimeout); inputSessionChannel.Open(); // TryReceive operation returns true if message is available otherwise it returns false. Message receivedMessage; while (inputSessionChannel.TryReceive(receiveSessionMessageTimeout, out receivedMessage)) { if (receivedMessage != null) { SampleManager.OutputMessageInfo("Receive", receivedMessage); // Since the message body contains a serialized string one can access it like this: //string soapBody = receivedMessage.GetBody<string>(); // Since the binding has ReceiveContext enabled, a manual complete operation is mandatory // if the message was processed successfully. ReceiveContext rc; if (ReceiveContext.TryGet(receivedMessage, out rc)) { rc.Complete(TimeSpan.FromSeconds(10.0d)); } else { throw new InvalidOperationException("Receiver is in peek lock mode but receive context is not available!"); } } else { // This IInputSessionChannel doesn't have any more messages break; } } // Close session channel inputSessionChannel.Close(); inputSessionChannel = null; } catch (TimeoutException) { break; } finally { if (inputSessionChannel != null) { inputSessionChannel.Abort(); } } } // Close channel listener inputSessionChannelListener.Close(); } catch (Exception) { if (inputSessionChannelListener != null) { inputSessionChannelListener.Abort(); } throw; } }