Consolidate semaphore release logic.
This commit is contained in:
parent
89788fa665
commit
c02b255766
|
@ -196,16 +196,25 @@ public class WebSocketConnection implements DispatchChannel, MessageAvailability
|
||||||
void processStoredMessages() {
|
void processStoredMessages() {
|
||||||
if (processStoredMessagesSemaphore.tryAcquire()) {
|
if (processStoredMessagesSemaphore.tryAcquire()) {
|
||||||
final StoredMessageState state = storedMessageState.getAndSet(StoredMessageState.EMPTY);
|
final StoredMessageState state = storedMessageState.getAndSet(StoredMessageState.EMPTY);
|
||||||
|
final CompletableFuture<Void> queueClearedFuture = new CompletableFuture<>();
|
||||||
|
|
||||||
|
sendNextMessagePage(state != StoredMessageState.PERSISTED_NEW_MESSAGES_AVAILABLE, queueClearedFuture);
|
||||||
|
|
||||||
|
queueClearedFuture.whenComplete((v, cause) -> {
|
||||||
|
if (sentInitialQueueEmptyMessage.compareAndSet(false, true)) {
|
||||||
|
client.sendRequest("PUT", "/api/v1/queue/empty", Collections.singletonList(TimestampHeaderUtil.getTimestampHeader()), Optional.empty());
|
||||||
|
}
|
||||||
|
|
||||||
if (state == StoredMessageState.CACHED_NEW_MESSAGES_AVAILABLE || state == StoredMessageState.PERSISTED_NEW_MESSAGES_AVAILABLE) {
|
|
||||||
sendNextMessagePage(state == StoredMessageState.CACHED_NEW_MESSAGES_AVAILABLE);
|
|
||||||
} else {
|
|
||||||
processStoredMessagesSemaphore.release();
|
processStoredMessagesSemaphore.release();
|
||||||
|
|
||||||
|
if (storedMessageState.get() != StoredMessageState.EMPTY) {
|
||||||
|
processStoredMessages();
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void sendNextMessagePage(final boolean cachedMessagesOnly) {
|
private void sendNextMessagePage(final boolean cachedMessagesOnly, final CompletableFuture<Void> queueClearedFuture) {
|
||||||
final OutgoingMessageEntityList messages = messagesManager.getMessagesForDevice(account.getNumber(), account.getUuid(), device.getId(), client.getUserAgent(), cachedMessagesOnly);
|
final OutgoingMessageEntityList messages = messagesManager.getMessagesForDevice(account.getNumber(), account.getUuid(), device.getId(), client.getUserAgent(), cachedMessagesOnly);
|
||||||
final CompletableFuture<?>[] sendFutures = new CompletableFuture[messages.getMessages().size()];
|
final CompletableFuture<?>[] sendFutures = new CompletableFuture[messages.getMessages().size()];
|
||||||
|
|
||||||
|
@ -238,14 +247,9 @@ public class WebSocketConnection implements DispatchChannel, MessageAvailability
|
||||||
|
|
||||||
CompletableFuture.allOf(sendFutures).whenComplete((v, cause) -> {
|
CompletableFuture.allOf(sendFutures).whenComplete((v, cause) -> {
|
||||||
if (messages.hasMore()) {
|
if (messages.hasMore()) {
|
||||||
sendNextMessagePage(cachedMessagesOnly);
|
sendNextMessagePage(cachedMessagesOnly, queueClearedFuture);
|
||||||
} else {
|
} else {
|
||||||
if (sentInitialQueueEmptyMessage.compareAndSet(false, true)) {
|
queueClearedFuture.complete(null);
|
||||||
client.sendRequest("PUT", "/api/v1/queue/empty", Collections.singletonList(TimestampHeaderUtil.getTimestampHeader()), Optional.empty());
|
|
||||||
}
|
|
||||||
|
|
||||||
processStoredMessagesSemaphore.release();
|
|
||||||
processStoredMessages();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue