|
35 | 35 | import org.apache.kafka.connect.runtime.InternalSinkRecord;
|
36 | 36 | import org.apache.kafka.connect.sink.ErrantRecordReporter;
|
37 | 37 | import org.apache.kafka.connect.sink.SinkRecord;
|
| 38 | +import org.slf4j.Logger; |
| 39 | +import org.slf4j.LoggerFactory; |
38 | 40 | import org.springframework.util.StringUtils;
|
39 | 41 |
|
40 | 42 | import java.io.IOException;
|
|
53 | 55 | */
|
54 | 56 | public class WriteBatcherSinkTask extends AbstractSinkTask {
|
55 | 57 |
|
| 58 | + protected static final Logger classLogger = LoggerFactory.getLogger(WriteBatcherSinkTask.class); |
| 59 | + |
56 | 60 | private DatabaseClient databaseClient;
|
57 | 61 | private DataMovementManager dataMovementManager;
|
58 | 62 | private WriteBatcher writeBatcher;
|
@@ -101,20 +105,35 @@ protected void writeSinkRecord(SinkRecord sinkRecord) {
|
101 | 105 |
|
102 | 106 | static void addFailureHeaders(SinkRecord sinkRecord, Throwable e, String failureHeaderValue, WriteEvent writeEvent) {
|
103 | 107 | if (sinkRecord instanceof InternalSinkRecord) {
|
104 |
| - ConsumerRecord<byte[], byte[]> originalRecord = ((InternalSinkRecord) sinkRecord).context().original(); |
105 |
| - originalRecord.headers().add(MARKLOGIC_MESSAGE_FAILURE_HEADER, getBytesHandleNull(failureHeaderValue)); |
106 |
| - originalRecord.headers().add(MARKLOGIC_MESSAGE_EXCEPTION_MESSAGE, getBytesHandleNull(e.getMessage())); |
107 |
| - originalRecord.headers().add(MARKLOGIC_ORIGINAL_TOPIC, getBytesHandleNull(sinkRecord.topic())); |
108 |
| - if (writeEvent != null) { |
109 |
| - originalRecord.headers().add(MARKLOGIC_TARGET_URI, writeEvent.getTargetUri().getBytes(StandardCharsets.UTF_8)); |
| 108 | + try { |
| 109 | + ConsumerRecord<byte[], byte[]> originalRecord = ((InternalSinkRecord) sinkRecord).context().original(); |
| 110 | + addFailureHeadersToOriginalSinkRecord(originalRecord, e, failureHeaderValue, writeEvent); |
| 111 | + } catch (NoSuchMethodError methodException) { |
| 112 | + classLogger.warn("This version of the MarkLogic Kafka Connector requires Kafka version 3.8.0 or" + |
| 113 | + " higher in order to store failure information on the original sink record. Instead, the failure" + |
| 114 | + " information will be on the wrapper sink record."); |
| 115 | + addFailureHeadersToNonInternalSinkRecord(sinkRecord, e, failureHeaderValue, writeEvent); |
110 | 116 | }
|
111 | 117 | } else {
|
112 |
| - sinkRecord.headers().addString(MARKLOGIC_MESSAGE_FAILURE_HEADER, failureHeaderValue); |
113 |
| - sinkRecord.headers().addString(MARKLOGIC_MESSAGE_EXCEPTION_MESSAGE, e.getMessage()); |
114 |
| - sinkRecord.headers().addString(MARKLOGIC_ORIGINAL_TOPIC, sinkRecord.topic()); |
115 |
| - if (writeEvent != null) { |
116 |
| - sinkRecord.headers().addString(MARKLOGIC_TARGET_URI, writeEvent.getTargetUri()); |
117 |
| - } |
| 118 | + addFailureHeadersToNonInternalSinkRecord(sinkRecord, e, failureHeaderValue, writeEvent); |
| 119 | + } |
| 120 | + } |
| 121 | + |
| 122 | + static void addFailureHeadersToNonInternalSinkRecord(SinkRecord sinkRecord, Throwable e, String failureHeaderValue, WriteEvent writeEvent) { |
| 123 | + sinkRecord.headers().addString(MARKLOGIC_MESSAGE_FAILURE_HEADER, failureHeaderValue); |
| 124 | + sinkRecord.headers().addString(MARKLOGIC_MESSAGE_EXCEPTION_MESSAGE, e.getMessage()); |
| 125 | + sinkRecord.headers().addString(MARKLOGIC_ORIGINAL_TOPIC, sinkRecord.topic()); |
| 126 | + if (writeEvent != null) { |
| 127 | + sinkRecord.headers().addString(MARKLOGIC_TARGET_URI, writeEvent.getTargetUri()); |
| 128 | + } |
| 129 | + } |
| 130 | + |
| 131 | + static void addFailureHeadersToOriginalSinkRecord(ConsumerRecord<byte[], byte[]> originalRecord, Throwable e, String failureHeaderValue, WriteEvent writeEvent) { |
| 132 | + originalRecord.headers().add(MARKLOGIC_MESSAGE_FAILURE_HEADER, getBytesHandleNull(failureHeaderValue)); |
| 133 | + originalRecord.headers().add(MARKLOGIC_MESSAGE_EXCEPTION_MESSAGE, getBytesHandleNull(e.getMessage())); |
| 134 | + originalRecord.headers().add(MARKLOGIC_ORIGINAL_TOPIC, getBytesHandleNull(originalRecord.topic())); |
| 135 | + if (writeEvent != null) { |
| 136 | + originalRecord.headers().add(MARKLOGIC_TARGET_URI, writeEvent.getTargetUri().getBytes(StandardCharsets.UTF_8)); |
118 | 137 | }
|
119 | 138 | }
|
120 | 139 |
|
|
0 commit comments