Skip to content

Commit 02fde8c

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

File tree

3 files changed

+56
-1
lines changed

3 files changed

+56
-1
lines changed

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,16 @@ 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+
if (listener != null) {
250+
on(new ChannelStateCompletionListener(listener, ChannelState.attached, ChannelState.failed));
251+
}
252+
setState(ChannelState.attaching, null);
253+
return;
254+
}
255+
246256
/* send attach request and pending state */
247257
Log.v(TAG, "attach(); channel = " + name + "; sending ATTACH request");
248258
ProtocolMessage attachMessage = new ProtocolMessage(Action.attach, this.name);

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ public void connect_fail_notfound_error() throws AblyException {
7575
public void connect_fail_authorized_error() throws AblyException {
7676
AblyRealtime ably = null;
7777
try {
78-
ClientOptions opts = createOptions(testVars.appId + ".invalid_key_id:invalid_key_value");
78+
String keyId = testVars.keys[0].keyName.split("\\.")[1];
79+
ClientOptions opts = createOptions(testVars.appId + "." + keyId + ":invalid_key_value");
7980
ably = new AblyRealtime(opts);
8081
ConnectionWaiter connectionWaiter = new ConnectionWaiter(ably.connection);
8182

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

Lines changed: 44 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,44 @@ 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+
String testChannelName = "my-channel" + System.currentTimeMillis();
1022+
try (AblyRest rest = new AblyRest(opts)) {
1023+
final io.ably.lib.rest.Channel channel = rest.channels.get(testChannelName);
1024+
1025+
Message[] messages = new Message[] {
1026+
new Message("name", "message 1"),
1027+
new Message("name", "message 2"),
1028+
new Message("name", "message 3"),
1029+
};
1030+
1031+
channel.publish(messages);
1032+
}
1033+
1034+
try (AblyRealtime realtime = new AblyRealtime(opts)) {
1035+
final ChannelOptions options = new ChannelOptions();
1036+
options.params = new HashMap<>();
1037+
options.params.put("rewind", "10");
1038+
final Channel channel = realtime.channels.get(testChannelName, options);
1039+
final CompletionWaiter completionWaiter = new CompletionWaiter();
1040+
final AtomicInteger counter = new AtomicInteger();
1041+
1042+
channel.subscribe(message -> {
1043+
int value = counter.incrementAndGet();
1044+
if (value == 3) completionWaiter.onSuccess();
1045+
});
1046+
1047+
completionWaiter.waitFor();
1048+
1049+
assertEquals("Should be exactly 3 messages", 3, counter.get());
1050+
1051+
Thread.sleep(1500);
1052+
1053+
assertEquals("Should be exactly 3 messages even after 1.5 sec wait", 3, counter.get());
1054+
}
1055+
}
1056+
10131057
}

0 commit comments

Comments
 (0)