Divide the MSB source codes into two repos
[msb/apigateway.git] / apiroute / apiroute-service / src / main / java / org / onap / msb / apiroute / health / RedisHealthCheck.java
diff --git a/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/RedisHealthCheck.java b/apiroute/apiroute-service/src/main/java/org/onap/msb/apiroute/health/RedisHealthCheck.java
new file mode 100644 (file)
index 0000000..7cef3d0
--- /dev/null
@@ -0,0 +1,160 @@
+package org.onap.msb.apiroute.health;
+
+import java.text.SimpleDateFormat;
+
+import org.onap.msb.apiroute.wrapper.util.JedisUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import redis.clients.jedis.Jedis;
+
+import com.codahale.metrics.health.HealthCheck;
+
+public class RedisHealthCheck extends HealthCheck implements Runnable {
+       private static final Logger LOGGER = LoggerFactory
+                       .getLogger(RedisHealthCheck.class);
+
+       public static boolean writeCheckFlag = true;
+       private static Result result = Result.healthy();
+       
+       private static int failedLoopCheckNum = 12;
+       private static int failedTimer = 5 * 1000;
+
+       private static int normalTimer = 20 * 1000;
+
+       public static Result getResult() {
+               return result;
+       }
+
+       @Override
+       protected Result check() {
+
+               // check write
+               if (writeCheckFlag) {
+                       Result writeCheckResult = checkWrite();
+                       if (writeCheckResult.isHealthy()) {
+                               writeCheckFlag = false;
+                       }
+
+                       // write failed
+                       if (!writeCheckResult.isHealthy()) {
+                               return writeCheckResult;
+                       }
+               }
+               
+               // check read
+               Result readCheckResult = checkRead();
+
+               // read failed
+               if (!readCheckResult.isHealthy()) {
+                       return readCheckResult;
+               }
+
+               return Result.healthy();
+       }
+
+       private Result checkRead() {
+               Jedis jedisHandle = null;
+
+               Result healthRst = Result.healthy();
+               try {
+
+                       jedisHandle = JedisUtil.borrowJedisInstance();
+                       jedisHandle.get("healthchek:checktime");
+
+               } catch (Exception e) {
+                       LOGGER.warn("RedisHealthCheck exception", e);
+                       healthRst = Result.unhealthy(e);
+               } finally {
+                       JedisUtil.returnJedisInstance(jedisHandle);
+               }
+
+               return healthRst;
+       }
+
+       private Result checkWrite() {
+               Jedis jedisHandle = null;
+
+               Result healthRst = Result.healthy();
+               try {
+
+                       long currentTime = System.currentTimeMillis();
+                       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                       String date = sdf.format(currentTime);
+
+                       jedisHandle = JedisUtil.borrowJedisInstance();
+                       String statusCode = jedisHandle.set("healthchek:checktime", date);
+
+                       if (statusCode != null && statusCode.equals("OK")) {
+                               healthRst = Result.healthy("check redis:" + statusCode);
+                       } else {
+                               healthRst = Result.unhealthy("check redis:" + statusCode);
+                       }
+
+               } catch (Exception e) {
+                       LOGGER.warn("RedisHealthCheck exception", e);
+                       healthRst = Result.unhealthy(e);
+               } finally {
+                       JedisUtil.returnJedisInstance(jedisHandle);
+               }
+
+               return healthRst;
+       }
+
+       @Override
+       public void run() {
+               // TODO Auto-generated method stub
+               while (true) {
+
+                       if (LOGGER.isDebugEnabled()) {
+                               LOGGER.debug("redis check starttime:"
+                                               + System.currentTimeMillis());
+                       }
+
+                       result = checkWithPolicy();
+
+                       if (LOGGER.isDebugEnabled()) {
+                               LOGGER.debug("redis check result:" + result.isHealthy()
+                                               + " message:" + result.getMessage());
+                               
+                               LOGGER.debug("redis check endtime:"
+                                               + System.currentTimeMillis());
+                       }
+
+                       try {
+                               Thread.sleep(normalTimer);
+                       } catch (InterruptedException e) {
+                               // TODO Auto-generated catch block
+                               LOGGER.warn("loop check redis,thread sleep excepiton", e);
+                       }
+               }
+       }
+       
+       private Result checkWithPolicy() {
+               int failedNum = 0;
+               Result temp = Result.healthy();
+
+               do {
+                       // check again
+                       temp = check();
+
+                       // healthy break;
+                       if (temp.isHealthy()) {
+                               break;
+                       }
+
+                       // unhealthy go on
+                       failedNum++;
+                       
+                       try {
+                               Thread.sleep(failedTimer);
+                       } catch (InterruptedException e) {
+                               // TODO Auto-generated catch block
+                               LOGGER.warn("loop check redis,thread sleep excepiton", e);
+                       }
+                       
+               } while (failedNum <= failedLoopCheckNum);
+
+               return temp;
+       }
+}