This is an automated email from the ASF dual-hosted git repository. tv pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-jcs.git
commit 3f72abf3c8902b16a618e6c4b4b7b0cec15dec82 Author: Thomas Vandahl <[email protected]> AuthorDate: Thu Mar 19 09:41:33 2026 +0100 Replace System.currentTimeMillis() with Instant.now() --- .../jcs4/auxiliary/disk/jdbc/JDBCDiskCache.java | 4 +- .../commons/jcs4/engine/logging/CacheEvent.java | 10 ++-- .../jcs4/utils/discovery/DiscoveredService.java | 9 +-- .../jcs4/utils/discovery/UDPDiscoveryService.java | 5 +- .../commons/jcs4/utils/timing/ElapsedTimer.java | 9 ++- .../commons/jcs4/access/TestCacheAccess.java | 68 +++++++++------------- .../discovery/UDPDiscoveryServiceUnitTest.java | 13 +++-- src/site/xdoc/UpgradingFrom3x.xml | 33 +++++++++-- 8 files changed, 84 insertions(+), 67 deletions(-) diff --git a/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/auxiliary/disk/jdbc/JDBCDiskCache.java b/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/auxiliary/disk/jdbc/JDBCDiskCache.java index 6088c4ca..8bab209c 100644 --- a/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/auxiliary/disk/jdbc/JDBCDiskCache.java +++ b/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/auxiliary/disk/jdbc/JDBCDiskCache.java @@ -186,7 +186,7 @@ public class JDBCDiskCache<K, V> if (result.next()) { getTableState().setState( TableStateType.DELETE_RUNNING ); - final long now = System.currentTimeMillis() / 1000; + final Instant now = Instant.now(); final String sql = String.format(SQL_DELETE_EXPIRED, getTableName()); @@ -194,7 +194,7 @@ public class JDBCDiskCache<K, V> { psDelete.setString( 1, "F" ); psDelete.setString( 2, getCacheName() ); - psDelete.setLong( 3, now ); + psDelete.setLong( 3, now.getEpochSecond() ); setAlive(true); diff --git a/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/engine/logging/CacheEvent.java b/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/engine/logging/CacheEvent.java index 63156df4..6f0d2355 100644 --- a/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/engine/logging/CacheEvent.java +++ b/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/engine/logging/CacheEvent.java @@ -19,7 +19,7 @@ package org.apache.commons.jcs4.engine.logging; * under the License. */ -import java.util.Date; +import java.time.Instant; import org.apache.commons.jcs4.engine.logging.behavior.ICacheEvent; import org.apache.commons.jcs4.engine.logging.behavior.ICacheEventLogger.CacheEventType; @@ -27,7 +27,7 @@ import org.apache.commons.jcs4.engine.logging.behavior.ICacheEventLogger.CacheEv /** It's returned from create and passed into log. */ public record CacheEvent<K>( /** The time at which this object was created. */ - long createTime, + Instant createTime, /** The auxiliary or other source of the event. */ String source, @@ -53,7 +53,7 @@ public record CacheEvent<K>( */ public CacheEvent() { - this(System.currentTimeMillis(), null, null, null, null, null); + this(Instant.now(), null, null, null, null, null); } /** @@ -68,7 +68,7 @@ public record CacheEvent<K>( public CacheEvent(final String source, final String region, CacheEventType eventType, String optionalDetails, K key) { - this(System.currentTimeMillis(), source, region, eventType, optionalDetails, key); + this(Instant.now(), source, region, eventType, optionalDetails, key); } /** @@ -79,7 +79,7 @@ public record CacheEvent<K>( { final StringBuilder sb = new StringBuilder(); sb.append("CacheEvent: ").append(eventType) - .append(" Created: ").append(new Date(createTime)); + .append(" Created: ").append(createTime); if (source != null) { sb.append(" Source: ").append(source); diff --git a/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/utils/discovery/DiscoveredService.java b/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/utils/discovery/DiscoveredService.java index 52c10388..69d80e29 100644 --- a/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/utils/discovery/DiscoveredService.java +++ b/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/utils/discovery/DiscoveredService.java @@ -20,6 +20,7 @@ package org.apache.commons.jcs4.utils.discovery; */ import java.io.Serializable; +import java.time.Instant; import java.util.ArrayList; import java.util.Objects; @@ -43,7 +44,7 @@ public class DiscoveredService private int servicePort; /** Last time we heard from this service? */ - private long lastHearFromTime; + private Instant lastHearFromTime; /** * Default constructor @@ -64,7 +65,7 @@ public class DiscoveredService setServiceAddress( message.getHost() ); setCacheNames( message.getCacheNames() ); setServicePort( message.getPort() ); - setLastHearFromTime( System.currentTimeMillis() ); + setLastHearFromTime(Instant.now()); } /** @@ -104,7 +105,7 @@ public class DiscoveredService /** * @return the lastHearFromTime. */ - public long getLastHearFromTime() + public Instant getLastHearFromTime() { return lastHearFromTime; } @@ -143,7 +144,7 @@ public class DiscoveredService /** * @param lastHearFromTime The lastHearFromTime to set. */ - public void setLastHearFromTime( final long lastHearFromTime ) + public void setLastHearFromTime( final Instant lastHearFromTime ) { this.lastHearFromTime = lastHearFromTime; } diff --git a/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/utils/discovery/UDPDiscoveryService.java b/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/utils/discovery/UDPDiscoveryService.java index 513c0f53..65ae7f0e 100644 --- a/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/utils/discovery/UDPDiscoveryService.java +++ b/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/utils/discovery/UDPDiscoveryService.java @@ -25,6 +25,7 @@ import java.net.Inet6Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.net.UnknownHostException; +import java.time.Instant; import java.util.ArrayList; import java.util.Enumeration; import java.util.HashSet; @@ -254,12 +255,12 @@ public class UDPDiscoveryService */ protected void cleanup() { - final long now = System.currentTimeMillis(); + final Instant now = Instant.now(); // the listeners need to be notified. getDiscoveredServices().stream() .filter(service -> { - if (now - service.getLastHearFromTime() > getUdpDiscoveryAttributes().maxIdleTimeSec() * 1000) + if (now.isAfter(service.getLastHearFromTime().plusSeconds(getUdpDiscoveryAttributes().maxIdleTimeSec()))) { log.info( "Removing service, since we haven't heard from it in " + "{0} seconds. service = {1}", diff --git a/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/utils/timing/ElapsedTimer.java b/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/utils/timing/ElapsedTimer.java index acf80fe8..5832c8eb 100644 --- a/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/utils/timing/ElapsedTimer.java +++ b/commons-jcs4-core/src/main/java/org/apache/commons/jcs4/utils/timing/ElapsedTimer.java @@ -19,6 +19,9 @@ package org.apache.commons.jcs4.utils.timing; * under the License. */ +import java.time.Duration; +import java.time.Instant; + /** * This is a simple timer utility. */ @@ -30,7 +33,7 @@ public class ElapsedTimer /** * Sets the start time when created. */ - private long timeStamp = System.currentTimeMillis(); + private Instant timeStamp = Instant.now(); /** * Gets the time elapsed between the start time and now. The start time is reset to now. @@ -40,8 +43,8 @@ public class ElapsedTimer */ public long getElapsedTime() { - final long now = System.currentTimeMillis(); - final long elapsed = now - timeStamp; + final Instant now = Instant.now(); + final long elapsed = Duration.between(timeStamp, now).toMillis(); timeStamp = now; return elapsed; } diff --git a/commons-jcs4-core/src/test/java/org/apache/commons/jcs4/access/TestCacheAccess.java b/commons-jcs4-core/src/test/java/org/apache/commons/jcs4/access/TestCacheAccess.java index 92d843ca..7660f195 100644 --- a/commons-jcs4-core/src/test/java/org/apache/commons/jcs4/access/TestCacheAccess.java +++ b/commons-jcs4-core/src/test/java/org/apache/commons/jcs4/access/TestCacheAccess.java @@ -33,6 +33,7 @@ import org.apache.commons.jcs4.engine.ElementAttributes; import org.apache.commons.jcs4.engine.behavior.IElementAttributes; import org.apache.commons.jcs4.engine.control.event.ElementEventHandlerMockImpl; import org.apache.commons.jcs4.log.Log; +import org.apache.commons.jcs4.utils.timing.ElapsedTimer; /** * Allows the user to run common cache commands from the command line for a test cache. This also @@ -167,7 +168,7 @@ public class TestCacheAccess */ public void getMultiple( final int num, final boolean show ) { - final long n_start = System.currentTimeMillis(); + final ElapsedTimer timer = new ElapsedTimer(); for ( int n = 0; n < num; n++ ) { try @@ -183,8 +184,7 @@ public class TestCacheAccess log.error( e ); } } - final long n_end = System.currentTimeMillis(); - p( "---got " + num + " in " + String.valueOf( n_end - n_start ) + " millis ---" ); + p( "---got " + num + " in " + timer.getElapsedTimeString() + " ---" ); } /** @@ -219,7 +219,7 @@ public class TestCacheAccess } else { - final long n_start = System.currentTimeMillis(); + final ElapsedTimer timer = new ElapsedTimer(); try { final Object obj = cache_control.get( key ); @@ -232,8 +232,7 @@ public class TestCacheAccess { log.error( e ); } - final long n_end = System.currentTimeMillis(); - p( "---got " + key + " in " + String.valueOf( n_end - n_start ) + " millis ---" ); + p( "---got " + key + " in " + timer.getElapsedTimeString() + " ---" ); } } @@ -275,7 +274,7 @@ public class TestCacheAccess } else { - final long n_start = System.currentTimeMillis(); + final ElapsedTimer timer = new ElapsedTimer(); try { for ( int a = 0; a < num; a++ ) @@ -291,8 +290,7 @@ public class TestCacheAccess { log.error( e ); } - final long n_end = System.currentTimeMillis(); - p( "---got " + num + " from group " + group + " in " + String.valueOf( n_end - n_start ) + " millis ---" ); + p( "---got " + num + " from group " + group + " in " + timer.getElapsedTimeString() + " ---" ); } } @@ -332,7 +330,7 @@ public class TestCacheAccess } else { - final long n_start = System.currentTimeMillis(); + final ElapsedTimer timer = new ElapsedTimer(); try { final Object obj = group_cache_control.getFromGroup( key, group ); @@ -345,8 +343,7 @@ public class TestCacheAccess { log.error( e ); } - final long n_end = System.currentTimeMillis(); - p( "---got " + key + " from group " + group + " in " + String.valueOf( n_end - n_start ) + " millis ---" ); + p( "---got " + key + " from group " + group + " in " + timer.getElapsedTimeString() + " ---" ); } } @@ -382,7 +379,7 @@ public class TestCacheAccess } else { - final long n_start = System.currentTimeMillis(); + final ElapsedTimer timer = new ElapsedTimer(); try { final Map<String, String> results = cache_control.getMatching( pattern ); @@ -395,8 +392,7 @@ public class TestCacheAccess { log.error( e ); } - final long n_end = System.currentTimeMillis(); - p( "---gotMatching [" + pattern + "] in " + String.valueOf( n_end - n_start ) + " millis ---" ); + p( "---gotMatching [" + pattern + "] in " + timer.getElapsedTimeString() + " ---" ); } } @@ -475,11 +471,9 @@ public class TestCacheAccess } else { - - final long n_start = System.currentTimeMillis(); + final ElapsedTimer timer = new ElapsedTimer(); cache_control.put( key, val ); - final long n_end = System.currentTimeMillis(); - p( "---put " + key + " | " + val + " in " + String.valueOf( n_end - n_start ) + " millis ---" ); + p( "---put " + key + " | " + val + " in " + timer.getElapsedTimeString() + " ---" ); } } @@ -514,14 +508,13 @@ public class TestCacheAccess } else { - final long n_start = System.currentTimeMillis(); + final ElapsedTimer timer = new ElapsedTimer(); for ( int a = 0; a < num; a++ ) { group_cache_control.putInGroup( "keygr" + a, group, "data " + a + " from putag ----asdfasfas-asfasfas-asfas in group " + group ); } - final long n_end = System.currentTimeMillis(); - p( "---put " + num + " in group " + group + " in " + String.valueOf( n_end - n_start ) + " millis ---" ); + p( "---put " + num + " in group " + group + " in " + timer.getElapsedTimeString() + " ---" ); } } @@ -556,10 +549,9 @@ public class TestCacheAccess } else { - final long n_start = System.currentTimeMillis(); + final ElapsedTimer timer = new ElapsedTimer(); group_cache_control.putInGroup( key, group, "data from putg ----asdfasfas-asfasfas-asfas in group " + group ); - final long n_end = System.currentTimeMillis(); - p( "---put " + key + " in group " + group + " in " + String.valueOf( n_end - n_start ) + " millis ---" ); + p( "---put " + key + " in group " + group + " in " + timer.getElapsedTimeString() + " ---" ); } } @@ -626,13 +618,12 @@ public class TestCacheAccess { try { - final long n_start = System.currentTimeMillis(); + final ElapsedTimer timer = new ElapsedTimer(); for ( int n = 0; n < num; n++ ) { cache_control.put( "key" + n, "data" + n + " put from ta = junk" ); } - final long n_end = System.currentTimeMillis(); - p( "---put " + num + " in " + String.valueOf( n_end - n_start ) + " millis ---" ); + p( "---put " + num + " in " + timer.getElapsedTimeString() + " ---" ); } catch ( final Exception e ) { @@ -715,13 +706,12 @@ public class TestCacheAccess { try { - final long n_start = System.currentTimeMillis(); + final ElapsedTimer timer = new ElapsedTimer(); for ( int n = 0; n < num; n++ ) { cache_control.remove( "key" + n ); } - final long n_end = System.currentTimeMillis(); - p( "---removed " + num + " in " + String.valueOf( n_end - n_start ) + " millis ---" ); + p( "---removed " + num + " in " + timer.getElapsedTimeString() + " ---" ); } catch ( final Exception e ) { @@ -760,7 +750,7 @@ public class TestCacheAccess } else if ( message.startsWith( "getAttributeNames" ) ) { - final long n_start = System.currentTimeMillis(); + final ElapsedTimer timer = new ElapsedTimer(); String groupName = null; final StringTokenizer toke = new StringTokenizer( message ); int tcnt = 0; @@ -774,13 +764,11 @@ public class TestCacheAccess } } getAttributeNames( groupName ); - final long n_end = System.currentTimeMillis(); - p( "---got attrNames for " + groupName + " in " + String.valueOf( n_end - n_start ) + " millis ---" ); + p( "---got attrNames for " + groupName + " in " + timer.getElapsedTimeString() + " ---" ); } else if ( message.startsWith( "shutDown" ) ) { JCS.shutdown(); - //cache_control.dispose(); notDone = false; //System.exit( -1 ); return; @@ -839,7 +827,7 @@ public class TestCacheAccess else { final int num = Integer.parseInt( numS.trim() ); - final long n_start = System.currentTimeMillis(); + final ElapsedTimer timer = new ElapsedTimer(); for ( int n = 0; n < num; n++ ) { final IElementAttributes attrp = cache_control.getDefaultElementAttributes(); @@ -847,8 +835,7 @@ public class TestCacheAccess attrp.addElementEventHandler( hand ); cache_control.put( "key" + n, "data" + n + " put from ta = junk", attrp ); } - final long n_end = System.currentTimeMillis(); - p( "---put " + num + " in " + String.valueOf( n_end - n_start ) + " millis ---" ); + p( "---put " + num + " in " + timer.getElapsedTimeString() + " ---" ); } } else if ( message.startsWith( "put" ) ) @@ -895,13 +882,12 @@ public class TestCacheAccess { final int num = Integer.parseInt( numS.trim() ); final IElementAttributes attrp = new ElementAttributes(); - final long n_start = System.currentTimeMillis(); + final ElapsedTimer timer = new ElapsedTimer(); for ( int n = 0; n < num; n++ ) { new ElementAttributes(attrp); } - final long n_end = System.currentTimeMillis(); - p( "---cloned attr " + num + " in " + String.valueOf( n_end - n_start ) + " millis ---" ); + p( "---cloned attr " + num + " in " + timer.getElapsedTimeString() + " ---" ); } } else if ( message.startsWith( "switch" ) ) diff --git a/commons-jcs4-core/src/test/java/org/apache/commons/jcs4/utils/discovery/UDPDiscoveryServiceUnitTest.java b/commons-jcs4-core/src/test/java/org/apache/commons/jcs4/utils/discovery/UDPDiscoveryServiceUnitTest.java index bcf1eba6..b390a583 100644 --- a/commons-jcs4-core/src/test/java/org/apache/commons/jcs4/utils/discovery/UDPDiscoveryServiceUnitTest.java +++ b/commons-jcs4-core/src/test/java/org/apache/commons/jcs4/utils/discovery/UDPDiscoveryServiceUnitTest.java @@ -23,6 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; +import java.time.Instant; import java.util.ArrayList; import org.apache.commons.jcs4.utils.serialization.StandardSerializer; @@ -67,7 +68,7 @@ class UDPDiscoveryServiceUnitTest discoveredService.setServiceAddress( host ); discoveredService.setCacheNames( new ArrayList<>() ); discoveredService.setServicePort( 1000 ); - discoveredService.setLastHearFromTime( 100 ); + discoveredService.setLastHearFromTime(Instant.ofEpochMilli(100)); final ArrayList<String> differentCacheNames = new ArrayList<>(); differentCacheNames.add( "name1" ); @@ -75,7 +76,7 @@ class UDPDiscoveryServiceUnitTest discoveredService2.setServiceAddress( host ); discoveredService2.setCacheNames( differentCacheNames ); discoveredService2.setServicePort( 1000 ); - discoveredService2.setLastHearFromTime( 500 ); + discoveredService2.setLastHearFromTime(Instant.ofEpochMilli(500)); // DO WORK service.addOrUpdateService( discoveredService ); @@ -119,13 +120,13 @@ class UDPDiscoveryServiceUnitTest discoveredService.setServiceAddress( host ); discoveredService.setCacheNames( sameCacheNames ); discoveredService.setServicePort( 1000 ); - discoveredService.setLastHearFromTime( 100 ); + discoveredService.setLastHearFromTime(Instant.ofEpochMilli(100)); final DiscoveredService discoveredService2 = new DiscoveredService(); discoveredService2.setServiceAddress( host ); discoveredService2.setCacheNames( sameCacheNames ); discoveredService2.setServicePort( 1000 ); - discoveredService2.setLastHearFromTime( 500 ); + discoveredService2.setLastHearFromTime(Instant.ofEpochMilli(500)); // DO WORK service.addOrUpdateService( discoveredService ); @@ -164,7 +165,7 @@ class UDPDiscoveryServiceUnitTest discoveredService.setServiceAddress( host ); discoveredService.setCacheNames( new ArrayList<>() ); discoveredService.setServicePort( 1000 ); - discoveredService.setLastHearFromTime( 100 ); + discoveredService.setLastHearFromTime(Instant.ofEpochMilli(100)); // DO WORK service.addOrUpdateService( discoveredService ); @@ -184,7 +185,7 @@ class UDPDiscoveryServiceUnitTest discoveredService.setServiceAddress( host ); discoveredService.setCacheNames( new ArrayList<>() ); discoveredService.setServicePort( 1000 ); - discoveredService.setLastHearFromTime( 100 ); + discoveredService.setLastHearFromTime(Instant.ofEpochMilli(100)); service.addOrUpdateService( discoveredService ); diff --git a/src/site/xdoc/UpgradingFrom3x.xml b/src/site/xdoc/UpgradingFrom3x.xml index 3a65fc2c..78d8ed91 100644 --- a/src/site/xdoc/UpgradingFrom3x.xml +++ b/src/site/xdoc/UpgradingFrom3x.xml @@ -89,12 +89,25 @@ jcs.auxiliary.blockDiskCache=org.apache.commons.jcs4.auxiliary.disk.block.BlockD You should be aware that data previously saved to auxiliaries will be deleted on startup. </p> + <p> + JCS 4.0.0 tries to pull some long-standing configuration inconsistencies straight. + Note that configuration keys are case-sensitive. See the table of + renamed or removed configuration keys <a href="#ccb">below</a>. + </p> + <p> + Time related configuration items are now represented as <code>java.time.Duration</code> + internally. The corresponding configuration file properties are being parsed using + <code>Duration.parse()</code> and use the syntax documented + <a href="https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/time/Duration.html#parse(java.lang.CharSequence)">here</a>. + If parsing fails, the value is assumed to be a millisecond duration. See the table of + affected configuration keys <a href="#ccb">below</a>. + </p> </subsection> <subsection name="Logging"> <p> - JCS 4.0.0 uses a thin wrapper around the JDK9+ System.Logger interface for logging. - By default, JCS uses java.util.logging as implementation. For a better readability - we recommend to configure the logger formatting like this: + JCS 4.0.0 uses a thin wrapper around the JDK9+ <code>System.Logger</code> interface + for logging. By default, JCS uses <code>java.util.logging</code> as implementation. + For a better readability we recommend to configure the logger formatting like this: </p> <source><![CDATA[ java.util.logging.FileHandler.formatter=java.util.logging.SimpleFormatter @@ -121,8 +134,9 @@ java.util.logging.SimpleFormatter.format=[%1$tF %1$tT] %3$s [%4$-7s] %5$s %n Please note that several internals structures are not exported intentionally. </p> </subsection> - <subsection name="Changed Configuration Behavior"> + <subsection name="Changed Configuration Behavior" id="ccb"> <p> + <b>Breaking:</b> JCS 4.0.0 tries to pull some long-standing configuration inconsistencies straight. Note that configuration keys are case-sensitive. The following configuration keys have been renamed or removed: @@ -179,6 +193,7 @@ java.util.logging.SimpleFormatter.format=[%1$tF %1$tT] %3$s [%4$-7s] %5$s %n environments. </p> <p> + <b>Breaking:</b> Time related configuration items are now represented as <code>java.time.Duration</code> internally. The corresponding configuration file properties are being parsed using <code>Duration.parse()</code> and use the syntax documented @@ -202,6 +217,16 @@ java.util.logging.SimpleFormatter.format=[%1$tF %1$tT] %3$s [%4$-7s] %5$s %n <td>ShrinkerInterval</td> <td>PT30s</td> </tr> + <tr> + <td>Element configuration (ElementAttributes)</td> + <td>MaxLife</td> + <td>PT-0.001s (unlimited)</td> + </tr> + <tr> + <td></td> + <td>MaxIdleTime</td> + <td>PT-0.001s (unlimited)</td> + </tr> <tr> <td>Thread Pool Configuration (thread_pool, PoolConfiguration)</td> <td>keepAliveTime</td>
