From 34fecbf1fd66de828dcf27077bb490e35d6bf17a Mon Sep 17 00:00:00 2001 From: Manuel Belsak Date: Wed, 30 Nov 2016 13:59:21 +0000 Subject: [PATCH] Establishe redis connection after its lost after a few minutes --- worker/src/Worker/Program.cs | 34 +++++++++++++++++++++++++++++----- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/worker/src/Worker/Program.cs b/worker/src/Worker/Program.cs index 000fd3d..634b937 100644 --- a/worker/src/Worker/Program.cs +++ b/worker/src/Worker/Program.cs @@ -17,17 +17,41 @@ namespace Worker try { var pgsql = OpenDbConnection("Server=db;Username=postgres;"); - var redis = OpenRedisConnection("redis").GetDatabase(); + var redisConn = OpenRedisConnection("redis"); + var redis = redisConn.GetDatabase(); + + // Keep alive is not implemented in Npgsql yet. This workaround was recommended: + // https://github.com/npgsql/npgsql/issues/1214#issuecomment-235828359 + var keepAliveCommand = pgsql.CreateCommand(); + keepAliveCommand.CommandText = "SELECT 1"; var definition = new { vote = "", voter_id = "" }; while (true) { + // Reconnect redis if down + if (redisConn == null || !redisConn.IsConnected) { + Console.WriteLine("Reconnecting Redis"); + redis = OpenRedisConnection("redis").GetDatabase(); + } string json = redis.ListLeftPopAsync("votes").Result; if (json != null) { var vote = JsonConvert.DeserializeAnonymousType(json, definition); Console.WriteLine($"Processing vote for '{vote.vote}' by '{vote.voter_id}'"); - UpdateVote(pgsql, vote.voter_id, vote.vote); + // Reconnect DB if down + if (!pgsql.State.Equals(System.Data.ConnectionState.Open)) + { + Console.WriteLine("Reconnecting DB"); + pgsql = OpenDbConnection("Server=db;Username=postgres;"); + } + else + { // Normal +1 vote requested + UpdateVote(pgsql, vote.voter_id, vote.vote); + } + } + else + { + keepAliveCommand.ExecuteNonQuery(); } } } @@ -66,7 +90,7 @@ namespace Worker var command = connection.CreateCommand(); command.CommandText = @"CREATE TABLE IF NOT EXISTS votes ( - id VARCHAR(255) NOT NULL UNIQUE, + id VARCHAR(255) NOT NULL UNIQUE, vote VARCHAR(255) NOT NULL )"; command.ExecuteNonQuery(); @@ -84,7 +108,7 @@ namespace Worker { try { - Console.Error.WriteLine("Connected to redis"); + Console.Error.WriteLine("Connecting to redis"); return ConnectionMultiplexer.Connect(ipAddress); } catch (RedisConnectionException) @@ -123,4 +147,4 @@ namespace Worker } } } -} \ No newline at end of file +}