From 40b638d57c32e0cb08579656fe413a6ccbfcc129 Mon Sep 17 00:00:00 2001 From: freyssin Date: Sun, 13 Dec 2020 17:25:53 +0100 Subject: [PATCH] Fix JDBCTransaction parameters for reconnect mechanism. Adds a metod allowing to dump configuration properties. --- .../fr/dyade/aaa/ext/JDBCTransaction.java | 29 +++++++++++-- .../java/fr/dyade/aaa/util/DBTransaction.java | 41 ++++++++++++++++--- 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/joram/a3/rt/src/main/java/fr/dyade/aaa/ext/JDBCTransaction.java b/joram/a3/rt/src/main/java/fr/dyade/aaa/ext/JDBCTransaction.java index 4f3ad3308..78a6acd39 100644 --- a/joram/a3/rt/src/main/java/fr/dyade/aaa/ext/JDBCTransaction.java +++ b/joram/a3/rt/src/main/java/fr/dyade/aaa/ext/JDBCTransaction.java @@ -91,9 +91,13 @@ public class JDBCTransaction extends DBTransaction implements JDBCTransactionMBe */ public final static String JDBC_CONNECT_RETRY_COUNT_PROP = JDBC_TRANSACTION_PREFIX + ".connect_retry_count"; /** - * This property is used to set the maximum time to attempt to reconnect after a failure, by default 60.000 (60 seconds). + * This property is used to set the minimum time between two attempts to reconnect after a failure, by default 1.000 (1 seconds). */ - public final static String JDBC_CONNECT_RETRY_DELAY_PROP = JDBC_TRANSACTION_PREFIX + ".connect_retry_delay"; + public final static String JDBC_CONNECT_RETRY_MIN_DELAY_PROP = JDBC_TRANSACTION_PREFIX + ".connect_retry_min_delay"; + /** + * This property is used to set the maximum time trying to reconnect after a failure, by default 60.000 (60 seconds). + */ + public final static String JDBC_CONNECT_RETRY_MAX_PERIOD_PROP = JDBC_TRANSACTION_PREFIX + ".connect_retry_max_period"; /** * This property allows to define the SQL statement allowing to create the table used by the module, for example: @@ -253,7 +257,11 @@ public class JDBCTransaction extends DBTransaction implements JDBCTransactionMBe } connectRetryCount = AgentServer.getInteger(JDBC_CONNECT_RETRY_COUNT_PROP, JDBC_CONNECT_RETRY_COUNT_DFLT); - connectRetryDelay = AgentServer.getLong(JDBC_CONNECT_RETRY_DELAY_PROP, JDBC_CONNECT_RETRY_DELAY_DFLT); + if (connectRetryCount < 0) connectRetryCount = 0; + connectRetryMinDelay = AgentServer.getLong(JDBC_CONNECT_RETRY_MIN_DELAY_PROP, JDBC_CONNECT_RETRY_MIN_DELAY_DFLT); + if (connectRetryMinDelay < 0) connectRetryMinDelay = 0; + connectRetryMaxPeriod = AgentServer.getLong(JDBC_CONNECT_RETRY_MAX_PERIOD_PROP, JDBC_CONNECT_RETRY_MAX_PERIOD_DFLT); + if (connectRetryMaxPeriod < 0) connectRetryMaxPeriod = 0; try { Class.forName(driver).newInstance(); @@ -286,6 +294,7 @@ public class JDBCTransaction extends DBTransaction implements JDBCTransactionMBe logmon.log(BasicLevel.WARN, "DBTransaction, init()", sqle); } } + logmon.log(BasicLevel.INFO, "DBTransaction, init(): " + dumpProperties()); } @Override @@ -329,4 +338,18 @@ public class JDBCTransaction extends DBTransaction implements JDBCTransactionMBe public String getPropertiesPath() { return path; } + + + protected void dumpProperties(StringBuilder strbuf) { + super.dumpProperties(strbuf); + strbuf.append('(').append("driver=").append(driver).append(')'); + strbuf.append('(').append("url=").append(connurl).append(')'); + strbuf.append('(').append("dbtable=").append(dbtable).append(')'); + strbuf.append('(').append("dbname=").append(dbname).append(')'); + strbuf.append('(').append("user=").append(user).append(')'); + strbuf.append('(').append("password=").append("***").append(')'); + strbuf.append('(').append("connect_retry_count=").append(connectRetryCount).append(')'); + strbuf.append('(').append("connect_retry_min_delay=").append(connectRetryMinDelay).append(')'); + strbuf.append('(').append("connect_retry_max_period=").append(connectRetryMaxPeriod).append(')'); + } } diff --git a/joram/a3/rt/src/main/java/fr/dyade/aaa/util/DBTransaction.java b/joram/a3/rt/src/main/java/fr/dyade/aaa/util/DBTransaction.java index e6abb9bee..45f9c6ad3 100644 --- a/joram/a3/rt/src/main/java/fr/dyade/aaa/util/DBTransaction.java +++ b/joram/a3/rt/src/main/java/fr/dyade/aaa/util/DBTransaction.java @@ -457,8 +457,10 @@ public abstract class DBTransaction extends AbstractTransaction implements DBTra protected final int JDBC_CONNECT_RETRY_COUNT_DFLT = 5; protected int connectRetryCount = JDBC_CONNECT_RETRY_COUNT_DFLT; - protected final long JDBC_CONNECT_RETRY_DELAY_DFLT = 60000L; - protected long connectRetryDelay = JDBC_CONNECT_RETRY_DELAY_DFLT; + protected final long JDBC_CONNECT_RETRY_MAX_PERIOD_DFLT = 60000L; + protected long connectRetryMaxPeriod = JDBC_CONNECT_RETRY_MAX_PERIOD_DFLT; + protected final long JDBC_CONNECT_RETRY_MIN_DELAY_DFLT = 1000L; + protected long connectRetryMinDelay = JDBC_CONNECT_RETRY_MIN_DELAY_DFLT; public final synchronized void commit(boolean release) throws IOException { if (phase != RUN) @@ -472,6 +474,7 @@ public abstract class DBTransaction extends AbstractTransaction implements DBTra boolean completed = false; int retry = 0; long startRetry = 0L; + long lastTry = 0L; SQLException lastexc = null; do { try { @@ -486,12 +489,25 @@ public abstract class DBTransaction extends AbstractTransaction implements DBTra lastexc = sqle; retry += 1; - if ((connectRetryCount > 0) && (retry > connectRetryCount)) break; + long time = System.currentTimeMillis(); - if (startRetry == 0L) startRetry = System.currentTimeMillis(); - if ((connectRetryDelay > 0L) && ((System.currentTimeMillis() - startRetry) > connectRetryDelay)) break; + if (startRetry == 0L) startRetry = time; + + if ((connectRetryCount > 0) && (retry > connectRetryCount)) break; + if ((connectRetryMaxPeriod > 0L) && ((time - startRetry) > connectRetryMaxPeriod)) break; try { + if (lastTry == 0L) { + // It's the first retry do not wait. + lastTry = time; + } else { + // Wait for at least configured delay + long delay = connectRetryMinDelay - (time - lastTry); + lastTry = time; + try { + if (delay > 0) Thread.sleep(delay); + } catch (InterruptedException exc) {} + } connectDB(); createPreparedStatement(); } catch (IOException exc) {} @@ -808,6 +824,21 @@ public abstract class DBTransaction extends AbstractTransaction implements DBTra logmon.log(BasicLevel.INFO, "DBTransaction, closed"); } } + + + @Override + public String dumpProperties() { + StringBuilder strbuf = new StringBuilder(); + strbuf.append('['); + dumpProperties(strbuf); + strbuf.append(']'); + + return strbuf.toString(); + } + + protected void dumpProperties(StringBuilder strbuf) { + strbuf.append('(').append("dbtable=").append(dbtable); + } } final class DBOperation implements Serializable { -- GitLab