|
21 | 21 | import static org.mockito.ArgumentMatchers.any;
|
22 | 22 | import static org.mockito.BDDMockito.given;
|
23 | 23 | import static org.mockito.BDDMockito.willAnswer;
|
| 24 | +import static org.mockito.Mockito.inOrder; |
24 | 25 | import static org.mockito.Mockito.mock;
|
25 | 26 | import static org.mockito.Mockito.times;
|
26 | 27 | import static org.mockito.Mockito.verify;
|
|
38 | 39 | import org.apache.kafka.clients.consumer.ConsumerRecords;
|
39 | 40 | import org.apache.kafka.common.TopicPartition;
|
40 | 41 | import org.junit.jupiter.api.Test;
|
| 42 | +import org.mockito.InOrder; |
41 | 43 |
|
42 | 44 | import org.springframework.kafka.KafkaException;
|
43 | 45 | import org.springframework.util.backoff.FixedBackOff;
|
@@ -165,4 +167,39 @@ void exitOnContainerStop() {
|
165 | 167 | assertThat(this.invoked).isEqualTo(1);
|
166 | 168 | }
|
167 | 169 |
|
| 170 | + @Test |
| 171 | + void rePauseOnRebalance() { |
| 172 | + this.invoked = 0; |
| 173 | + List<ConsumerRecord<?, ?>> recovered = new ArrayList<>(); |
| 174 | + FallbackBatchErrorHandler eh = new FallbackBatchErrorHandler(new FixedBackOff(0L, 1L), (cr, ex) -> { |
| 175 | + recovered.add(cr); |
| 176 | + }); |
| 177 | + Map<TopicPartition, List<ConsumerRecord<Object, Object>>> map = new HashMap<>(); |
| 178 | + map.put(new TopicPartition("foo", 0), |
| 179 | + Collections.singletonList(new ConsumerRecord<>("foo", 0, 0L, "foo", "bar"))); |
| 180 | + map.put(new TopicPartition("foo", 1), |
| 181 | + Collections.singletonList(new ConsumerRecord<>("foo", 1, 0L, "foo", "bar"))); |
| 182 | + ConsumerRecords<?, ?> records = new ConsumerRecords<>(map); |
| 183 | + Consumer<?, ?> consumer = mock(Consumer.class); |
| 184 | + willAnswer(inv -> { |
| 185 | + eh.onPartitionsAssigned(consumer, List.of(new TopicPartition("foo", 0), new TopicPartition("foo", 1))); |
| 186 | + return records; |
| 187 | + }).given(consumer).poll(any()); |
| 188 | + MessageListenerContainer container = mock(MessageListenerContainer.class); |
| 189 | + given(container.isRunning()).willReturn(true); |
| 190 | + eh.handle(new RuntimeException(), records, consumer, container, () -> { |
| 191 | + this.invoked++; |
| 192 | + throw new RuntimeException(); |
| 193 | + }); |
| 194 | + assertThat(this.invoked).isEqualTo(1); |
| 195 | + assertThat(recovered).hasSize(2); |
| 196 | + InOrder inOrder = inOrder(consumer); |
| 197 | + inOrder.verify(consumer).pause(any()); |
| 198 | + inOrder.verify(consumer).poll(any()); |
| 199 | + inOrder.verify(consumer).pause(any()); |
| 200 | + inOrder.verify(consumer).resume(any()); |
| 201 | + verify(consumer, times(3)).assignment(); |
| 202 | + verifyNoMoreInteractions(consumer); |
| 203 | + } |
| 204 | + |
168 | 205 | }
|
0 commit comments