diff --git a/src/main/java/org/gcube/accounting/aggregator/RegexRulesAggregator.java b/src/main/java/org/gcube/accounting/aggregator/RegexRulesAggregator.java index 7210a42..78e4af3 100644 --- a/src/main/java/org/gcube/accounting/aggregator/RegexRulesAggregator.java +++ b/src/main/java/org/gcube/accounting/aggregator/RegexRulesAggregator.java @@ -10,6 +10,7 @@ import java.util.concurrent.TimeUnit; import org.gcube.accounting.datamodel.validations.validators.MatcherReplace; import org.gcube.accounting.persistence.AccountingPersistenceConfiguration; +import org.gcube.documentstore.persistence.ExecutorUtils; import org.gcube.documentstore.records.DSMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -21,19 +22,19 @@ public class RegexRulesAggregator implements Runnable { private static final Logger logger = LoggerFactory.getLogger(RegexRulesAggregator.class); - private static final ScheduledExecutorService REGEX_REDISCOVERY_POOL; + public static final ScheduledExecutorService REGEX_REDISCOVERY_POOL; protected static final String DELAY = "delay"; protected static final String TIME_UNIT = "timeUnit"; - protected static final String REPLACE_RULES = "MatcherReplaceRules"; + protected static final String MATCHER_REPLACE_RULES = "MatcherReplaceRules"; static { REGEX_REDISCOVERY_POOL = Executors.newScheduledThreadPool(50, new ThreadFactory() { private int counter = 0; - private static final String prefix = "RegexRediscoveryThread"; + private static final String prefix = "AggregationRegexRediscoveryThread"; public Thread newThread(Runnable r) { return new Thread(r, prefix + "-" + counter++); @@ -53,6 +54,10 @@ public class RegexRulesAggregator implements Runnable { protected static RegexRulesAggregator instance; + protected boolean changeRate; + + protected ScheduledFuture reloadAggregatorRules; + public synchronized static RegexRulesAggregator getInstance() { if(instance==null) { instance = new RegexRulesAggregator(); @@ -62,6 +67,7 @@ public class RegexRulesAggregator implements Runnable { protected RegexRulesAggregator() { matcherReplaceList = new ArrayList<>(); + changeRate = false; readConfiguration(); } @@ -79,23 +85,35 @@ public class RegexRulesAggregator implements Runnable { } - protected ScheduledFuture reloadAggregatorRules; + public void readConfiguration() { try { accountingPersistenceConfiguration = new AccountingPersistenceConfiguration(this.getClass()); try { + long oldDelay = delay; + String delayString = accountingPersistenceConfiguration.getProperty(DELAY); delay = Long.parseLong(delayString); + if(oldDelay!=delay) { + changeRate = true; + } + + TimeUnit oldTimeUnit = timeUnit; String timeUnitString = accountingPersistenceConfiguration.getProperty(TIME_UNIT); timeUnit = TimeUnit.valueOf(timeUnitString.toUpperCase()); + + if(oldTimeUnit.ordinal() != timeUnit.ordinal()) { + changeRate = true; + } + }catch (Exception e) { logger.warn("Unable to retrieve regex reload delay. Goign to use last known delay {} {}", delay, timeUnit.name().toLowerCase()); } - String rulesString = accountingPersistenceConfiguration.getProperty(REPLACE_RULES); + String rulesString = accountingPersistenceConfiguration.getProperty(MATCHER_REPLACE_RULES); ObjectMapper mapper = DSMapper.getObjectMapper(); JavaType type = mapper.getTypeFactory().constructCollectionType(List.class, MatcherReplace.class); @@ -112,9 +130,9 @@ public class RegexRulesAggregator implements Runnable { @Override public void run() { readConfiguration(); - } - - public void start() { + if(changeRate) { + stop(); + } if(reloadAggregatorRules == null) { reloadAggregatorRules = REGEX_REDISCOVERY_POOL.scheduleAtFixedRate(this, delay, delay, timeUnit); } @@ -134,4 +152,9 @@ public class RegexRulesAggregator implements Runnable { } } + public static void shutdown() { + RegexRulesAggregator.getInstance().stop(); + ExecutorUtils.shutDownPool(RegexRulesAggregator.REGEX_REDISCOVERY_POOL); + } + } diff --git a/src/main/java/org/gcube/accounting/persistence/AccountingPersistenceFactory.java b/src/main/java/org/gcube/accounting/persistence/AccountingPersistenceFactory.java index 6964fc2..c5728ed 100644 --- a/src/main/java/org/gcube/accounting/persistence/AccountingPersistenceFactory.java +++ b/src/main/java/org/gcube/accounting/persistence/AccountingPersistenceFactory.java @@ -7,6 +7,7 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.TimeUnit; +import org.gcube.accounting.aggregator.RegexRulesAggregator; import org.gcube.accounting.datamodel.BasicUsageRecord; import org.gcube.accounting.datamodel.aggregation.AggregatedServiceUsageRecord; import org.gcube.accounting.datamodel.usagerecords.ServiceUsageRecord; @@ -16,7 +17,7 @@ import org.gcube.documentstore.persistence.PersistenceBackendFactory; * @author Luca Frosini (ISTI - CNR) */ public class AccountingPersistenceFactory { - + private AccountingPersistenceFactory(){} protected final static Map persistences; @@ -24,7 +25,6 @@ public class AccountingPersistenceFactory { public static void initAccountingPackages(){ PersistenceBackendFactory.addRecordPackage(ServiceUsageRecord.class.getPackage()); PersistenceBackendFactory.addRecordPackage(AggregatedServiceUsageRecord.class.getPackage()); - } static { @@ -60,12 +60,13 @@ public class AccountingPersistenceFactory { AccountingPersistenceFactory.flushAll(); } + /** + * Flush all accounting data and shutdown connection and scheduled thread + */ public static void shutDown(){ - //flush all and shutdown connection and thread PersistenceBackendFactory.flushAll(); PersistenceBackendFactory.shutdown(); - - + RegexRulesAggregator.shutdown(); } /**