|
@@ -1,10 +1,12 @@
|
|
package com.chelvc.framework.kafka.interceptor;
|
|
package com.chelvc.framework.kafka.interceptor;
|
|
|
|
|
|
|
|
+import java.util.List;
|
|
import java.util.Map;
|
|
import java.util.Map;
|
|
|
|
|
|
import com.chelvc.framework.base.context.ApplicationContextHolder;
|
|
import com.chelvc.framework.base.context.ApplicationContextHolder;
|
|
import com.chelvc.framework.base.context.SessionContextHolder;
|
|
import com.chelvc.framework.base.context.SessionContextHolder;
|
|
import com.chelvc.framework.common.util.ErrorUtils;
|
|
import com.chelvc.framework.common.util.ErrorUtils;
|
|
|
|
+import com.chelvc.framework.common.util.ObjectUtils;
|
|
import com.chelvc.framework.kafka.context.KafkaContextHolder;
|
|
import com.chelvc.framework.kafka.context.KafkaContextHolder;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import lombok.extern.slf4j.Slf4j;
|
|
import org.apache.kafka.clients.consumer.Consumer;
|
|
import org.apache.kafka.clients.consumer.Consumer;
|
|
@@ -25,6 +27,17 @@ import org.springframework.stereotype.Component;
|
|
@Component
|
|
@Component
|
|
public class KafkaRecordInterceptor implements ProducerInterceptor<Object, Object>,
|
|
public class KafkaRecordInterceptor implements ProducerInterceptor<Object, Object>,
|
|
ConsumerAwareRecordInterceptor<Object, Object> {
|
|
ConsumerAwareRecordInterceptor<Object, Object> {
|
|
|
|
+ /**
|
|
|
|
+ * Kafka消息记录适配器列表单例对象
|
|
|
|
+ */
|
|
|
|
+ private static class KafkaRecordAdapters {
|
|
|
|
+ /**
|
|
|
|
+ * 适配器实例列表
|
|
|
|
+ */
|
|
|
|
+ private static final List<KafkaRecordAdapter> INSTANCES =
|
|
|
|
+ ApplicationContextHolder.getSortBeans(KafkaRecordAdapter.class);
|
|
|
|
+ }
|
|
|
|
+
|
|
@Override
|
|
@Override
|
|
public ProducerRecord<Object, Object> onSend(ProducerRecord<Object, Object> record) {
|
|
public ProducerRecord<Object, Object> onSend(ProducerRecord<Object, Object> record) {
|
|
// 初始化会话信息到消息头
|
|
// 初始化会话信息到消息头
|
|
@@ -33,9 +46,17 @@ public class KafkaRecordInterceptor implements ProducerInterceptor<Object, Objec
|
|
// 隔离消息主题环境
|
|
// 隔离消息主题环境
|
|
String topic = KafkaContextHolder.isolate(record.topic());
|
|
String topic = KafkaContextHolder.isolate(record.topic());
|
|
|
|
|
|
- // 构建新的消息生产记录
|
|
|
|
- return new ProducerRecord<>(topic, record.partition(), record.timestamp(), record.key(),
|
|
|
|
- record.value(), record.headers());
|
|
|
|
|
|
+ // 构建并适配消息记录
|
|
|
|
+ record = new ProducerRecord<>(topic, record.partition(), record.timestamp(), record.key(), record.value(),
|
|
|
|
+ record.headers());
|
|
|
|
+ if (ObjectUtils.notEmpty(KafkaRecordAdapters.INSTANCES)) {
|
|
|
|
+ for (KafkaRecordAdapter adapter : KafkaRecordAdapters.INSTANCES) {
|
|
|
|
+ if ((record = adapter.produce(record)) == null) {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return record;
|
|
}
|
|
}
|
|
|
|
|
|
@Override
|
|
@Override
|
|
@@ -63,6 +84,15 @@ public class KafkaRecordInterceptor implements ProducerInterceptor<Object, Objec
|
|
|
|
|
|
// 设置当前会话信息
|
|
// 设置当前会话信息
|
|
SessionContextHolder.setSession(KafkaContextHolder.getSession(record.headers()));
|
|
SessionContextHolder.setSession(KafkaContextHolder.getSession(record.headers()));
|
|
|
|
+
|
|
|
|
+ // 适配消息记录
|
|
|
|
+ if (ObjectUtils.notEmpty(KafkaRecordAdapters.INSTANCES)) {
|
|
|
|
+ for (KafkaRecordAdapter adapter : KafkaRecordAdapters.INSTANCES) {
|
|
|
|
+ if ((record = adapter.consume(record)) == null) {
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
return record;
|
|
return record;
|
|
}
|
|
}
|
|
|
|
|