예제 #1
0
        connected(RouterPrx router, SessionPrx session)
        {
            string category = router.getCategoryForClient();
            long   timeout  = router.getSessionTimeout();

            Ice.Connection conn = router.ice_getCachedConnection();
            lock (this)
            {
                _router = router;

                if (_destroy)
                {
                    //
                    // Run the destroyInternal in a thread. This is because it
                    // destroyInternal makes remote invocations.
                    //
                    Thread t = new Thread(new ThreadStart(destroyInternal));
                    t.Start();
                    return;
                }

                //
                // Cache the category.
                //
                _category = category;

                //
                // Assign the session after _destroy is checked.
                //
                _session   = session;
                _connected = true;

                Debug.Assert(_sessionRefresh == null);
                if (timeout > 0)
                {
                    _sessionRefresh = new SessionRefreshThread(this, _router, (int)(timeout * 1000) / 2);
                    _refreshThread  = new Thread(new ThreadStart(_sessionRefresh.run));
                    _refreshThread.Start();
                }
            }

            dispatchCallback(delegate()
            {
                try
                {
                    _callback.connected(this);
                }
                catch (Glacier2.SessionNotExistException)
                {
                    destroy();
                }
            }, conn);
        }
예제 #2
0
파일: Client.cs 프로젝트: Radulfr/zeroc-ice
        public override int run(string[] args)
        {
            if(args.Length > 0)
            {
                Console.Error.WriteLine(appName() + ": too many arguments");
                return 1;
            }

            string name;
            do
            {
                Console.Out.Write("Please enter your name ==> ");
                Console.Out.Flush();
            
                name = Console.In.ReadLine();
                if(name == null)
                {
                    return 1;
                }
                name = name.Trim();
            }
            while(name.Length == 0);

            Ice.ObjectPrx basePrx = communicator().propertyToProxy("SessionFactory.Proxy");
            SessionFactoryPrx factory = SessionFactoryPrxHelper.checkedCast(basePrx);
            if(factory == null)
            {
                Console.Error.WriteLine("invalid proxy");
                return 1;
            }

            SessionPrx session = factory.create(name);

            SessionRefreshThread refresh = new SessionRefreshThread(communicator().getLogger(), 5000, session);
            Thread refreshThread = new Thread(new ThreadStart(refresh.run));
            refreshThread.Start();

            List<HelloPrx> hellos = new List<HelloPrx>();

            menu();

            try
            {
                bool destroy = true;
                bool shutdown = false;
                while(true)
                {
                    Console.Out.Write("==> ");
                    Console.Out.Flush();
                    string line = Console.In.ReadLine();
                    if(line == null)
                    {
                        break;
                    }
                    if(line.Length > 0 && Char.IsDigit(line[0]))
                    {
                        int index = Int32.Parse(line);
                        if(index < hellos.Count)
                        {
                            HelloPrx hello = hellos[index];
                            hello.sayHello();
                        }
                        else
                        {
                            Console.Out.WriteLine("Index is too high. " + hellos.Count +
                                                  " hello objects exist so far.\n" +
                                                  "Use `c' to create a new hello object.");
                        }
                    }
                    else if(line.Equals("c"))
                    {
                        hellos.Add(session.createHello());
                        Console.Out.WriteLine("Created hello object " + (hellos.Count - 1));
                    }
                    else if(line.Equals("s"))
                    {
                        destroy = false;
                        shutdown = true;
                        break;
                    }
                    else if(line.Equals("x"))
                    {
                        break;
                    }
                    else if(line.Equals("t"))
                    {
                        destroy = false;
                        break;
                    }
                    else if(line.Equals("?"))
                    {
                        menu();
                    }
                    else
                    {
                        Console.Out.WriteLine("Unknown command `" + line + "'.");
                        menu();
                    }
                }

                //
                // The refresher thread must be terminated before destroy is
                // called, otherwise it might get ObjectNotExistException. refresh
                // is set to 0 so that if session.destroy() raises an exception
                // the thread will not be re-terminated and re-joined.
                //
                refresh.terminate();
                refreshThread.Join();
                refresh = null;

                if(destroy)
                {
                    session.destroy();
                }
                if(shutdown)
                {
                    factory.shutdown();
                }
            }
            catch(System.Exception)
            {
                //
                // The refresher thread must be terminated in the event of a
                // failure.
                //
                if(refresh != null)
                {
                    refresh.terminate();
                    refreshThread.Join();
                    refresh = null;
                }
                throw;
            }

            return 0;
        }
예제 #3
0
    connected(RouterPrx router, SessionPrx session)
    {
        string category = router.getCategoryForClient();
        long timeout = router.getSessionTimeout();
        Ice.Connection conn = router.ice_getCachedConnection();
        lock(this)
        {
            _router = router;

            if(_destroy)
            {
                //
                // Run the destroyInternal in a thread. This is because it
                // destroyInternal makes remote invocations.
                //
                Thread t = new Thread(new ThreadStart(destroyInternal));
                t.Start();
                return;
            }

            //
            // Cache the category.
            //
            _category = category;

            //
            // Assign the session after _destroy is checked.
            //
            _session = session;
            _connected = true;

            Debug.Assert(_sessionRefresh == null);
            if(timeout > 0)
            {
                _sessionRefresh = new SessionRefreshThread(this, _router, (int)(timeout * 1000)/2);
                _refreshThread = new Thread(new ThreadStart(_sessionRefresh.run));
                _refreshThread.Start();
            }
        }

        dispatchCallback(delegate()
                         {
                             try
                             {
                                 _callback.connected(this);
                             }
                             catch(Glacier2.SessionNotExistException)
                             {
                                 destroy();
                             }
                         }, conn);
    }
예제 #4
0
        public override int run(string[] args)
        {
            if (args.Length > 0)
            {
                Console.Error.WriteLine(appName() + ": too many arguments");
                return(1);
            }

            string name;

            do
            {
                Console.Out.Write("Please enter your name ==> ");
                Console.Out.Flush();

                name = Console.In.ReadLine();
                if (name == null)
                {
                    return(1);
                }
                name = name.Trim();
            }while(name.Length == 0);

            var basePrx = communicator().propertyToProxy("SessionFactory.Proxy");
            var factory = SessionFactoryPrxHelper.checkedCast(basePrx);

            if (factory == null)
            {
                Console.Error.WriteLine("invalid proxy");
                return(1);
            }

            SessionPrx session = factory.create(name);

            var refresh       = new SessionRefreshThread(communicator().getLogger(), 5000, session);
            var refreshThread = new Thread(new ThreadStart(refresh.run));

            refreshThread.Start();

            var hellos = new List <HelloPrx>();

            menu();

            try
            {
                bool destroy  = true;
                bool shutdown = false;
                while (true)
                {
                    Console.Out.Write("==> ");
                    Console.Out.Flush();
                    var line = Console.In.ReadLine();
                    if (line == null)
                    {
                        break;
                    }
                    if (line.Length > 0 && Char.IsDigit(line[0]))
                    {
                        int index = Int32.Parse(line);
                        if (index < hellos.Count)
                        {
                            HelloPrx hello = hellos[index];
                            hello.sayHello();
                        }
                        else
                        {
                            Console.Out.WriteLine("Index is too high. " + hellos.Count +
                                                  " hello objects exist so far.\n" +
                                                  "Use `c' to create a new hello object.");
                        }
                    }
                    else if (line.Equals("c"))
                    {
                        hellos.Add(session.createHello());
                        Console.Out.WriteLine("Created hello object " + (hellos.Count - 1));
                    }
                    else if (line.Equals("s"))
                    {
                        destroy  = false;
                        shutdown = true;
                        break;
                    }
                    else if (line.Equals("x"))
                    {
                        break;
                    }
                    else if (line.Equals("t"))
                    {
                        destroy = false;
                        break;
                    }
                    else if (line.Equals("?"))
                    {
                        menu();
                    }
                    else
                    {
                        Console.Out.WriteLine("Unknown command `" + line + "'.");
                        menu();
                    }
                }

                //
                // The refresher thread must be terminated before destroy is
                // called, otherwise it might get ObjectNotExistException. refresh
                // is set to 0 so that if session.destroy() raises an exception
                // the thread will not be re-terminated and re-joined.
                //
                refresh.terminate();
                refreshThread.Join();
                refresh = null;

                if (destroy)
                {
                    session.destroy();
                }
                if (shutdown)
                {
                    factory.shutdown();
                }
            }
            catch (Exception)
            {
                //
                // The refresher thread must be terminated in the event of a
                // failure.
                //
                if (refresh != null)
                {
                    refresh.terminate();
                    refreshThread.Join();
                    refresh = null;
                }
                throw;
            }

            return(0);
        }
예제 #5
0
 RefreshI(SessionHelper helper, SessionRefreshThread thread)
 {
     _thread = thread;
     _helper = helper;
 }