//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Before public void setup()
        public virtual void Setup()
        {
            _boltChannel  = new BoltChannel("bolt-1", "bolt", _channel);
            _stateMachine = mock(typeof(BoltStateMachine));
            when(_stateMachine.shouldStickOnThread()).thenReturn(false);
            when(_stateMachine.hasOpenStatement()).thenReturn(false);
        }
//JAVA TO C# CONVERTER TODO TASK: Most Java annotations will not have direct .NET equivalent attributes:
//ORIGINAL LINE: @Test public void processNextBatchShouldReturnWhenConnectionIsStopped() throws Exception
//JAVA TO C# CONVERTER WARNING: Method 'throws' clauses are not available in C#:
        public virtual void ProcessNextBatchShouldReturnWhenConnectionIsStopped()
        {
            BoltConnection connection = NewConnection(1);

            connection.Enqueue(Jobs.noop());
            connection.Enqueue(Jobs.noop());

            // force to a message waiting loop
            when(_stateMachine.shouldStickOnThread()).thenReturn(true);

            Future <bool> future = OtherThread.execute(state => connection.ProcessNextBatch());

            connection.Stop();

            OtherThread.get().awaitFuture(future);

            verify(_stateMachine).close();
        }
示例#3
0
        protected internal virtual bool ProcessNextBatch(int batchCount, bool exitIfNoJobsAvailable)
        {
            try
            {
                bool waitForMessage = false;
                bool loop           = false;
                do
                {
                    // exit loop if we'll close the connection
                    if (WillClose())
                    {
                        break;
                    }

                    // do we have pending jobs or shall we wait for new jobs to
                    // arrive, which is required only for releasing stickiness
                    // condition to this thread
                    if (waitForMessage || !_queue.Empty)
                    {
                        _queue.drainTo(_batch, batchCount);
                        // if we expect one message but did not get any (because it was already
                        // processed), silently exit
                        if (_batch.Count == 0 && !exitIfNoJobsAvailable)
                        {
                            // loop until we get a new job, if we cannot then validate
                            // transaction to check for termination condition. We'll
                            // break loop if we'll close the connection
                            while (!WillClose())
                            {
                                Job nextJob = _queue.poll(10, SECONDS);
                                if (nextJob != null)
                                {
                                    _batch.Add(nextJob);

                                    break;
                                }
                                else
                                {
                                    _machine.validateTransaction();
                                }
                            }
                        }
                        NotifyDrained(_batch);

                        // execute each job that's in the batch
                        while (_batch.Count > 0)
                        {
                            Job current = _batch.RemoveAt(0);

                            current.Perform(_machine);
                        }

                        // do we have any condition that require this connection to
                        // stick to the current thread (i.e. is there an open statement
                        // or an open transaction)?
                        loop           = _machine.shouldStickOnThread();
                        waitForMessage = loop;
                    }

                    // we processed all pending messages, let's flush underlying channel
                    if (_queue.size() == 0)
                    {
                        _output.flush();
                    }
                } while (loop);

                // assert only if we'll stay alive
                if (!WillClose())
                {
                    Debug.Assert(!_machine.hasOpenStatement());
                }
            }
            catch (BoltConnectionAuthFatality ex)
            {
                _shouldClose.set(true);
                if (ex.Loggable)
                {
                    _userLog.warn(ex.Message);
                }
            }
            catch (BoltProtocolBreachFatality ex)
            {
                _shouldClose.set(true);
                _log.error(string.Format("Protocol breach detected in bolt session '{0}'.", Id()), ex);
            }
            catch (InterruptedException)
            {
                _shouldClose.set(true);
                _log.info("Bolt session '%s' is interrupted probably due to server shutdown.", Id());
            }
            catch (Exception t)
            {
                _shouldClose.set(true);
                _userLog.error(string.Format("Unexpected error detected in bolt session '{0}'.", Id()), t);
            }
            finally
            {
                if (WillClose())
                {
                    Close();
                }
            }

            return(!_closed.get());
        }