Sha256: 51f0680165af2703bb72b5f15a5973ee5f35566e4196ac65d50765112b22e6fc
Contents?: true
Size: 1.86 KB
Versions: 5
Compression:
Stored size: 1.86 KB
Contents
# frozen_string_literal: true require 'redis' module Pears module Provider # Config using redis subscription. This updates automatically upon Redis # channel updates. # This class would register as "alternative classes with different interfaces". # I ought to clean this up and maybe make "triggers" a different entity # from a provider available in the builder. class Subscription < Base attr_reader :subscription def initialize(channel=nil, redis_host: Pears.config.redis_host, **opts, &fetcher) @builder = opts[:builder] || Builder.new(nil) @channel = channel # Fetcher is a "Provider" of some sort. @fetcher = fetcher # Setup redis subscription establish_connection(redis_host) load_config subscribe end def channel @channel ||= @builder.subject_name end def load_config @builder.freeze_layers do @data = @fetcher.call.data end end # This seems a bit "rough" of an approach. we should check if # unsubscribing can be done more gracefully. def unsubscribe @subscription.terminate end def purge unsubscribe true end private def subscribe nth = 0 @subscription = Thread.new do loop do connection.subscribe(channel) do |on| on.message { |_channel, _message| load_config } end nth += 1 puts "Pears connection was lost for the #{nth}th time" end end end def connection @connection ||= establish_connection end def establish_connection(host='redis') @connection = ::Redis.new(host: host, reconnect_attempts: 10, reconnect_delay: 5) end end end end
Version data entries
5 entries across 5 versions & 1 rubygems