|
16 | 16 |
|
17 | 17 | package org.springframework.kafka.listener;
|
18 | 18 |
|
19 |
| -import java.nio.ByteBuffer; |
20 |
| -import java.time.Duration; |
21 |
| -import java.util.AbstractMap.SimpleEntry; |
22 |
| -import java.util.ArrayList; |
23 |
| -import java.util.Arrays; |
24 |
| -import java.util.Collection; |
25 |
| -import java.util.Collections; |
26 |
| -import java.util.HashMap; |
27 |
| -import java.util.HashSet; |
28 |
| -import java.util.Iterator; |
29 |
| -import java.util.LinkedHashMap; |
30 |
| -import java.util.LinkedHashSet; |
31 |
| -import java.util.LinkedList; |
32 |
| -import java.util.List; |
33 |
| -import java.util.Map; |
34 |
| -import java.util.Map.Entry; |
35 |
| -import java.util.Objects; |
36 |
| -import java.util.Properties; |
37 |
| -import java.util.Set; |
38 |
| -import java.util.concurrent.BlockingQueue; |
39 |
| -import java.util.concurrent.CompletableFuture; |
40 |
| -import java.util.concurrent.ConcurrentHashMap; |
41 |
| -import java.util.concurrent.ConcurrentLinkedDeque; |
42 |
| -import java.util.concurrent.CountDownLatch; |
43 |
| -import java.util.concurrent.LinkedBlockingQueue; |
44 |
| -import java.util.concurrent.ScheduledFuture; |
45 |
| -import java.util.concurrent.TimeUnit; |
46 |
| -import java.util.concurrent.atomic.AtomicBoolean; |
47 |
| -import java.util.function.BiConsumer; |
48 |
| -import java.util.function.Function; |
49 |
| -import java.util.regex.Pattern; |
50 |
| -import java.util.stream.Collectors; |
51 |
| - |
52 | 19 | import io.micrometer.observation.Observation;
|
53 | 20 | import io.micrometer.observation.ObservationRegistry;
|
54 | 21 | import org.apache.kafka.clients.admin.AdminClientConfig;
|
|
76 | 43 | import org.apache.kafka.common.header.Header;
|
77 | 44 | import org.apache.kafka.common.header.internals.RecordHeader;
|
78 | 45 | import org.jspecify.annotations.Nullable;
|
79 |
| - |
80 | 46 | import org.springframework.aop.support.AopUtils;
|
81 | 47 | import org.springframework.beans.BeanUtils;
|
82 | 48 | import org.springframework.context.ApplicationContext;
|
|
139 | 105 | import org.springframework.util.ObjectUtils;
|
140 | 106 | import org.springframework.util.StringUtils;
|
141 | 107 |
|
| 108 | +import java.nio.ByteBuffer; |
| 109 | +import java.time.Duration; |
| 110 | +import java.util.AbstractMap.SimpleEntry; |
| 111 | +import java.util.ArrayList; |
| 112 | +import java.util.Arrays; |
| 113 | +import java.util.Collection; |
| 114 | +import java.util.Collections; |
| 115 | +import java.util.HashMap; |
| 116 | +import java.util.HashSet; |
| 117 | +import java.util.Iterator; |
| 118 | +import java.util.LinkedHashMap; |
| 119 | +import java.util.LinkedHashSet; |
| 120 | +import java.util.LinkedList; |
| 121 | +import java.util.List; |
| 122 | +import java.util.Map; |
| 123 | +import java.util.Map.Entry; |
| 124 | +import java.util.Objects; |
| 125 | +import java.util.Properties; |
| 126 | +import java.util.Set; |
| 127 | +import java.util.concurrent.BlockingQueue; |
| 128 | +import java.util.concurrent.CompletableFuture; |
| 129 | +import java.util.concurrent.ConcurrentHashMap; |
| 130 | +import java.util.concurrent.ConcurrentLinkedDeque; |
| 131 | +import java.util.concurrent.CountDownLatch; |
| 132 | +import java.util.concurrent.LinkedBlockingQueue; |
| 133 | +import java.util.concurrent.ScheduledFuture; |
| 134 | +import java.util.concurrent.TimeUnit; |
| 135 | +import java.util.concurrent.atomic.AtomicBoolean; |
| 136 | +import java.util.function.BiConsumer; |
| 137 | +import java.util.function.Function; |
| 138 | +import java.util.regex.Pattern; |
| 139 | +import java.util.stream.Collectors; |
| 140 | + |
142 | 141 | /**
|
143 | 142 | * Single-threaded Message listener container using the Java {@link Consumer} supporting
|
144 | 143 | * auto-partition assignment or user-configured assignment.
|
@@ -680,16 +679,16 @@ private final class ListenerConsumer implements SchedulingAwareRunnable, Consume
|
680 | 679 |
|
681 | 680 | private final @Nullable CommonErrorHandler commonErrorHandler;
|
682 | 681 |
|
683 |
| - @Deprecated(since = "3.2", forRemoval = true) |
684 | 682 | @SuppressWarnings("removal")
|
685 | 683 | private final @Nullable PlatformTransactionManager transactionManager =
|
686 | 684 | this.containerProperties.getKafkaAwareTransactionManager() != null ?
|
687 | 685 | this.containerProperties.getKafkaAwareTransactionManager() :
|
688 | 686 | this.containerProperties.getTransactionManager();
|
689 | 687 |
|
690 | 688 | private final @Nullable KafkaAwareTransactionManager<?, ?> kafkaTxManager =
|
691 |
| - this.transactionManager instanceof KafkaAwareTransactionManager<?, ?> kafkaAwareTransactionManager ? |
692 |
| - kafkaAwareTransactionManager : null; |
| 689 | + this.transactionManager instanceof KafkaAwareTransactionManager |
| 690 | + ? (KafkaAwareTransactionManager<?, ?>) this.transactionManager |
| 691 | + : null; |
693 | 692 |
|
694 | 693 | private final @Nullable TransactionTemplate transactionTemplate;
|
695 | 694 |
|
@@ -1498,7 +1497,13 @@ protected void handleAsyncFailure() {
|
1498 | 1497 | // We will give up on retrying with the remaining copied and failed Records.
|
1499 | 1498 | for (FailedRecordTuple<K, V> copyFailedRecord : copyFailedRecords) {
|
1500 | 1499 | try {
|
1501 |
| - invokeErrorHandlerBySingleRecord(copyFailedRecord); |
| 1500 | + KafkaListenerObservation.LISTENER_OBSERVATION.observation( |
| 1501 | + getContainerProperties().getObservationConvention(), |
| 1502 | + DefaultKafkaListenerObservationConvention.INSTANCE, |
| 1503 | + () -> new KafkaRecordReceiverContext(copyFailedRecord.record(), getListenerId(), |
| 1504 | + getClientId(), this.consumerGroupId, this::clusterId), |
| 1505 | + this.observationRegistry) |
| 1506 | + .observe(() -> invokeErrorHandlerBySingleRecord(copyFailedRecord)); |
1502 | 1507 | }
|
1503 | 1508 | catch (Exception e) {
|
1504 | 1509 | this.logger.warn(() ->
|
|
0 commit comments