class Bundler::ConnectionPool::TimedStack
Примеры:
ts = TimedStack.new(1) { MyConnection.new }
# fetch a connection
conn = ts.pop
# return a connection
ts.push conn
conn = ts.pop
ts.pop timeout: 5
#=> raises Timeout::Error after 5 seconds
Атрибуты
Публичные методы класса
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 37 def initialize(size = 0, &block) @create_block = block @created = 0 @que = [] @max = size @mutex = Mutex.new @resource = ConditionVariable.new @shutdown_block = nil end
Создает новый пул с size подключениями, которые создаются из заданного block.
Публичные методы экземпляра
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 111 def empty? (@created - @que.length) >= @max end
Возвращает true, если доступных подключений нет.
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 118 def length @max - @created + @que.length end
Количество доступных подключений в стеке.
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 73
def pop(timeout = 0.5, options = {})
options, timeout = timeout, 0.5 if Hash === timeout
timeout = options.fetch :timeout, timeout
deadline = Bundler::ConnectionPool.monotonic_time + timeout
@mutex.synchronize do
loop do
raise Bundler::ConnectionPool::PoolShuttingDownError if @shutdown_block
return fetch_connection(options) if connection_stored?(options)
connection = try_create(options)
return connection if connection
to_wait = deadline - Bundler::ConnectionPool.monotonic_time
raise Timeout::Error, "Waited #{timeout} sec" if to_wait <= 0
@resource.wait(@mutex, to_wait)
end
end
end Извлекает подключение из стека. Если подключение доступно, оно возвращается немедленно. Если подключение недоступно в течение заданного таймаута, генерируется исключение Timeout::Error.
:timeout является единственным проверяемым элементом в options и предпочтительнее аргумента timeout (который будет удален в будущей версии). Другие параметры могут использоваться подклассами, расширяющими TimedStack.
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 51
def push(obj, options = {})
@mutex.synchronize do
if @shutdown_block
@shutdown_block.call(obj)
else
store_connection obj, options
end
@resource.broadcast
end
end Возвращает obj в стек. options игнорируется в TimedStack, но может использоваться подклассами, расширяющими TimedStack.
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 97
def shutdown(&block)
raise ArgumentError, "shutdown must receive a block" unless block_given?
@mutex.synchronize do
@shutdown_block = block
@resource.broadcast
shutdown_connections
end
end Закрывает TimedStack, что предотвращает получение подключений. block вызывается один раз для каждого подключения в стеке.
Приватные методы экземпляра
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 129 def connection_stored?(options = nil) !@que.empty? end
Это точка расширения для TimedStack и вызывается с мьютексом.
Этот метод должен возвращать true, если в стеке доступно подключение.
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 138 def fetch_connection(options = nil) @que.pop end
Это точка расширения для TimedStack и вызывается с мьютексом.
Этот метод должен возвращать подключение из стека.
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 147
def shutdown_connections(options = nil)
while connection_stored?(options)
conn = fetch_connection(options)
@shutdown_block.call(conn)
end
end Это точка расширения для TimedStack и вызывается с мьютексом.
Этот метод должен закрыть все подключения в стеке.
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 159 def store_connection(obj, options = nil) @que.push obj end
Это точка расширения для TimedStack и вызывается с мьютексом.
Этот метод должен поместить obj в стек.
# File lib/bundler/vendor/connection_pool/lib/connection_pool/timed_stack.rb, line 169
def try_create(options = nil)
unless @created == @max
object = @create_block.call
@created += 1
object
end
end Это точка расширения для TimedStack и вызывается с мьютексом.
Этот метод должен создать подключение только в том случае, если общее количество разрешенных подключений не достигнуто.
Ruby Core © 1993–2017 Yukihiro Matsumoto
Licensed under the Ruby License.
Ruby Standard Library © contributors
Licensed under their own licenses.