From 5ba021d98c63bf9b6f56c9f1775fa74f9313a1db Mon Sep 17 00:00:00 2001 From: peiyush13 Date: Fri, 6 Jul 2018 18:46:44 +0530 Subject: [PATCH 1/2] Add reconnection support Added reconnection strategy for socketclusterclient --- README.md | 2 +- examples/reconnection.rb | 6 +-- lib/sc_client.rb | 19 +++---- lib/socketclusterclient/reconnect.rb | 74 ++++++++++++++++++++++++++++ 4 files changed, 86 insertions(+), 15 deletions(-) create mode 100644 lib/socketclusterclient/reconnect.rb diff --git a/README.md b/README.md index 9af18e7..88d0950 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ Create instance of `Socket` class by passing url of socketcluster-server end-poi socket.connect ``` -- For disabling reconnection to server +- To disable Automatic Reconnection ```ruby # This will disable reconnection to socketcluster-server diff --git a/examples/reconnection.rb b/examples/reconnection.rb index 1050ad7..7c9b986 100644 --- a/examples/reconnection.rb +++ b/examples/reconnection.rb @@ -18,6 +18,6 @@ socket = ScClient.new('ws://localhost:8000/socketcluster/') socket.set_basic_listener(on_connect, on_disconnect, on_connect_error) socket.set_authentication_listener(on_set_authentication, on_authentication) -socket.set_reconnection(true) # default reconnection is true -socket.set_delay(5) # reconnect in 5 seconds -socket.connect +socket.set_reconnection(false) # default reconnection is true +socket.max_attempts = 5 +socket.reconnect diff --git a/lib/sc_client.rb b/lib/sc_client.rb index 7b2f342..ab3e340 100644 --- a/lib/sc_client.rb +++ b/lib/sc_client.rb @@ -1,9 +1,11 @@ require 'websocket-eventmachine-client' require 'json' +require 'logger' require_relative './socketclusterclient/emitter' require_relative './socketclusterclient/parser' require_relative './socketclusterclient/data_models' +require_relative './socketclusterclient/reconnect' # # Class ScClient provides an interface to connect to the socketcluster server @@ -13,6 +15,9 @@ class ScClient include Emitter include DataModels + include Reconnect + + attr_accessor :reconnect_interval, :max_reconnect_interval, :reconnect_decay, :max_attempts, :attempts_made # # Initializes instance variables in socketcluster client @@ -28,6 +33,9 @@ def initialize(url) @enable_reconnection = true @delay = 3 initialize_emitter + initialize_reconnect + @logger = Logger.new(STDOUT) + @logger.level = Logger::WARN end # @@ -340,15 +348,4 @@ def reset_value def increment_cnt @cnt += 1 end - - # - # Reconnects to ScServer after delay - # - # - # - # - def reconnect - sleep @delay - connect - end end diff --git a/lib/socketclusterclient/reconnect.rb b/lib/socketclusterclient/reconnect.rb new file mode 100644 index 0000000..9c17ea1 --- /dev/null +++ b/lib/socketclusterclient/reconnect.rb @@ -0,0 +1,74 @@ +# +# Module Reconnect provides Reconnection Support +# +# @author Piyush Wani +# +module Reconnect + + # + # Initializes Reconnection related entities + # + # + # + # + def initialize_reconnect + @reconnect_interval = 2000 + @max_reconnect_interval = 30000 + @reconnect_decay = 1 + @max_attempts = nil + @attempts_made = 0 + end + + # + # Adds handler for Reconnection + # + # @param [Integer] reconnect_interval A interval for reconnection attempt( in MiliSeconds ) + # @param [Integer] max_reconnect_interval The Max Limit for reconnection interval (in MiliSeconds) + # @param [Integer] reconnect_decay A + # @param [Integer] max_attempts The Maximum number of Reconnection Attempts Allowed + # + # + # + def set_reconnection_listener(reconnect_interval, max_reconnect_interval, reconnect_decay, max_attempts) + @max_reconnect_interval = max_reconnect_interval + @reconnect_interval = (@reconnect_interval > @max_reconnect_interval) ? @max_reconnect_interval : @reconnect_interval + @reconnect_decay = reconnect_decay + @max_attempts = max_attempts + @attempts_made = 0 + end + + # + # Reconnects to ScServer after delay + # + # + # + def reconnect + if (@reconnect_interval < @max_reconnect_interval) + @reconnect_interval = @reconnect_interval * @reconnect_decay + @reconnect_interval = @max_reconnect_interval if (@reconnect_interval > @max_reconnect_interval) + end + + until reconnection_attempts_finished do + @attempts_made += 1 + @logger.warn("Attempt number : #{@attempts_made} ") + connect + sleep(@reconnect_interval/1000) + end + + @attempts_made = 0 + @logger.warn("Unable to reconnect: max reconnection attempts reached") + end + + private + + # + # Checks whether all attempts are finished or not + # + # + # @return [Boolean] Attempts finished + # + def reconnection_attempts_finished + return @attempts_made == @max_attempts + end + +end From 24b056674b2cb17513ee8dea04b259b2598c1122 Mon Sep 17 00:00:00 2001 From: peiyush13 Date: Fri, 6 Jul 2018 20:01:25 +0530 Subject: [PATCH 2/2] Minor changes in reconnection Changed code as per the Rubocop generated suggestions --- README.md | 2 +- lib/socketclusterclient/reconnect.rb | 22 ++++++++++------------ 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 88d0950..572fca9 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ Create instance of `Socket` class by passing url of socketcluster-server end-poi socket.connect ``` -- To disable Automatic Reconnection +- To disable automatic reconnection to server ```ruby # This will disable reconnection to socketcluster-server diff --git a/lib/socketclusterclient/reconnect.rb b/lib/socketclusterclient/reconnect.rb index 9c17ea1..83471e2 100644 --- a/lib/socketclusterclient/reconnect.rb +++ b/lib/socketclusterclient/reconnect.rb @@ -1,10 +1,9 @@ # # Module Reconnect provides Reconnection Support # -# @author Piyush Wani +# @author Piyush Wani # module Reconnect - # # Initializes Reconnection related entities # @@ -13,7 +12,7 @@ module Reconnect # def initialize_reconnect @reconnect_interval = 2000 - @max_reconnect_interval = 30000 + @max_reconnect_interval = 30_000 @reconnect_decay = 1 @max_attempts = nil @attempts_made = 0 @@ -30,8 +29,8 @@ def initialize_reconnect # # def set_reconnection_listener(reconnect_interval, max_reconnect_interval, reconnect_decay, max_attempts) + @reconnect_interval = (reconnect_interval > max_reconnect_interval) ? max_reconnect_interval : reconnect_interval @max_reconnect_interval = max_reconnect_interval - @reconnect_interval = (@reconnect_interval > @max_reconnect_interval) ? @max_reconnect_interval : @reconnect_interval @reconnect_decay = reconnect_decay @max_attempts = max_attempts @attempts_made = 0 @@ -43,20 +42,20 @@ def set_reconnection_listener(reconnect_interval, max_reconnect_interval, reconn # # def reconnect - if (@reconnect_interval < @max_reconnect_interval) - @reconnect_interval = @reconnect_interval * @reconnect_decay - @reconnect_interval = @max_reconnect_interval if (@reconnect_interval > @max_reconnect_interval) + if @reconnect_interval < @max_reconnect_interval + @reconnect_interval *= @reconnect_decay + @reconnect_interval = @max_reconnect_interval if @reconnect_interval > @max_reconnect_interval end - until reconnection_attempts_finished do + until reconnection_attempts_finished @attempts_made += 1 @logger.warn("Attempt number : #{@attempts_made} ") connect - sleep(@reconnect_interval/1000) + sleep(@reconnect_interval / 1000) end @attempts_made = 0 - @logger.warn("Unable to reconnect: max reconnection attempts reached") + @logger.warn('Unable to reconnect: max reconnection attempts reached') end private @@ -68,7 +67,6 @@ def reconnect # @return [Boolean] Attempts finished # def reconnection_attempts_finished - return @attempts_made == @max_attempts + @attempts_made == @max_attempts end - end