Beispiel #1
0
 /// <summary>
 /// Main function in the sample.
 /// </summary>
 /// <param name="args"></param>
 public override void SampleCall(string[] args)
 {
     try
     {
         #region Parse Arguments
         bool      verbose       = false;
         ArgParser cmdLineParser = new ArgParser();
         if (!cmdLineParser.Parse(args))
         {
             // Parse failed.
             PrintUsage(INVALID_ARGUMENTS_ERROR);
             return;
         }
         if (cmdLineParser.Config.ArgBag.ContainsKey("-v"))
         {
             verbose = true;
         }
         if (cmdLineParser.Config.ArgBag.ContainsKey("-sv"))
         {
             SOLTR_VERSION = cmdLineParser.Config.ArgBag["-sv"];
         }
         #endregion
         SEMPGet_GetVersion(cmdLineParser, verbose);
         SEMPSet_ShowStats(cmdLineParser, verbose);
     }
     catch (Exception ex)
     {
         PrintException(ex);
     }
     finally
     {
     }
 }
Beispiel #2
0
        private void SEMPSet_ShowStats(ArgParser cmdLineParser, bool verbose)
        {
            // SEMP set request
            string requestStr = " <rpc semp-version=\"soltr/" + SOLTR_VERSION + "\"> <show> <stats> <client/> </stats> </show> </rpc>";

            byte[] requestData = Encoding.UTF8.GetBytes(requestStr);
            // Create the HTTP request.
            HttpWebRequest request =
                (HttpWebRequest)WebRequest.Create("http://" +
                                                  cmdLineParser.Config.IpPort.ip +
                                                  "/SEMP");

            request.Method      = "POST";
            request.ContentType = "text/xml";
            request.Credentials =
                new NetworkCredential(cmdLineParser.Config.RouterUserVpn.user, cmdLineParser.Config.UserPassword);
            request.GetRequestStream().Write(requestData, 0, requestData.Length);
            request.GetRequestStream().Close();
            if (verbose)
            {
                Console.WriteLine("REQUEST: " + requestStr);
            }
            HttpWebResponse resp = (HttpWebResponse)request.GetResponse();

            if (resp != null)
            {
                Stream      respStream = resp.GetResponseStream();
                XmlDocument replyDoc   = new XmlDocument();
                replyDoc.Load(respStream);
                if (verbose)
                {
                    Console.WriteLine("RESPONSE: " + replyDoc.InnerXml);
                }
                XmlNode result = replyDoc.SelectSingleNode("//execute-result/@code");
                if (result != null)
                {
                    if (!"ok".Equals(result.Value))
                    {
                        Console.WriteLine("execute-result was not ok");
                    }
                    else
                    {
                        Console.WriteLine("success");

                        XmlNodeList stats = replyDoc.SelectNodes("//show/stats/client/global/stats/*");
                        foreach (XmlNode node in stats)
                        {
                            string name = node.Name.Replace('-', ' ') + ':';
                            name = name.PadRight(45);
                            Console.WriteLine("{0}{1}", name, node.InnerText);
                        }
                    }
                }
                else
                {
                    Console.WriteLine("ShowStats response does not contain result: response = " + replyDoc.InnerXml);
                }
            }
        }
Beispiel #3
0
        private void SEMPGet_GetVersion(ArgParser cmdLineParser, bool verbose)
        {
            // SEMP get request.
            string requestStr = " <rpc semp-version=\"soltr/" + SOLTR_VERSION + "\"> <show> <version> </version> </show> </rpc>";

            byte[] requestData = Encoding.UTF8.GetBytes(requestStr);
            // Create the HTTP request.
            HttpWebRequest request =
                (HttpWebRequest)WebRequest.Create("http://" +
                                                  cmdLineParser.Config.IpPort.ip +
                                                  "/SEMP");

            request.Method      = "POST";
            request.ContentType = "text/xml";
            request.Credentials =
                new NetworkCredential(cmdLineParser.Config.RouterUserVpn.user, cmdLineParser.Config.UserPassword);
            request.GetRequestStream().Write(requestData, 0, requestData.Length);
            request.GetRequestStream().Close();
            if (verbose)
            {
                Console.WriteLine("REQUEST: " + requestStr);
            }
            HttpWebResponse resp = (HttpWebResponse)request.GetResponse();

            if (resp != null)
            {
                Stream      respStream = resp.GetResponseStream();
                XmlDocument replyDoc   = new XmlDocument();
                replyDoc.Load(respStream);
                if (verbose)
                {
                    Console.WriteLine("RESPONSE: " + replyDoc.InnerXml);
                }
                XmlNode result = replyDoc.SelectSingleNode("//execute-result/@code");
                if (result != null)
                {
                    if (!"ok".Equals(result.Value))
                    {
                        Console.WriteLine("execute-result was not ok");
                    }
                    else
                    {
                        Console.WriteLine("success");
                    }
                }
                else
                {
                    Console.WriteLine("getVersion response does not contain result: response = " + replyDoc.InnerXml);
                }
            }
        }
        /// <summary>
        /// Triggers the connection of secondary Sessions.
        /// </summary>
        private void triggerSecondaryConnection(ArgParser cmdLineParser)  
        {
            ContextProperties contextProps = new ContextProperties();
            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);
            IContext context = null;
            ISession session = null;
            context = ContextFactory.Instance.CreateContext(contextProps, null);
		    ITopic dummyTopic = ContextFactory.Instance.CreateTopic("dummy/topic");
            session = context.CreateSession(sessionProps,
                SampleUtils.HandleMessageEvent,
                SampleUtils.HandleSessionEvent);
            session.Connect();
            session.Subscribe(dummyTopic,true);
            session.Dispose();
	    }
        /// <summary>
        /// Parse the sample's extra command line arguments.
        /// </summary>
        /// <param name="args"></param>
        private bool SampleParseArgs(ArgParser cmdLineParser)
        {
            string requestTopicArgOption = "-rt";

            try
            {
                requestTopicStr = cmdLineParser.Config.ArgBag[requestTopicArgOption];
            }
            catch (KeyNotFoundException)
            {
                Console.WriteLine(String.Format("Invalid command line argument '{0}' ", requestTopicStr));
                return(false);
            }
            return(true);
        }
 /// <summary>
 /// Parse the sample's extra command line arguments.
 /// </summary>
 /// <param name="args"></param>
 private bool SampleParseArgs(ArgParser cmdLineParser)
 {
     cmdLineParser.Config.startSequenceId = null;
     cmdLineParser.Config.endSequenceId   = null;
     try
     {
         string startSequenceIdStr = cmdLineParser.Config.ArgBag["-startSequenceId"];
         Int64  startSequence      = Convert.ToInt64(startSequenceIdStr);
         cmdLineParser.Config.startSequenceId = new Nullable <Int64>(startSequence);
         if (cmdLineParser.Config.endSequenceId == null)
         {
             cmdLineParser.Config.endSequenceId = new Nullable <Int64>(0);
         }
     }
     catch (KeyNotFoundException)
     {
         // Default
     }
     catch (Exception ex)
     {
         Console.WriteLine("Invalid command line argument '-startSequenceId' " + ex.Message);
         return(false);
     }
     try
     {
         string endSequenceIdStr = cmdLineParser.Config.ArgBag["-endSequenceId"];
         Int64  endSequence      = Convert.ToInt64(endSequenceIdStr);
         cmdLineParser.Config.endSequenceId = new Nullable <Int64>(endSequence);
         if (cmdLineParser.Config.startSequenceId == null)
         {
             cmdLineParser.Config.startSequenceId = new Nullable <Int64>(0);
         }
     }
     catch (KeyNotFoundException)
     {
         // Default
     }
     catch (Exception ex)
     {
         Console.WriteLine("Invalid command line argument '-endSequenceId' " + ex.Message);
         return(false);
     }
     return(true);
 }
        /// <summary>
        /// Parse the sample's extra command line arguments.
        /// </summary>
        /// <param name="args"></param>
        private bool SampleParseArgs(ArgParser cmdLineParser)
        {
            // options
            string requestTopicArgOption = "-rt";
            string requestQueueArgOption = "-rq";

            // arguments
            string requestTopic = null;
            string requestQueue = null;

            try
            {
                requestTopic = cmdLineParser.Config.ArgBag[requestTopicArgOption];
            }
            catch (KeyNotFoundException) { }
            try
            {
                requestQueue = cmdLineParser.Config.ArgBag[requestQueueArgOption];
            }
            catch (KeyNotFoundException) { }

            // Either a topic or a queue but not both
            if (requestQueue != null && requestTopic != null)
            {
                Console.WriteLine("You must specify -rt or -rq but not both");
                return(false);
            }
            else if (requestQueue == null && requestTopic == null)
            {
                Console.WriteLine("Missing required arguments: -rt or -rq");
                return(false);
            }
            if (requestQueue != null)
            {
                serviceQueue = ContextFactory.Instance.CreateQueue(requestQueue);
            }
            else
            {
                serviceTopic = ContextFactory.Instance.CreateTopic(requestTopic);
            }
            return(true);
        }
 /// <summary>
 /// Parse the sample's extra command line arguments.
 /// </summary>
 /// <param name="args"></param>
 private bool SampleParseArgs(ArgParser cmdLineParser)
 {
     cmdLineParser.Config.DestMode = DestMode.TOPIC;
     cmdLineParser.Config.NumberOfMessagesToPublish = 50;
     try
     {
         string strnumOfMessagesToPublish = cmdLineParser.Config.ArgBag["-mn"];
         int    numOfMessagesToPublish    = Convert.ToInt32(strnumOfMessagesToPublish);
         cmdLineParser.Config.NumberOfMessagesToPublish = numOfMessagesToPublish;
     }
     catch (KeyNotFoundException)
     {
         // Default
     }
     catch (Exception ex)
     {
         Console.WriteLine("Invalid command line argument 'mn' " + ex.Message);
         return(false);
     }
     return(true);
 }
Beispiel #9
0
        /// <summary>
        /// The main function in the sample.
        /// </summary>
        /// <param name="args"></param>
        public override void SampleCall(string[] args)
        {
            #region Parse Arguments
            ArgParser cmdLineParser = new ArgParser();
            if (!cmdLineParser.Parse(args))
            {
                // parse failed
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }
            #endregion

            #region Initialize properties from command line
            // Initialize the properties.
            ContextProperties contextProps = new ContextProperties();
            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);
            #endregion

            // Define IContext.
            IContext context = null;
            try
            {
                InitContext(cmdLineParser.LogLevel);
                Console.WriteLine("About to create the context ...");
                context = ContextFactory.Instance.CreateContext(contextProps, null);
                Console.WriteLine("Context successfully created. ");

                // We will create two sessions, and give them different msg receiver callbacks.
                IdPrintingReceiver recvCallback1 = new IdPrintingReceiver("Client 1");
                IdPrintingReceiver recvCallback2 = new IdPrintingReceiver("Client 2");

                Console.WriteLine("About to create the Sessions...");
                session = context.CreateSession(sessionProps,
                                                recvCallback1.HandleMessageEvent,
                                                SampleUtils.HandleSessionEvent);
                session2 = context.CreateSession(sessionProps,
                                                 recvCallback2.HandleMessageEvent,
                                                 SampleUtils.HandleSessionEvent);
                Console.WriteLine("Sessions successfully created.");

                Console.WriteLine("About to connect the Session...");
                if (session.Connect() == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Session 1 successfully connected.");
                    Console.WriteLine(GetRouterInfo(session));
                }

                Console.Write(String.Format("Check for capability: {0}... ", CapabilityType.SUBSCRIPTION_MANAGER));
                if (!session.IsCapable(CapabilityType.SUBSCRIPTION_MANAGER))
                {
                    Console.WriteLine("Not Supported. Exiting.");
                    return;
                }
                else
                {
                    Console.WriteLine("OK");
                }
                // Appliance supports this sample, connect 2nd session.
                if (session2.Connect() == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Session 2 successfully connected");
                }

                // Create the Topic to subscribe and send messages to.
                ITopic serviceTopic = ContextFactory.Instance.CreateTopic(topic_str);

                // Once clients have been connected, their ClientNames can be extracted.
                ContextFactory cf             = ContextFactory.Instance;
                string         strClientName1 = (string)session.GetProperty(SessionProperties.PROPERTY.ClientName);
                string         strClientName2 = (string)session2.GetProperty(SessionProperties.PROPERTY.ClientName);
                IClientName    clientName1    = cf.CreateClientName(strClientName1);
                IClientName    clientName2    = cf.CreateClientName(strClientName2);

                Console.WriteLine("Client '{0}' adding subscription on behalf of client '{1}'", clientName1, clientName2);
                session.Subscribe(clientName2, serviceTopic, SubscribeFlag.RequestConfirm | SubscribeFlag.WaitForConfirm, null);
                Console.WriteLine("OK. Added subscription '{0}'.", serviceTopic);
                IMessage messageOne = SampleUtils.CreateMessage(cmdLineParser.Config, session);
                messageOne.Destination = serviceTopic;

                Console.WriteLine("Sending a message from Client 1...");
                session.Send(messageOne);
                Console.WriteLine("Sent.");
                Thread.Sleep(500);
                Console.WriteLine("Done.");
            } catch (Exception ex) {
                PrintException(ex);
            }
            finally
            {
                if (session != null)
                {
                    session.Dispose();
                }
                if (session2 != null)
                {
                    session2.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after.
                CleanupContext();
            }
        }
        /// <summary>
        /// The main function in the sample.
        /// </summary>
        /// <param name="args"></param>
        public override void SampleCall(string[] args)
        {
            #region Parse Arguments
            ArgParser cmdLineParser = new ArgParser();
            if (!cmdLineParser.Parse(args))
            {
                // parse failed
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }
            #endregion

            #region Initialize properties from command line
            // Initialize the properties
            ContextProperties contextProps = new ContextProperties();
            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);
            #endregion

            // Define context and session
            IContext context = null;
            ISession session = null;
            try
            {
                InitContext(cmdLineParser.LogLevel);
                Console.WriteLine("About to connect to appliance. \n[Ensure selected message-vpn has 'Publish Client Event Messages' enabled ]");
                Console.WriteLine("About to create the context ...");
                context = ContextFactory.Instance.CreateContext(contextProps, null);
                Console.WriteLine("Context successfully created. ");

                Console.WriteLine("About to create the session ...");
                session = context.CreateSession(sessionProps,
                    HandleMessageEvent,
                    SampleUtils.HandleSessionEvent);
                Console.WriteLine("Session successfully created.");

                Console.WriteLine("About to connect the session ...");

                if (session.Connect() == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Session successfully connected");
                    Console.WriteLine(GetRouterInfo(session));
                }

                // Build an event monitoring topic for client connect events and
                // subscribe to it.
                string routerHostname = (string) session.GetCapability(CapabilityType.PEER_ROUTER_NAME).Value.Value;
                string strEventTopic = string.Format("#LOG/INFO/CLIENT/{0}/CLIENT_CLIENT_CONNECT/>", routerHostname);
                ITopic eventTopic = ContextFactory.Instance.CreateTopic(strEventTopic);
                Console.WriteLine(string.Format("Adding subscription to '{0}'...", strEventTopic));
                try 
                {
                    if (session.Subscribe(eventTopic, true) == ReturnCode.SOLCLIENT_OK) 
                    {
                        Console.WriteLine("Successfully added event topic subscription");
                    }
                } 
                catch (OperationErrorException opex) 
                {
                    Console.WriteLine(string.Format("Failed to add susbscription to to event topic"));
                    PrintException(opex);
                }
                Console.WriteLine("Waiting to receive events ...");
                triggerSecondaryConnection(cmdLineParser);
                /* sleep to allow reception of event */
                Thread.Sleep(1000);
            }
            catch (Exception ex)
            {
                PrintException(ex);
            }
            finally
            {
                if (session != null)
                {
                    session.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after. 
                CleanupContext();
            }
        }
        /// <summary>
        /// The main function in the sample.
        /// </summary>
        /// <param name="args"></param>
        public override void SampleCall(string[] args)
        {
            #region Parse Arguments
            ArgParser cmdLineParser = new ArgParser();
            if (!cmdLineParser.ParseCacheSampleArgs(args))
            {
                // Parse failed.
                Console.WriteLine("Exception: " + INVALID_ARGUMENTS_ERROR);
                Console.Write(ArgParser.CacheArgUsage);
                return;
            }
            #endregion

            #region Initialize properties from command line
            // Initialize the properties.
            ContextProperties contextProps = new ContextProperties();
            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);
            #endregion

            // Context and session.
            IContext context = null;
            ISession session = null;
            try
            {
                InitContext(cmdLineParser.LogLevel);
                Console.WriteLine("About to create the context ...");
                context = ContextFactory.Instance.CreateContext(contextProps, null);
                Console.WriteLine("Context successfully created. ");

                Console.WriteLine("About to create the Session ...");
                session = context.CreateSession(sessionProps,
                                                SampleUtils.HandleMessageEvent,
                                                SampleUtils.HandleSessionEvent);
                Console.WriteLine("Session successfully created.");

                Console.WriteLine("About to connect the session ...");
                if (session.Connect() == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Session successfully connected");
                    Console.WriteLine(GetRouterInfo(session));
                }
                #region PUBLISH A MESSAGE (just to make sure there is one cached)

                ITopic topic = null;
                topic = ContextFactory.Instance.CreateTopic(SampleUtils.SAMPLE_TOPIC);
                IMessage message = ContextFactory.Instance.CreateMessage();
                message.Destination      = topic;
                message.DeliveryMode     = MessageDeliveryMode.Direct;
                message.BinaryAttachment = Encoding.ASCII.GetBytes(SampleUtils.MSG_ATTACHMENTTEXT);
                session.Send(message);
                #endregion

                CacheSessionConfiguration cacheConfig  = (CacheSessionConfiguration)cmdLineParser.Config;
                ICacheSession             cacheSession = SampleUtils.newCacheSession(session, cacheConfig);
                ReturnCode rc = cacheSession.SendCacheRequest(1, topic, cacheConfig.Subscribe, cacheConfig.Action);
                Console.WriteLine("Cache Response: " + rc.ToString());
                IDictionary <Stats_Rx, Int64> stats = session.GetRxStats();
                SampleUtils.PrintRxStats(stats);
                Console.WriteLine("\nDone");
            }
            catch (Exception ex)
            {
                PrintException(ex);
            }
            finally
            {
                if (session != null)
                {
                    session.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after.
                CleanupContext();
            }
        }
        public override void SampleCall(string[] args)
        {
            // Parse arguments and initialize Session properties.
            ArgParser cmdLineParser = new ArgParser();

            if (!cmdLineParser.Parse(args))
            {
                // Parse failed.
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }
            // Create Session properties from the command line options.
            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);

            try
            {
                InitContext(cmdLineParser.LogLevel);

                // Create and connect 'sessionA' with No Local delivery set to false.
                sessionProps.NoLocal = false; // No Local is set to 'false' by default.
                InitializeAndAssertCapabilities(ref context, ref sessionA, "sessionA", sessionProps);

                // Create and connect 'sessionB' with No Local delivery set to true.
                sessionProps.NoLocal = true; // <-- this is how we set NoLocal at the session level
                InitializeAndAssertCapabilities(ref context, ref sessionB, "sessionB", sessionProps);

                // Create a Flow to a temporary Queue within sessionA.
                IQueue         queue     = sessionB.CreateTemporaryQueue();
                FlowProperties flowProps = new FlowProperties();
                flowProps.NoLocal      = true; // <-- this is how we set NoLocal at the flow level
                flowProps.BindBlocking = true;
                flowA = sessionA.CreateFlow(flowProps, queue, null, HandleMessageEvent, SampleUtils.HandleFlowEvent);
                flowA.Start();

                // Add a Topic subscription to sessionB.
                ITopic topic = ContextFactory.Instance.CreateTopic(SampleUtils.SAMPLE_TOPIC);
                sessionB.Subscribe(topic, true /*wait for confirm*/);

                // Publish a Direct message to Topic T from each Session; verify it is not delivered locally.
                IMessage msg = ContextFactory.Instance.CreateMessage();
                msg.BinaryAttachment = Encoding.ASCII.GetBytes(SampleUtils.MSG_ATTACHMENTTEXT);
                msg.Destination      = topic;
                msg.DeliveryMode     = MessageDeliveryMode.Direct;
                // Send from 'sessionA'.
                Console.WriteLine(string.Format("\nSending a direct message to topic '{0}' from sessionA", topic.ToString()));
                sessionA.Send(msg);
                Thread.Sleep(500);
                PrintCounters();
                Console.WriteLine(string.Format("Expecting msgCounterForSessionB to be 1, it's '{0}'", msgCounterForSessionB));
                Console.WriteLine(string.Format("Expecting msgCounterForSessionA to be 0, it's '{0}'", msgCounterForSessionA));
                ResetCounters();
                // Send from 'sessionB'.
                Console.WriteLine(string.Format("\nSending a direct message to topic '{0}' from sessionB", topic.ToString()));
                sessionB.Send(msg);
                Thread.Sleep(500);
                PrintCounters();
                Console.WriteLine(string.Format("Expecting msgCounterForSessionA to be 0, it's '{0}'", msgCounterForSessionA));
                Console.WriteLine(string.Format("Expecting msgCounterForSessionB to be 0, it's '{0}'", msgCounterForSessionB));
                ResetCounters();


                // Publish a message to the Queue on each Session; verify it is not delivered locally.
                msg.Destination  = queue;
                msg.DeliveryMode = MessageDeliveryMode.Persistent;
                // Send from 'sessionA'.
                Console.WriteLine(string.Format("\nSending a persistent message to queue '{0}' from sessionA", queue.ToString()));
                sessionA.Send(msg);
                Thread.Sleep(500);
                PrintCounters();
                Console.WriteLine(string.Format("Expecting msgCounterForFlowA to be 0, it's '{0}'", msgCounterForFlowA));
                ResetCounters();
                // Send from 'sessionB'.
                Console.WriteLine(string.Format("\nSending a persistent message to queue '{0}' from sessionB", queue.ToString()));
                sessionB.Send(msg);
                Thread.Sleep(500);
                PrintCounters();
                Console.WriteLine(string.Format("Expecting msgCounterForFlowA to be 1, it's '{0}'", msgCounterForFlowA));
                ResetCounters();
                Console.WriteLine("\nDone");
            }
            catch (Exception ex)
            {
                PrintException(ex);
            }
            finally
            {
                if (flowA != null)
                {
                    flowA.Dispose();
                }
                if (sessionA != null)
                {
                    sessionA.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after.
                CleanupContext();
            }
        }
        /// <summary>
        /// Main sample method
        /// </summary>
        /// <param name="args"></param>
        public override void SampleCall(string[] args)
        {
            #region Parse Arguments
            ArgParser cmdLineParser = new ArgParser();
            if (!cmdLineParser.Parse(args))
            {
                // parse failed
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }
            cmdLineParser.Config.SetDestMode(DestMode.TOPIC);
            cmdLineParser.Config.DeliveryMode = MessageDeliveryMode.Direct;
            #endregion

            #region Initialize properties from command line.
            // Initialize the properties.
            ContextProperties contextProps = new ContextProperties();

            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);
            #endregion

            // Define IContext and ISession.
            IContext context = null;
            ISession session = null;
            IMessage message = null;
            try
            {
                InitContext();
                Console.WriteLine("About to create the context ...");
                context = ContextFactory.Instance.CreateContext(contextProps, null);
                Console.WriteLine("Context successfully created. ");
                Console.WriteLine("About to create the session ...");
                session = context.CreateSession(sessionProps,
                                                SampleUtils.HandleMessageEvent,
                                                SampleUtils.HandleSessionEvent);
                Console.WriteLine("Session successfully created.");

                Console.WriteLine("About to connect the session ...");
                if (session.Connect() == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Session successfully connected");
                    Console.WriteLine(GetRouterInfo(session));
                }
                message = SampleUtils.CreateMessage(cmdLineParser.Config, session);
                message.DeliveryMode = MessageDeliveryMode.Direct;
                message.Destination  = ContextFactory.Instance.CreateTopic(SampleUtils.SAMPLE_TOPIC);
                session.Send(message);
                Console.WriteLine("\nDone");
            }
            catch (Exception ex)
            {
                PrintException(ex);
            }
            finally
            {
                if (session != null)
                {
                    session.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after.
                CleanupContext();
            }
        }
        /// <summary>
        /// The main function in the sample.
        /// </summary>
        /// <param name="args"></param>
        public override void SampleCall(string[] args)
        {
            #region Parse Arguments
            string    routerHostname = null;
            bool      verbose        = false;
            ArgParser cmdLineParser  = new ArgParser();
            if (!cmdLineParser.Parse(args))
            {
                // Parse failed.
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }
            if (cmdLineParser.Config.ArgBag.ContainsKey("-v"))
            {
                verbose = true;
            }
            if (cmdLineParser.Config.ArgBag.ContainsKey("-sv"))
            {
                SOLTR_VERSION = cmdLineParser.Config.ArgBag["-sv"];
            }
            #endregion

            #region Initialize properties from command line
            // Initialize the properties.
            ContextProperties contextProps = new ContextProperties();
            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);
            #endregion

            // Define Context and Session.
            IContext context = null;
            ISession session = null;
            try
            {
                InitContext(cmdLineParser.LogLevel);
                Console.WriteLine("About to connect to appliance. \n[Ensure selected message-vpn is configured as the appliance's management message-vpn.]");
                Console.WriteLine("[Ensure selected message-vpn has semp-over-msgbus enabled]");
                Console.WriteLine("About to create the Context ...");
                context = ContextFactory.Instance.CreateContext(contextProps, null);
                Console.WriteLine("Context successfully created. ");

                Console.WriteLine("About to create the Session ...");
                session = context.CreateSession(sessionProps,
                                                SampleUtils.HandleMessageEvent,
                                                SampleUtils.HandleSessionEvent);
                Console.WriteLine("Session successfully created.");

                Console.WriteLine("About to connect the Session ...");

                if (session.Connect() == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Session successfully connected");
                    Console.WriteLine(GetRouterInfo(session));
                }

                // The SEMP requestStr Topic is built using the appliance's host name.
                //
                // The SEMP requestStr we perform asks to show all Queues, and return five
                // results at a time. It can be easily adapted to perform any other type
                // of SEMP show commands.

                ICapability cap_routerName = session.GetCapability(CapabilityType.PEER_ROUTER_NAME);
                if (cap_routerName.Value == null || cap_routerName.Value.Value.Equals(""))
                {
                    Console.WriteLine("Unable to load PEER_ROUTER_NAME. (Requires r4.6+ SolOS-TR appliance.)");
                    return;
                }
                // PEER_ROUTER_NAME is an ISDTField of type string.
                routerHostname = (string)cap_routerName.Value.Value;

                string SEMP_TOPIC_STRING = string.Format("#SEMP/{0}/SHOW", routerHostname);
                Console.WriteLine(string.Format("Loaded appliance hostname: '{0}', SEMP Topic: '{1}'", routerHostname, SEMP_TOPIC_STRING));
                ITopic SEMP_TOPIC       = ContextFactory.Instance.CreateTopic(SEMP_TOPIC_STRING);
                string SEMP_SHOW_QUEUES = "<rpc semp-version=\"soltr/" + SOLTR_VERSION +
                                          "\"><show><queue><name>*</name><count/><num-elements>" +
                                          NUM_OF_ELEMENTS_PER_REQUEST + "</num-elements></queue></show></rpc>";
                string MORECOOKIE_START = "<more-cookie>";
                string MORECOOKIE_END   = "</more-cookie>";

                // Perform requests in a loop. Each new requestStr uses the
                // more-cookie from the previous response.
                //
                string next_request = SEMP_SHOW_QUEUES;
                while (next_request != null)
                {
                    // Create the requestStr message.
                    IMessage requestMsg = ContextFactory.Instance.CreateMessage();
                    requestMsg.Destination      = SEMP_TOPIC;
                    requestMsg.BinaryAttachment = Encoding.UTF8.GetBytes(next_request);
                    if (verbose)
                    {
                        Console.WriteLine("REQUEST: " + next_request); // triggered by -v
                    }
                    // Make the requestStr.
                    IMessage   replyMsg;
                    ReturnCode rc = session.SendRequest(requestMsg, out replyMsg, 5000);
                    if (rc == ReturnCode.SOLCLIENT_FAIL)
                    {
                        Console.WriteLine("Failed to send a requestStr.");
                        break;
                    }
                    byte[] binaryAttachment = null;
                    if (replyMsg != null)
                    {
                        binaryAttachment = replyMsg.BinaryAttachment;
                    }
                    else
                    {
                        Console.WriteLine("Failed to receive a SEMP reply.");
                        return;
                    }
                    if (binaryAttachment != null)
                    {
                        string replyStr = Encoding.UTF8.GetString(binaryAttachment);
                        // Is this user allowed to make such SEMP requestStr?
                        if (replyStr.IndexOf("permission-error") != -1)
                        {
                            Console.WriteLine("Permission error, aborting");
                            Console.WriteLine("REPLY: " + replyStr);
                            return;
                        }
                        if (verbose)
                        {
                            Console.WriteLine("REPLY: " + replyStr); // triggered by -v
                        }
                        XmlDocument replyDoc = new XmlDocument();
                        replyDoc.LoadXml(replyStr);
                        // Result
                        XmlNode result = replyDoc.SelectSingleNode("//execute-result/@code");
                        Console.WriteLine("Result: " + result.Value);
                        if (!"ok".Equals(result.Value))
                        {
                            Console.WriteLine("Failure occured, aborting");
                            break;
                        }

                        // List queues. Select text nodes under
                        // <queues><queue><name>NAME</name></queue><queues> in the
                        // response.
                        XmlNodeList queues = replyDoc.SelectNodes("//show/queue/queues/queue/name");
                        foreach (XmlNode node in queues)
                        {
                            Console.WriteLine("Queue= " + node.InnerText);
                        }
                        // Check for more data to requestStr with more-cookie.
                        int start_idx = replyStr.IndexOf(MORECOOKIE_START);
                        if (start_idx >= 0)
                        {
                            // More data available.
                            int end_idx = replyStr.IndexOf(MORECOOKIE_END);
                            next_request = replyStr.Substring(start_idx + MORECOOKIE_START.Length, end_idx - (start_idx + MORECOOKIE_START.Length));
                            Console.WriteLine("Found more-cookie...");
                        }
                        else
                        {
                            // Abort the loop; no more data.
                            next_request = null;
                        }
                    }
                    else
                    {
                        // Abort the loop.
                        Console.WriteLine("Reply message did not contain SEMP reply");
                        break;
                    }
                }             // End requestor loop.
            }
            catch (Exception ex)
            {
                PrintException(ex);
            }
            finally
            {
                if (session != null)
                {
                    session.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after.
                CleanupContext();
            }
        }
        public override void SampleCall(string[] args)
        {
            // Resources used in this sample.
            IContext context = null;
            ISession session = null;
            IQueue   queue   = null;
            IQueue   dmq     = null; // the DMQ

            // Parse arguments and initialize Session properties.
            ArgParser cmdLineParser = new ArgParser();

            if (!cmdLineParser.Parse(args))
            {
                // Parse failed.
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }
            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);

            try
            {
                InitContext(cmdLineParser.LogLevel);
                // Initialize the Context, connect the Session, and assert capabilities.
                InitializeAndAssertCapabilities(ref context, ref session, sessionProps);

                // Provision a new Queue and #DEAD_MSG if it does not already exist.
                string queueName = SampleUtils.SAMPLE_QUEUE + (new Random()).Next(1000);
                queue = ProvisionQueue(session, queueName, true);
                dmq   = ProvisionQueue(session, "#DEAD_MSG_QUEUE", false);

                // Publish a couple of messages to the Queue.
                IMessage msg = ContextFactory.Instance.CreateMessage();
                msg.BinaryAttachment = Encoding.ASCII.GetBytes(SampleUtils.MSG_ATTACHMENTTEXT);
                msg.DeliveryMode     = MessageDeliveryMode.Persistent;
                msg.Destination      = queue;
                // Send three messages:
                // message one (1):
                // TimeToLive = 2000 (2 secs) and DMQEligible is true
                // In this case, when the message expires, it will be moved to the DMQ
                msg.TimeToLive  = 2000;
                msg.DMQEligible = true;
                msg.UserData    = new byte[] { (byte)1 };
                session.Send(msg);

                // Send three messages:
                // message two (2):
                // TimeToLive = 5000 (5 secs) and DMQEligible is false
                // In this case, when the message expires, it will be deleted from the Queue,
                // but it will not end up on the DMQ.
                msg.TimeToLive  = 5000;
                msg.DMQEligible = false;
                msg.UserData    = new byte[] { (byte)2 };
                session.Send(msg);
                long expiration = msg.Expiration;

                // message three (3):
                // TimeToLive = 0 , DMQEligible is true and Expiration=(within 5 secs of the current time)
                msg.TimeToLive = 0;
                msg.Expiration = expiration;
                msg.UserData   = new byte[] { (byte)3 };
                session.Send(msg);

                // Start a flow to the Queue and verify that all three messages are there.
                DumpMessagesReceivedFromQueue(session, queue, 1000, false);

                // Wait for two seconds.
                Console.WriteLine("\n\nWaiting for 2 secs\n\n");
                Thread.Sleep(2000);

                // Start a flow to queue and verify that message one is no longer there, and
                // messages two and three are still there.
                DumpMessagesReceivedFromQueue(session, queue, 1000, false);

                // Wait for two seconds.
                Console.WriteLine("\n\nWaiting for 2 more secs\n\n");
                Thread.Sleep(2000);

                // Start a flow to the Queue and verify that message two is no longer there,
                // but message 3 is still there.
                DumpMessagesReceivedFromQueue(session, queue, 1000, false);

                // Start a flow to the DMQ and verify that message one (who has DMQEligible=true)
                // is there, but not message two or three.
                DumpMessagesReceivedFromQueue(session, dmq, 1000, true);

                Console.WriteLine("\nDone");
            }
            catch (Exception ex)
            {
                PrintException(ex);
                Console.WriteLine("Exiting");
            }
            finally
            {
                if (session != null)
                {
                    session.Deprovision(queue, ProvisionFlag.WaitForConfirm, null);
                    session.Deprovision(dmq, ProvisionFlag.WaitForConfirm, null);
                    session.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after
                CleanupContext();
            }
        }
Beispiel #16
0
        public override void SampleCall(string[] args)
        {
            #region Parse Arguments
            ArgParser cmdLineParser = new ArgParser();
            if (!cmdLineParser.Parse(args))
            {
                // Parse failed.
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }
            if (!SampleParseArgs(cmdLineParser))
            {
                // Parse failed for sample's arguments.
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }
            #endregion

            #region Initialize properties from command line
            // Initialize the properties.
            ContextProperties contextProps = new ContextProperties();
            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);
            // Uncomment the line below if you wish to send using a non-blocking mode
            // sessionProps.SendBlocking = false;
            #endregion

            // Define IContext and ISession.
            IContext context = null;
            ISession session = null;

            // Create the LinkedList.
            LinkedList <MessageRecord> msgRecords =
                new LinkedList <MessageRecord>();

            try
            {
                InitContext(cmdLineParser.LogLevel);
                Console.WriteLine("About to create the context ...");
                context = ContextFactory.Instance.CreateContext(contextProps, null);
                Console.WriteLine("Context successfully created. ");
                Console.WriteLine("About to create the session ...");
                session = context.CreateSession(sessionProps,
                                                SampleUtils.HandleMessageEvent,
                                                HandleSessionEvent);
                Console.WriteLine("Session successfully created.");

                // Connect the session.
                Console.WriteLine("About to connect the session ...");
                if (session.Connect() == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Session successfully connected");
                    Console.WriteLine(GetRouterInfo(session));
                }

                // Validate required capabilities.
                if (!session.IsCapable(CapabilityType.PUB_GUARANTEED))
                {
                    Console.WriteLine(string.Format("This sample requires capability '{0}' to be supported", CapabilityType.PUB_GUARANTEED));
                    return;
                }

                // Send cmdLineParser.Config.NumberOfMessagesToPublish messages.
                for (int i = 0; i < cmdLineParser.Config.NumberOfMessagesToPublish; i++)
                {
                    // Allocate a new message.
                    IMessage message = SampleUtils.CreateMessage(cmdLineParser.Config, session);
                    message.DeliveryMode = MessageDeliveryMode.Persistent;
                    try
                    {
                        // Create a record, and set it as CorrelationKey.
                        MessageRecord msgRecord = new MessageRecord(message);
                        message.CorrelationKey = msgRecord;
                        ReturnCode rc = session.Send(message);
                        Console.WriteLine("Sending message " + i + ": " + rc);
                        if (rc == ReturnCode.SOLCLIENT_OK)
                        {
                            // Add it to the list of send message records and send it.
                            msgRecord.MessageId = i;
                            msgRecords.AddLast(msgRecord);
                        }
                        else
                        {
                            // The message was not sent, free it up
                            message.Dispose();
                        }
                    }
                    catch (OperationErrorException opex)
                    {
                        // Ignore OperationErrorException if you don't want the publisher
                        // to abort on transient send errors
                        Console.WriteLine("Got an excpetion " + opex.ReturnCode);
                        message.Dispose();
                        continue;
                    }
                    // Sleep for 500 msecs and check to see if the message was acknowledged (positively or negatively).
                    Thread.Sleep(100);
                    while (msgRecords.First != null && msgRecords.First.Value.Acked)
                    {
                        MessageRecord record = msgRecords.First.Value;
                        msgRecords.RemoveFirst();
                        Console.WriteLine(
                            string.Format("Freeing memory for message {0}, Result: Acked ({1}), Accepted ({2})\n",
                                          record.MessageId, record.Acked, record.Accepted));
                        record.Message.Dispose();
                    }
                }
            }
            catch (Exception ex)
            {
                PrintException(ex);
            }
            finally
            {
                Thread.Sleep(3000);
                // There should not be any left in the list, but just in case.
                foreach (MessageRecord record in msgRecords)
                {
                    Console.WriteLine(
                        string.Format("Freeing memory for message {0}, Result: Acked ({1}), Accepted ({2})\n",
                                      record.MessageId, record.Acked, record.Accepted));
                    record.Message.Dispose();
                }
                if (session != null)
                {
                    session.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after.
                CleanupContext();
            }
        }
        /// <summary>
        /// Main entry point to the sample
        /// </summary>
        /// <param name="args"></param>
        public override void SampleCall(string[] args)
        {
            // Parse command line arguments
            ArgParser cmdLineParser = new ArgParser();

            if (!cmdLineParser.Parse(args) || !SampleParseArgs(cmdLineParser))
            {
                // Parse failed.
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }

            // Create the API components: starting with the properties
            ContextProperties contextProps = new ContextProperties();
            SessionProperties sessionProps = new SessionProperties();

            sessionProps.Host     = cmdLineParser.Config.IpPort.ip;
            sessionProps.UserName = cmdLineParser.Config.RouterUserVpn.user;
            sessionProps.Password = cmdLineParser.Config.UserPassword;
            sessionProps.SSLValidateCertificate = false;
            sessionProps.ReconnectRetries       = 3;
            if (cmdLineParser.Config.RouterUserVpn.vpn != null)
            {
                sessionProps.VPNName = cmdLineParser.Config.RouterUserVpn.vpn;
            }
            if (cmdLineParser.Config.Compression)
            {
                /* Compression is set as a number from 0-9, where 0 means "disable
                 * compression", and 9 means max compression. The default is no
                 * compression.
                 * Selecting a non-zero compression level auto-selects the
                 * compressed SMF port on the appliance, as long as no SMF port is
                 * explicitly specified. */
                sessionProps.CompressionLevel = 9;
            }

            // Create and connect the API components: create the context and session objects
            IContext context = null;

            session = null;
            try
            {
                // Creating the context
                InitContext(cmdLineParser.LogLevel);
                Console.WriteLine("Creating the context ...");
                context = ContextFactory.Instance.CreateContext(contextProps, null);

                // Creating the session
                Console.WriteLine("Creating the session ...");
                session = context.CreateSession(sessionProps, HandleRequestMessage, SampleUtils.HandleSessionEvent);

                // Connecting the session
                Console.WriteLine("Connecting the session ...");
                if (session.Connect() == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Session successfully connected");
                }

                // Add subscription to request topic
                ITopic listenTopic = ContextFactory.Instance.CreateTopic(requestTopicStr);
                Console.WriteLine("Adding subscription to {0}", requestTopicStr);
                if (session.Subscribe(listenTopic, true) == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Listening for request messages ... Press any key(except for Ctrl+C) to exit");
                }
                Console.In.Read();
            }
            catch (Exception ex)
            {
                PrintException(ex);
            }
            finally
            {
                if (session != null)
                {
                    session.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after.
                CleanupContext();
            }
        }
        /// <summary>
        /// Main function in the sample.
        /// </summary>
        /// <param name="args"></param>
        public override void SampleCall(string[] args)
        {
            #region Parse Arguments
            ArgParser cmdLineParser = new ArgParser();

            if (!cmdLineParser.ParseCacheSampleArgs(args))
            {
                Console.WriteLine("Exception: " + INVALID_ARGUMENTS_ERROR);
                Console.Write(ArgParser.CacheArgUsage);
                return;
            }
            if (!SampleParseArgs(cmdLineParser))
            {
                // Parse failed for sample's arguments.
                Console.WriteLine("Exception: " + INVALID_ARGUMENTS_ERROR);
                Console.Write(ArgParser.CacheArgUsage);
                return;
            }
            #endregion

            #region Initialize properties from command line
            // Initialize the properties.
            ContextProperties contextProps = new ContextProperties();
            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);
            #endregion

            // Context and session.
            IContext context = null;
            ISession session = null;
            try
            {
                InitContext(cmdLineParser.LogLevel);
                Console.WriteLine("About to create the context ...");
                context = ContextFactory.Instance.CreateContext(contextProps, null);
                Console.WriteLine("Context successfully created. ");

                Console.WriteLine("About to create the session ...");
                session = context.CreateSession(sessionProps,
                                                SampleUtils.HandleMessageEvent,
                                                SampleUtils.HandleSessionEvent);
                Console.WriteLine("Session successfully created.");

                Console.WriteLine("About to connect the session ...");
                if (session.Connect() == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Session successfully connected");
                    Console.WriteLine(GetRouterInfo(session));
                }
                if (session.IsCapable(CapabilityType.SUPPORTS_XPE_SUBSCRIPTIONS))
                {
                    Console.WriteLine("This sample requires a SolOS-TR version of the appliance, aborting");
                    return;
                }
                #region PUBLISH A MESSAGE (just to make sure there is one cached)
                ITopic topic = null;
                topic = ContextFactory.Instance.CreateTopic(SampleUtils.SAMPLE_TOPIC);
                IMessage message = ContextFactory.Instance.CreateMessage();
                message.Destination = topic;
                if (cmdLineParser.Config.startSequenceId != null && cmdLineParser.Config.endSequenceId != null)
                {
                    message.DeliveryMode = MessageDeliveryMode.Persistent;
                }
                else
                {
                    message.DeliveryMode = MessageDeliveryMode.Direct;
                }
                message.BinaryAttachment = Encoding.ASCII.GetBytes(SampleUtils.MSG_ATTACHMENTTEXT);
                session.Send(message);
                #endregion

                CacheSessionConfiguration cacheConfig  = (CacheSessionConfiguration)cmdLineParser.Config;
                ICacheSession             cacheSession = SampleUtils.newCacheSession(session, cacheConfig);
                ReturnCode rc;
                if (cmdLineParser.Config.startSequenceId != null && cmdLineParser.Config.endSequenceId != null)
                {
                    rc = cacheSession.SendCacheRequest(1, topic, cacheConfig.Subscribe, cacheConfig.Action, HandleCacheRequestResponse,
                                                       cmdLineParser.Config.startSequenceId.Value, cmdLineParser.Config.endSequenceId.Value);
                }
                else
                {
                    rc = cacheSession.SendCacheRequest(1, topic, cacheConfig.Subscribe, cacheConfig.Action, HandleCacheRequestResponse);
                }
                Console.WriteLine("Cache Response: " + rc.ToString());
                Console.WriteLine(string.Format("Waiting for async event or {0} secs (Whichever comes first)...", Timeout / 1000));
                waitForEvent.WaitOne(Timeout, false);
                IDictionary <Stats_Rx, Int64> stats = session.GetRxStats();
                SampleUtils.PrintRxStats(stats);
                Console.WriteLine("\nDone");
            }
            catch (Exception ex)
            {
                PrintException(ex);
            }
            finally
            {
                if (session != null)
                {
                    session.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after
                CleanupContext();
            }
        }
Beispiel #19
0
        /// <summary>
        /// Main entry point to the sample
        /// </summary>
        /// <param name="args"></param>
        public override void SampleCall(string[] args)
        {
            // Parse command line arguments
            ArgParser cmdLineParser = new ArgParser();

            if (!cmdLineParser.Parse(args) || !SampleParseArgs(cmdLineParser))
            {
                // Parse failed.
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }

            // Create the API components: starting with the properties
            ContextProperties contextProps = new ContextProperties();
            SessionProperties sessionProps = new SessionProperties();

            sessionProps.Host     = cmdLineParser.Config.IpPort.ip;
            sessionProps.UserName = cmdLineParser.Config.RouterUserVpn.user;
            sessionProps.Password = cmdLineParser.Config.UserPassword;
            sessionProps.SSLValidateCertificate = false;
            sessionProps.ReconnectRetries       = 3;
            if (cmdLineParser.Config.RouterUserVpn.vpn != null)
            {
                sessionProps.VPNName = cmdLineParser.Config.RouterUserVpn.vpn;
            }
            if (cmdLineParser.Config.Compression)
            {
                /* Compression is set as a number from 0-9, where 0 means "disable
                 * compression", and 9 means max compression. The default is no
                 * compression.
                 * Selecting a non-zero compression level auto-selects the
                 * compressed SMF port on the appliance, as long as no SMF port is
                 * explicitly specified. */
                sessionProps.CompressionLevel = 9;
            }

            // Create and connect the API components: create the context, session and flow objects
            IContext context = null;

            try
            {
                // Creating the context
                InitContext(cmdLineParser.LogLevel);
                Console.WriteLine("Creating the context ...");
                context = ContextFactory.Instance.CreateContext(contextProps, null);

                // Creating the session
                Console.WriteLine("Creating the session ...");
                session = context.CreateSession(sessionProps, SampleUtils.HandleMessageEvent, SampleUtils.HandleSessionEvent);

                // Connecting the session
                Console.WriteLine("Connecting the session ...");
                if (session.Connect() == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Session successfully connected");
                }
                // Creating the temporary queue and corresponding flow
                IQueue         replyToQueue   = session.CreateTemporaryQueue();
                FlowProperties flowProperties = new FlowProperties();
                flow = session.CreateFlow(flowProperties,
                                          replyToQueue,
                                          null,               /* null when binding to a queue*/
                                          HandleReplyMessage, /* defined in this sample to handle receipt of reply message*/
                                          SampleUtils.HandleFlowEvent);
                flow.Start();

                doRequest(requestDestination, replyToQueue, Operation.PLUS, 5, 4);
                Thread.Sleep(1000);
                doRequest(requestDestination, replyToQueue, Operation.MINUS, 5, 4);
                Thread.Sleep(1000);
                doRequest(requestDestination, replyToQueue, Operation.TIMES, 5, 4);
                Thread.Sleep(1000);
                doRequest(requestDestination, replyToQueue, Operation.DIVIDE, 5, 4);
            }
            catch (Exception ex)
            {
                PrintException(ex);
            }
            finally
            {
                if (flow != null)
                {
                    flow.Dispose();
                }
                if (session != null)
                {
                    session.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after.
                CleanupContext();
            }
        }
        /// <summary>
        /// Main function in the sample.
        /// </summary>
        /// <param name="args"></param>
        public override void SampleCall(string[] args)
        {
            #region Parse Arguments
            string    routerName    = null;
            bool      verbose       = true;
            ArgParser cmdLineParser = new ArgParser();
            if (!cmdLineParser.Parse(args))
            {
                // Parse failed.
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }
            if (cmdLineParser.Config.ArgBag.ContainsKey("-vo"))
            {
                verbose = false;
            }
            if (cmdLineParser.Config.ArgBag.ContainsKey("-sv"))
            {
                SOLTR_VERSION = cmdLineParser.Config.ArgBag["-sv"];
            }
            #endregion

            #region Initialize properties from command line.
            // Initialize the properties
            ContextProperties contextProps = new ContextProperties();
            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);
            #endregion

            // Define Context and Session.
            IContext context = null;
            ISession session = null;
            try
            {
                InitContext(cmdLineParser.LogLevel);
                Console.WriteLine("About to connect to appliance. \n[Ensure selected message-vpn is configured as the appliance's management message-vpn.]");
                Console.WriteLine("[Ensure selected message-vpn has semp-over-msgbus enabled]");
                Console.WriteLine("About to create the Context ...");
                context = ContextFactory.Instance.CreateContext(contextProps, null);
                Console.WriteLine("Context successfully created. ");

                Console.WriteLine("About to create the Session ...");
                session = context.CreateSession(sessionProps,
                                                SampleUtils.HandleMessageEvent,
                                                SampleUtils.HandleSessionEvent);
                Console.WriteLine("Session successfully created.");

                Console.WriteLine("About to connect the Session ...");

                if (session.Connect() == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Session successfully connected");
                    Console.WriteLine(GetRouterInfo(session));
                }

                // The SEMP requestStr topic is built using the appliance name.
                //
                // The SEMP requestStr we perform asks to show the client's on the appliance.
                // It can be easily adapted to perform any other type
                // of SEMP show commands.
                ICapability cap_routerName = session.GetCapability(CapabilityType.PEER_ROUTER_NAME);
                if (cap_routerName.Value == null || cap_routerName.Value.Value.Equals(""))
                {
                    Console.WriteLine("Unable to load PEER_ROUTER_NAME. (Requires r4.6+ SolOS-TR appliance.)");
                    return;
                }
                // PEER_ROUTER_NAME is an ISDTField of type string.
                routerName = (string)cap_routerName.Value.Value;

                string SEMP_TOPIC_STRING = string.Format("#SEMP/{0}/SHOW", routerName);
                Console.WriteLine(string.Format("Loaded appliance name: '{0}', SEMP Topic: '{1}'", routerName, SEMP_TOPIC_STRING));
                ITopic SEMP_TOPIC            = ContextFactory.Instance.CreateTopic(SEMP_TOPIC_STRING);
                string SEMP_SHOW_CLIENT_NAME = "<rpc semp-version=\"soltr/" + SOLTR_VERSION +
                                               "\"><show><client><name>*</name></client></show></rpc>";

                // Make the request.
                IMessage requestMsg = ContextFactory.Instance.CreateMessage();
                requestMsg.Destination      = SEMP_TOPIC;
                requestMsg.BinaryAttachment = Encoding.UTF8.GetBytes(SEMP_SHOW_CLIENT_NAME);
                if (verbose)
                {
                    Console.WriteLine("REQUEST: " + SEMP_SHOW_CLIENT_NAME); // triggered by -v
                }
                // Make the requestStr.
                IMessage   replyMsg;
                ReturnCode rc = session.SendRequest(requestMsg, out replyMsg, 5000);
                if (rc == ReturnCode.SOLCLIENT_FAIL)
                {
                    Console.WriteLine("Failed to send a requestStr");
                    return;
                }
                byte[] binaryAttachment = null;
                if (replyMsg != null)
                {
                    binaryAttachment = replyMsg.BinaryAttachment;
                }
                else
                {
                    Console.WriteLine("Failed to receive a SEMP reply");
                    return;
                }
                if (binaryAttachment != null)
                {
                    string replyStr = Encoding.UTF8.GetString(binaryAttachment);
                    // Is this user allowed to make such SEMP requestStr?
                    if (replyStr.IndexOf("permission-error") != -1)
                    {
                        Console.WriteLine("Permission error, aborting");
                        Console.WriteLine("Make sure SEMP over message bus SHOW commands are enabled for this VPN");
                        Console.WriteLine("REPLY: " + replyStr);
                        return;
                    }
                    if (verbose)
                    {
                        Console.WriteLine("REPLY: " + replyStr); // triggered by -v
                    }
                }
            }
            catch (Exception ex)
            {
                PrintException(ex);
            }
            finally
            {
                if (session != null)
                {
                    session.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after.
                CleanupContext();
            }
        }
Beispiel #21
0
        /// <summary>
        /// The main function in the sample.
        /// </summary>
        /// <param name="args"></param>
        public override void SampleCall(string[] args)
        {
            #region Parse Arguments
            ArgParser cmdLineParser = new ArgParser();
            if (!cmdLineParser.Parse(args))
            {
                // parse failed
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }
            #endregion

            #region Initialize properties from command line
            // Initialize the properties.
            ContextProperties contextProps = new ContextProperties();
            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);
            #endregion

            // Define IContext and ISession and ITopic.
            IContext context = null;
            ISession session = null;
            ITopic   topic   = null;
            try
            {
                InitContext(cmdLineParser.LogLevel);
                Console.WriteLine("About to create the Context ...");
                context = ContextFactory.Instance.CreateContext(contextProps, null);
                Console.WriteLine("Context successfully created. ");

                Console.WriteLine("About to create the Session ...");
                session = context.CreateSession(sessionProps,
                                                PrintReceivedMessage,
                                                SampleUtils.HandleSessionEvent);
                Console.WriteLine("Session successfully created.");

                Console.WriteLine("About to connect the Session ...");
                if (session.Connect() == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Session successfully connected");
                    Console.WriteLine(GetRouterInfo(session));
                }

                topic = ContextFactory.Instance.CreateTopic(SampleUtils.SAMPLE_TOPIC);

                Console.WriteLine("About to subscribe to topic " + SampleUtils.SAMPLE_TOPIC);
                if (session.Subscribe(topic, true) == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Successfully added topic subscription");
                }

                // Create the message independent stream.
                IStreamContainer stream = SDTUtils.CreateStream(1024);

                // Populate the stream.
                stream.AddDouble(3.141592654);
                stream.AddString("message");

                // Create the message-independent map.
                IMapContainer map = SDTUtils.CreateMap(1024);

                // Add a well known integer to the map.
                map.AddInt32("mersenne", 43112609);

                // Create the message.
                IMessage message = ContextFactory.Instance.CreateMessage();

                // Set the message delivery options.
                message.DeliveryMode = MessageDeliveryMode.Direct;
                message.Destination  = topic;

                int numMsgsToSend = 10;
                Console.WriteLine(string.Format("About to send {0} messages ...", numMsgsToSend));
                for (int i = 0; i < numMsgsToSend; i++)
                {
                    // Overwrite the "message" field, set the container, and send.
                    map.DeleteField("message");
                    map.AddString("message", "message" + (i + 1));
                    // Set the user property map to the map.
                    message.UserPropertyMap = map;
                    SDTUtils.SetSDTContainer(message, stream);
                    session.Send(message);
                }

                // Dispose of the map, stream, and message.
                map.Dispose();
                stream.Dispose();
                message.Dispose();

                Thread.Sleep(500); // wait for 0.5 seconds
                Console.WriteLine("\nDone");
            }
            catch (Exception ex)
            {
                PrintException(ex);
            }
            finally
            {
                if (session != null)
                {
                    if (topic != null)
                    {
                        session.Unsubscribe(topic, true);
                    }
                    session.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after.
                CleanupContext();
            }
        }
        public override void SampleCall(string[] args)
        {
            #region Parse Arguments
            ArgParser cmdLineParser = new ArgParser();
            if (!cmdLineParser.Parse(args))
            {
                // parse failed
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }
            #endregion

            #region Initialize properties from command line
            // Initialize the properties.
            ContextProperties contextProps = new ContextProperties();
            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);
            #endregion

            // Define IContext and ISession.
            IContext context = null;
            ISession session = null;
            IBrowser browser = null;
            IQueue   queue   = null;
            try
            {
                InitContext(cmdLineParser.LogLevel);
                #region Initialize the context, connect the Session, and assert capabilities.
                Console.WriteLine("About to create the context ...");
                context = ContextFactory.Instance.CreateContext(contextProps, null);
                Console.WriteLine("Context successfully created ");
                Console.WriteLine("About to create the session ...");
                session = context.CreateSession(sessionProps,
                                                SampleUtils.HandleMessageEvent,
                                                SampleUtils.HandleSessionEvent);
                Console.WriteLine("Session successfully created.");
                Console.WriteLine("About to connect the session ...");
                if (session.Connect() == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Session successfully connected");
                    Console.WriteLine(GetRouterInfo(session));
                }
                // Does the appliance support these capabilities:PUB_GUARANTEED,ENDPOINT_MANAGEMENT,BROWSER?
                Console.Write(String.Format("Check for capability: {0} ... ", CapabilityType.PUB_GUARANTEED));
                if (!session.IsCapable(CapabilityType.PUB_GUARANTEED))
                {
                    Console.WriteLine("Not Supported\n Exiting");
                    return;
                }
                else
                {
                    Console.WriteLine("Supported");
                }
                Console.Write(String.Format("Check for capability: {0} ... ", CapabilityType.ENDPOINT_MANAGEMENT));
                if (!session.IsCapable(CapabilityType.ENDPOINT_MANAGEMENT))
                {
                    Console.WriteLine("Not Supported\n Exiting");
                    return;
                }
                else
                {
                    Console.WriteLine("Supported");
                }
                Console.Write(String.Format("Check for capability: {0} ... ", CapabilityType.BROWSER));
                if (!session.IsCapable(CapabilityType.BROWSER))
                {
                    Console.WriteLine("Not Supported \n Exiting");
                    return;
                }
                else
                {
                    Console.WriteLine("Supported");
                }
                #endregion

                #region Provision a new queue endpoint
                EndpointProperties endpointProps = new EndpointProperties();
                // Set permissions to allow all permissions to others.
                endpointProps.Permission = EndpointProperties.EndpointPermission.Delete;
                // Set access type to exclusive.
                endpointProps.AccessType = EndpointProperties.EndpointAccessType.Exclusive;
                // Set quota to 100 MB.
                endpointProps.Quota = 100;
                string queueName = "solclient_dotnet_sample_QueueProvisionAndBrowse_" + (new Random()).Next(1000);


                queue = ContextFactory.Instance.CreateQueue(queueName);
                Console.WriteLine(String.Format("About to provision queue '{0}' on the appliance", queueName));
                try
                {
                    session.Provision(queue /* endpoint */,
                                      endpointProps /*endpoint properties */,
                                      ProvisionFlag.WaitForConfirm /* block waiting for confirmation */,
                                      null /*no correlation key*/);
                    Console.WriteLine("Endpoint queue successfully provisioned on the appliance");
                }
                catch (Exception ex)
                {
                    PrintException(ex);
                    Console.WriteLine("Exiting");
                    return;
                }
                #endregion

                #region Publishing some messages to this newly provisioned queue
                IMessage msg = ContextFactory.Instance.CreateMessage();
                msg.BinaryAttachment = Encoding.ASCII.GetBytes(SampleUtils.MSG_ATTACHMENTTEXT);
                msg.DeliveryMode     = MessageDeliveryMode.Persistent;
                msg.Destination      = queue;
                int howManyToPublish = 10;
                Console.WriteLine(String.Format("About to publish {0} messages", howManyToPublish));
                for (int i = 0; i < howManyToPublish; i++)
                {
                    if (session.Send(msg) == ReturnCode.SOLCLIENT_OK)
                    {
                        Console.Write(".");
                    }
                    Thread.Sleep(100); // wait for 0.5 seconds
                }
                Console.WriteLine("\nDone");
                #endregion

                #region Create a Browser to the newly provisioned Queue, and selectively remove the spooled messages.
                BrowserProperties browserProps = new BrowserProperties();
                browser = session.CreateBrowser(queue, browserProps);
                Console.WriteLine(string.Format("Browsing queue {0} ", queueName));
                int count = 0, removedCount = 0;
                while ((msg = browser.GetNext()) != null)
                {
                    Console.WriteLine(msg.Dump());
                    count++;
                    if (count % 3 == 0)
                    {
                        // A message may be removed by calling IBrowser.remove().
                        // This deletes it from the appliance's message spool.
                        Console.WriteLine("Removing spooled message ({0}).", count);
                        browser.Remove(msg);
                        removedCount++;
                    }
                }
                Console.WriteLine(string.Format("Browsed {0} messages, removed {1} ", count, removedCount));
                #endregion
            }
            catch (Exception ex)
            {
                PrintException(ex);
                Console.WriteLine("Exiting");
            }
            finally
            {
                if (browser != null)
                {
                    browser.Dispose();
                }
                if (session != null)
                {
                    session.Deprovision(queue, ProvisionFlag.WaitForConfirm, null);
                    session.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after.
                CleanupContext();
            }
        }
        public override void SampleCall(string[] args)
        {
            #region Parse Arguments
            ArgParser cmdLineParser = new ArgParser();
            if (!cmdLineParser.Parse(args))
            {
                // Parse failed.
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }
            if (!SampleParseArgs(cmdLineParser))
            {
                // Parse failed for sample's arguments.
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }
            #endregion

            #region Initialize properties from command line
            // Initialize the properties.
            ContextProperties contextProps = new ContextProperties();
            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);
            #endregion

            // Define IContext and ISession.
            IContext context = null;
            ISession session = null;

            // Create the LinkedList.
            LinkedList <MessageRecord> msgRecords =
                new LinkedList <MessageRecord>();

            try
            {
                InitContext(cmdLineParser.LogLevel);
                Console.WriteLine("About to create the context ...");
                context = ContextFactory.Instance.CreateContext(contextProps, null);
                Console.WriteLine("Context successfully created. ");
                Console.WriteLine("About to create the session ...");
                session = context.CreateSession(sessionProps,
                                                SampleUtils.HandleMessageEvent,
                                                HandleSessionEvent);
                Console.WriteLine("Session successfully created.");

                // Connect the session.
                Console.WriteLine("About to connect the session ...");
                if (session.Connect() == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Session successfully connected");
                    Console.WriteLine(GetRouterInfo(session));
                }
                else
                {
                    Console.WriteLine("Failed to connect session, aborting ...");
                    return;
                }

                // Validate required capabilities.
                if (!session.IsCapable(CapabilityType.PUB_GUARANTEED))
                {
                    Console.WriteLine(string.Format("This sample requires capability '{0}' to be supported", CapabilityType.PUB_GUARANTEED));
                    return;
                }

                // At this point the session is connected and not reconnecting
                sessionIsReconnecting = false;
                sessionIsReconnecting = false;

                // Send cmdLineParser.Config.NumberOfMessagesToPublish messages.
                for (int i = 0; i < cmdLineParser.Config.NumberOfMessagesToPublish; i++)
                {
                    // If the session is reconnecting the applications should not send messages
                    while (sessionIsReconnecting)
                    {
                        Thread.Sleep(100);
                    }

                    if (sessionIsDisconnected)
                    {
                        // No automatic reconnect attemps will be made by the API. It's up to the
                        // client application to reconnect the session
                        Console.WriteLine("About to connect the session ...");
                        if (session.Connect() == ReturnCode.SOLCLIENT_OK)
                        {
                            Console.WriteLine("Session successfully connected");
                        }
                        else
                        {
                            Console.WriteLine("Failed to connect session, aborting ...");
                            return;
                        }
                        // The client application in this case is responsible for re-pulishing all unacked message
                        foreach (MessageRecord record in msgRecords)
                        {
                            if (!record.Acked)
                            {
                                ReturnCode rc = session.Send(record.Message);
                                if (rc != ReturnCode.SOLCLIENT_OK)
                                {
                                    Console.WriteLine("Failed to send unacked messages, aborting ...");
                                    return;
                                }
                            }
                        }
                    }
                    // Allocate a new message.
                    IMessage message = SampleUtils.CreateMessage(cmdLineParser.Config, session);
                    message.DeliveryMode = MessageDeliveryMode.Persistent;
                    // Create a record, and set it as CorrelationKey.
                    MessageRecord msgRecord = new MessageRecord(message);
                    message.CorrelationKey = msgRecord;
                    // Add it to the list of send message records and send it.
                    msgRecords.AddLast(msgRecord);
                    session.Send(message);

                    // Sleep for 500 msecs and check to see if the message was acknowledged (positively or negatively).
                    Thread.Sleep(500);
                    while (msgRecords.First != null && msgRecords.First.Value.Acked)
                    {
                        MessageRecord record = msgRecords.First.Value;
                        msgRecords.RemoveFirst();
                        Console.WriteLine(
                            string.Format("Freeing memory for message {0}, Result: Acked ({1}))\n",
                                          i, record.Acked));
                        record.Message.Dispose();
                    }
                    Thread.Sleep(1000);
                }
            }
            catch (Exception ex)
            {
                PrintException(ex);
            }
            finally
            {
                // There should not be any left in the list, but just in case.
                foreach (MessageRecord record in msgRecords)
                {
                    record.Message.Dispose();
                }
                if (session != null)
                {
                    session.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after.
                CleanupContext();
            }
        }
Beispiel #24
0
        public override void SampleCall(string[] args)
        {
            // Resources used in this sample.
            IContext context = null;
            ISession session = null;
            IQueue   queue   = null;
            ITopic   topicA  = ContextFactory.Instance.CreateTopic("topicA");
            ITopic   topicB  = ContextFactory.Instance.CreateTopic("topicB");

            // Parse arguments and initialize Session properties.
            ArgParser cmdLineParser = new ArgParser();

            if (!cmdLineParser.Parse(args))
            {
                // Parse failed.
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }
            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);

            try
            {
                InitContext(cmdLineParser.LogLevel);
                // Initialize the Context, connect the Session, and assert capabilities
                InitializeAndAssertCapabilities(ref context, ref session, sessionProps);

                // Provision a new Queue.
                string queueName = SampleUtils.SAMPLE_QUEUE + (new Random()).Next(1000);
                queue = ProvisionQueue(session, queueName, true);

                // Publish a couple of messages to topicA, topicB. Observe that none of them end up on the Queue.
                IMessage msg = ContextFactory.Instance.CreateMessage();
                msg.BinaryAttachment = Encoding.ASCII.GetBytes(SampleUtils.MSG_ATTACHMENTTEXT);
                msg.DeliveryMode     = MessageDeliveryMode.Persistent;
                msg.UserData         = new byte[] { 1 };
                msg.Destination      = topicA;
                session.Send(msg);
                msg.UserData    = new byte[] { 2 };
                msg.Destination = topicB;
                session.Send(msg);
                DumpMessagesReceivedFromQueue(session, queue, 1000, true);

                // Add Topic subscriptions for topicA and topicB, resend the two messages. Observe that both of them end up on the Queue.
                session.Subscribe(queue, topicA, SubscribeFlag.WaitForConfirm, null);
                session.Subscribe(queue, topicB, SubscribeFlag.WaitForConfirm, null);
                msg.UserData    = new byte[] { 1 };
                msg.Destination = topicA;
                session.Send(msg);
                msg.UserData    = new byte[] { 2 };
                msg.Destination = topicB;
                session.Send(msg);
                DumpMessagesReceivedFromQueue(session, queue, 1000, true);

                // Remove TopicA subscription and resend the two messages. Observe that only TopicB message end up on the Queue.
                session.Unsubscribe(queue, topicA, SubscribeFlag.WaitForConfirm, null);
                msg.UserData    = new byte[] { 1 };
                msg.Destination = topicA;
                session.Send(msg);
                msg.UserData    = new byte[] { 2 };
                msg.Destination = topicB;
                session.Send(msg);
                DumpMessagesReceivedFromQueue(session, queue, 1000, true);

                Console.WriteLine("\nDone");
            }
            catch (Exception ex)
            {
                PrintException(ex);
                Console.WriteLine("Exiting");
            }
            finally
            {
                if (session != null)
                {
                    session.Deprovision(queue, ProvisionFlag.WaitForConfirm, null);
                    session.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after.
                CleanupContext();
            }
        }
        /// <summary>
        /// Main entry point to the sample
        /// </summary>
        /// <param name="args"></param>
        public override void SampleCall(string[] args)
        {
            // Parse command line arguments
            ArgParser cmdLineParser = new ArgParser();

            if (!cmdLineParser.Parse(args) || !SampleParseArgs(cmdLineParser))
            {
                // Parse failed.
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }

            // Create the API components: starting with the properties
            ContextProperties contextProps = new ContextProperties();
            SessionProperties sessionProps = new SessionProperties();

            sessionProps.Host     = cmdLineParser.Config.IpPort.ip;
            sessionProps.UserName = cmdLineParser.Config.RouterUserVpn.user;
            sessionProps.Password = cmdLineParser.Config.UserPassword;
            sessionProps.SSLValidateCertificate = false;
            sessionProps.ReconnectRetries       = 3;
            if (cmdLineParser.Config.RouterUserVpn.vpn != null)
            {
                sessionProps.VPNName = cmdLineParser.Config.RouterUserVpn.vpn;
            }
            if (cmdLineParser.Config.Compression)
            {
                /* Compression is set as a number from 0-9, where 0 means "disable
                 * compression", and 9 means max compression. The default is no
                 * compression.
                 * Selecting a non-zero compression level auto-selects the
                 * compressed SMF port on the appliance, as long as no SMF port is
                 * explicitly specified. */
                sessionProps.CompressionLevel = 9;
            }

            // Create and connect the API components: create the context and session objects
            IContext context = null;

            session = null;
            IFlow     flow = null;
            IEndpoint provisionedEndpoint = null;

            try
            {
                // Creating the context
                InitContext(cmdLineParser.LogLevel);
                Console.WriteLine("Creating the context ...");
                context = ContextFactory.Instance.CreateContext(contextProps, null);

                // Creating the session
                Console.WriteLine("Creating the session ...");
                session = context.CreateSession(sessionProps, HandleRequestMessage, SampleUtils.HandleSessionEvent);

                // Connecting the session
                Console.WriteLine("Connecting the session ...");
                if (session.Connect() == ReturnCode.SOLCLIENT_OK)
                {
                    Console.WriteLine("Session successfully connected");
                }

                // Provisioning the endpoint

                if (serviceTopic != null)
                {
                    // Provision a Durable Topic Endpoint
                    provisionedEndpoint = ContextFactory.Instance.CreateDurableTopicEndpointEx("cscsmp_sample_" + DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond);
                }
                else
                {
                    provisionedEndpoint = serviceQueue;
                }
                session.Provision(provisionedEndpoint, new EndpointProperties(), ProvisionFlag.WaitForConfirm, null);
                Console.WriteLine(string.Format("Provisioned new endpoint '{0}'", provisionedEndpoint));

                // Create and start flow to to the newly provisioned endpoint
                FlowProperties flowProperties = new FlowProperties();
                flowProperties.AckMode = MessageAckMode.AutoAck;
                flow = session.CreateFlow(flowProperties,
                                          provisionedEndpoint,  /* the newly created endpoint*/
                                          serviceTopic,         /* null if we're listening on a queue*/
                                          HandleRequestMessage, /* local delegate to process request messages and send corresponding reply messages */
                                          SampleUtils.HandleFlowEvent);
                flow.Start();
                Console.WriteLine("Listening for request messages ... Press any key(except for Ctrl+C) to exit");
                Console.In.Read();
            }
            catch (Exception ex)
            {
                PrintException(ex);
            }
            finally
            {
                Cleanup(flow, provisionedEndpoint, session, context);
            }
        }
        public override void SampleCall(string[] args)
        {
            // Resources used in this sample.
            IContext context = null;

            // The different Topics used in this sample.
            ITopic ASlashWildCard = ContextFactory.Instance.CreateTopic("a/>");
            ITopic ASlashB        = ContextFactory.Instance.CreateTopic("a/b");
            ITopic CSlashD        = ContextFactory.Instance.CreateTopic("c/d");
            ITopic CSlashWildCard = ContextFactory.Instance.CreateTopic("c/>");
            ITopic ASlashC        = ContextFactory.Instance.CreateTopic("a/c");
            ITopic CSlashE        = ContextFactory.Instance.CreateTopic("c/e");

            // Parse Arguments and initialize session properties.
            ArgParser cmdLineParser = new ArgParser();

            if (!cmdLineParser.Parse(args))
            {
                // Parse failed.
                PrintUsage(INVALID_ARGUMENTS_ERROR);
                return;
            }
            SessionProperties sessionProps = SampleUtils.NewSessionPropertiesFromConfig(cmdLineParser.Config);

            sessionProps.TopicDispatch = true; // This session property must be set to use topic dispatch capabilities

            try
            {
                InitContext(cmdLineParser.LogLevel);
                // Initialize the Context, connect the Session and assert capabilities.
                InitializeAndAssertCapabilities(ref context, ref this.session, sessionProps);

                // Add "a/>" Topic subscription to the Session.
                session.Subscribe(ASlashWildCard, true /*wait for confirm*/);

                // Create three dispatch targets.
                dispatch_1 = session.CreateDispatchTarget(ASlashB, HandleMessageEvent);
                session.Subscribe(dispatch_1, SubscribeFlag.LocalDispatchOnly, null); // local dispatch only

                dispatch_2 = session.CreateDispatchTarget(CSlashWildCard, HandleMessageEvent);
                session.Subscribe(dispatch_2, SubscribeFlag.WaitForConfirm, null); // subscribe to the appliance

                dispatch_3 = session.CreateDispatchTarget(CSlashD, HandleMessageEvent);
                session.Subscribe(dispatch_3, SubscribeFlag.LocalDispatchOnly, null); // local dispatch only

                // Publish to Topic a/c, and verify receipt only on the Session's message handler.
                IMessage msg = ContextFactory.Instance.CreateMessage();
                msg.BinaryAttachment = Encoding.ASCII.GetBytes(SampleUtils.MSG_ATTACHMENTTEXT);
                msg.Destination      = ASlashC;
                session.Send(msg);
                Console.WriteLine("\nPublished message to topic a/c");
                Thread.Sleep(100);

                // Publish to Topic a/b, and verify receipt only on dispatch_1 message handler.
                msg.Destination = ASlashB;
                session.Send(msg);
                Console.WriteLine("\nPublished message to topic a/b");
                Thread.Sleep(100);

                // Publish to Topic c/d, and verify receipt on both dispatch functions 2 and 3.
                msg.Destination = CSlashD;
                session.Send(msg);
                Console.WriteLine("\nPublished message to Topic c/d");
                Thread.Sleep(100);

                // Publish on Topic c/e, and verify receipt on only dispatch function 2.
                msg.Destination = CSlashE;
                session.Send(msg);
                Console.WriteLine("\nPublished message to Topic c/e");
                Thread.Sleep(100);

                // Wait for messages to be delivered.
                Thread.Sleep(Timeout);
                Console.WriteLine("\nDone");
            }
            catch (Exception ex)
            {
                PrintException(ex);
                Console.WriteLine("Exiting");
            }
            finally
            {
                if (session != null)
                {
                    session.Unsubscribe(ContextFactory.Instance.CreateTopic(">"), true /*wait for confirm*/);
                }
                if (dispatch_1 != null)
                {
                    session.Unsubscribe(dispatch_1, SubscribeFlag.LocalDispatchOnly, null);
                }
                if (dispatch_2 != null)
                {
                    session.Unsubscribe(dispatch_2, SubscribeFlag.WaitForConfirm, null);
                }
                if (dispatch_3 != null)
                {
                    session.Unsubscribe(dispatch_3, SubscribeFlag.LocalDispatchOnly, null);
                }
                if (session != null)
                {
                    session.Dispose();
                }
                if (context != null)
                {
                    context.Dispose();
                }
                // Must cleanup after.
                CleanupContext();
            }
        }