/// <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();
	    }
        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();
            }
        }
示例#3
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();
            }
        }
        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();
            }
        }
        /// <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();
            }
        }
        /// <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();
            }
        }
        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();
            }
        }
示例#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 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();
            }
        }
        /// <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();
            }
        }
示例#11
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 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();
            }
        }
        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>
        /// 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();
            }
        }
示例#15
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();
            }
        }
        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();
            }
        }