Only allow one thread to process stored messages at a time.

This commit is contained in:
Jon Chambers
2020-09-09 11:28:59 -04:00
committed by Jon Chambers
parent 1a0c70acc2
commit 68256d2343
2 changed files with 81 additions and 2 deletions

View File

@@ -4,6 +4,7 @@ import com.codahale.metrics.Histogram;
import com.codahale.metrics.Meter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.SharedMetricRegistries;
import com.google.common.annotations.VisibleForTesting;
import com.google.protobuf.ByteString;
import com.google.protobuf.InvalidProtocolBufferException;
import org.slf4j.Logger;
@@ -63,6 +64,8 @@ public class WebSocketConnection implements DispatchChannel, MessageAvailability
private final WebSocketClient client;
private final String connectionId;
private boolean processingStoredMessages = false;
public WebSocketConnection(PushSender pushSender,
ReceiptSender receiptSender,
MessagesManager messagesManager,
@@ -180,7 +183,16 @@ public class WebSocketConnection implements DispatchChannel, MessageAvailability
return response != null && response.getStatus() >= 200 && response.getStatus() < 300;
}
private void processStoredMessages() {
@VisibleForTesting
void processStoredMessages() {
synchronized (this) {
if (processingStoredMessages) {
return;
}
processingStoredMessages = true;
}
OutgoingMessageEntityList messages = messagesManager.getMessagesForDevice(account.getNumber(), account.getUuid(), device.getId(), client.getUserAgent());
Iterator<OutgoingMessageEntity> iterator = messages.getMessages().iterator();
@@ -214,6 +226,10 @@ public class WebSocketConnection implements DispatchChannel, MessageAvailability
if (!messages.hasMore()) {
client.sendRequest("PUT", "/api/v1/queue/empty", Collections.singletonList(TimestampHeaderUtil.getTimestampHeader()), Optional.empty());
}
synchronized (this) {
processingStoredMessages = false;
}
}
@Override