Skip to content

Commit 198e003

Browse files
committed
[ECO-5163] fix: duplicated messages because of duplicated attach message
1 parent 6c0ffcf commit 198e003

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

lib/src/main/java/io/ably/lib/realtime/ChannelBase.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,13 @@ private void attachImpl(final boolean forceReattach, final CompletionListener li
243243
throw AblyException.fromErrorInfo(connectionManager.getStateErrorInfo());
244244
}
245245

246+
// (RTL4i)
247+
if (connectionManager.getConnectionState().state == ConnectionState.connecting
248+
|| connectionManager.getConnectionState().state == ConnectionState.disconnected) {
249+
setState(ChannelState.attaching, null);
250+
return;
251+
}
252+
246253
/* send attach request and pending state */
247254
Log.v(TAG, "attach(); channel = " + name + "; sending ATTACH request");
248255
ProtocolMessage attachMessage = new ProtocolMessage(Action.attach, this.name);

lib/src/test/java/io/ably/lib/test/realtime/RealtimeMessageTest.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,16 @@
1313
import java.util.HashMap;
1414
import java.util.List;
1515
import java.util.Locale;
16+
import java.util.Map;
17+
import java.util.concurrent.atomic.AtomicInteger;
18+
import java.util.stream.Collectors;
1619

1720
import com.google.gson.Gson;
1821
import com.google.gson.JsonArray;
1922
import com.google.gson.JsonElement;
2023
import com.google.gson.JsonObject;
2124
import com.google.gson.JsonPrimitive;
25+
import io.ably.lib.types.ChannelOptions;
2226
import io.ably.lib.types.MessageAction;
2327
import io.ably.lib.types.MessageExtras;
2428
import io.ably.lib.types.Param;
@@ -1010,4 +1014,42 @@ public void should_have_serial_action_createdAt() throws AblyException {
10101014
assertNull(msgComplete.waitFor(1, 10_000));
10111015
}
10121016
}
1017+
1018+
@Test
1019+
public void should_not_duplicate_messages() throws Exception {
1020+
ClientOptions opts = createOptions(testVars.keys[0].keyStr);
1021+
opts.logLevel = 2;
1022+
String testChannelName = "my-channel" + System.currentTimeMillis();
1023+
try (AblyRest rest = new AblyRest(opts)) {
1024+
final io.ably.lib.rest.Channel channel = rest.channels.get(testChannelName);
1025+
List<String> testMessagesData = List.of("message 1", "message 2", "message 3");
1026+
List<Message> messages = testMessagesData
1027+
.stream()
1028+
.map(data -> new Message("name", data))
1029+
.collect(Collectors.toList());
1030+
channel.publish(messages.toArray(Message[]::new));
1031+
}
1032+
1033+
try (AblyRealtime realtime = new AblyRealtime(opts)) {
1034+
final ChannelOptions options = new ChannelOptions();
1035+
options.params = Map.of("rewind", "10");
1036+
final Channel channel = realtime.channels.get(testChannelName, options);
1037+
final CompletionWaiter completionWaiter = new CompletionWaiter();
1038+
final AtomicInteger counter = new AtomicInteger();
1039+
1040+
channel.subscribe(message -> {
1041+
int value = counter.incrementAndGet();
1042+
if (value == 3) completionWaiter.onSuccess();
1043+
});
1044+
1045+
completionWaiter.waitFor();
1046+
1047+
assertEquals("Should be exactly 3 messages",3, counter.get());
1048+
1049+
Thread.sleep(1500);
1050+
1051+
assertEquals("Should be exactly 3 messages even after 1.5 sec wait",3, counter.get());
1052+
}
1053+
}
1054+
10131055
}

0 commit comments

Comments
 (0)