Skip to content

Commit 203a412

Browse files
committed
Enhance timeout handling with nanosecond precision
Refactor timeout calculation in `MessageConsumerImpl` to use `System.nanoTime()` for improved precision and reliability. Replaced the previous millisecond-based logic with a deadline-driven approach, ensuring more accurate waiting periods under various conditions.
1 parent b58b3e6 commit 203a412

File tree

1 file changed

+10
-7
lines changed

1 file changed

+10
-7
lines changed

src/main/java/com/swiftmq/jms/v750/MessageConsumerImpl.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import javax.jms.IllegalStateException;
3434
import javax.jms.*;
3535
import java.util.List;
36+
import java.util.concurrent.TimeUnit;
3637
import java.util.concurrent.atomic.AtomicBoolean;
3738
import java.util.concurrent.atomic.AtomicInteger;
3839
import java.util.concurrent.locks.Lock;
@@ -369,14 +370,16 @@ Message receiveMessage(boolean block, long timeout) throws JMSException {
369370
if (timeout == 0) {
370371
waiter.doWait();
371372
} else {
372-
long to = timeout;
373-
do {
374-
long startWait = System.currentTimeMillis();
375-
waiter.doWait(to);
376-
long delta = System.currentTimeMillis() - startWait;
377-
to -= delta;
373+
long deadline = System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(timeout);
374+
long remaining;
375+
376+
while ((remaining = deadline - System.nanoTime()) > 0 &&
377+
messageCache.getSize() == 0 &&
378+
fillCachePending.get() &&
379+
!cancelled.get() &&
380+
!isClosed()) {
381+
waiter.doWait(TimeUnit.NANOSECONDS.toMillis(remaining));
378382
}
379-
while (to > 0 && messageCache.getSize() == 0 && fillCachePending.get() && !cancelled.get() && !isClosed());
380383
}
381384
} else {
382385
if (fillCachePending.get() && receiveNoWaitFirstCall.get()) {

0 commit comments

Comments
 (0)