未验证 提交 79df097d 编写于 作者: L lipenghui 提交者: GitHub

Replay delayed messages in order. (#7731)

### Motivation

Replay delayed messages in order.

### Verifying this change

A new unit test added.
上级 22d7a6cb
......@@ -336,7 +336,8 @@ public class PersistentDispatcherMultipleConsumers extends AbstractDispatcherMul
}
havePendingReplayRead = true;
Set<? extends Position> deletedMessages = asyncReplayEntries(messagesToReplayNow);
Set<? extends Position> deletedMessages = topic.delayedDeliveryEnabled ?
asyncReplayEntriesInOrder(messagesToReplayNow) : asyncReplayEntries(messagesToReplayNow);
// clear already acked positions from replay bucket
deletedMessages.forEach(position -> messagesToRedeliver.remove(((PositionImpl) position).getLedgerId(),
......@@ -372,6 +373,9 @@ public class PersistentDispatcherMultipleConsumers extends AbstractDispatcherMul
return cursor.asyncReplayEntries(positions, this, ReadType.Replay);
}
protected Set<? extends Position> asyncReplayEntriesInOrder(Set<? extends Position> positions) {
return cursor.asyncReplayEntries(positions, this, ReadType.Replay, true);
}
@Override
public boolean isConsumerConnected() {
......
......@@ -22,6 +22,8 @@ import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertNull;
import static org.testng.Assert.assertTrue;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import java.util.concurrent.TimeUnit;
......@@ -32,6 +34,7 @@ import org.apache.pulsar.client.api.Consumer;
import org.apache.pulsar.client.api.Message;
import org.apache.pulsar.client.api.Producer;
import org.apache.pulsar.client.api.ProducerConsumerBase;
import org.apache.pulsar.client.api.PulsarClientException;
import org.apache.pulsar.client.api.Schema;
import org.apache.pulsar.client.api.SubscriptionType;
import org.testng.annotations.AfterClass;
......@@ -271,4 +274,45 @@ public class DelayedDeliveryTest extends ProducerConsumerBase {
}
t.interrupt();
}
@Test
public void testOrderingDispatch() throws PulsarClientException {
String topic = "persistent://public/default/testOrderingDispatch-" + System.nanoTime();
@Cleanup
Consumer<String> consumer = pulsarClient.newConsumer(Schema.STRING)
.topic(topic)
.subscriptionName("shared-sub")
.subscriptionType(SubscriptionType.Shared)
.subscribe();
@Cleanup
Producer<String> producer = pulsarClient.newProducer(Schema.STRING)
.topic(topic)
.create();
final int N = 1000;
for (int i = 0; i < N; i++) {
producer.newMessage()
.value("msg-" + i)
.deliverAfter(5, TimeUnit.SECONDS)
.send();
}
List<Message<String>> receives = new ArrayList<>(N);
for (int i = 0; i < N; i++) {
Message<String> received = consumer.receive();
receives.add(received);
consumer.acknowledge(received);
}
assertEquals(receives.size(), N);
for (int i = 0; i < N; i++) {
if (i < N - 1) {
assertTrue(receives.get(i).getMessageId().compareTo(receives.get(i + 1).getMessageId()) < 0);
}
}
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册