|
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