• kafka 发送文件二进制流及使用header发送附属信息


    背景

    需要使用kafka发送文件二进制以及附属信息

    案例

    发送方

    import org.apache.kafka.clients.producer.KafkaProducer;
    import org.apache.kafka.clients.producer.ProducerRecord;
    
    import java.io.InputStream;
    import java.nio.charset.StandardCharsets;
    import java.util.Properties;
    
    public class SendFileToKafka {
    
        public static void main(String[] args) {
    
            String filePath = "com/example/kafka/file/ConsumerFileByteArrayFromKafka.java";
    
            Properties kafkaProps = new Properties();
            kafkaProps.put("bootstrap.servers", "192.168.56.112:9092");
            kafkaProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
            kafkaProps.put("value.serializer", "org.apache.kafka.common.serialization.ByteArraySerializer");
            KafkaProducer<String, byte[]> producer = new KafkaProducer<>(kafkaProps);
            InputStream in = SendFileToKafka.class.getResourceAsStream("/com/example/kafka/file/ConsumerFileByteArrayFromKafka.java");
            try {
                byte[] buffer = new byte[in.available()];
                // 读到buffer字节数组中
                in.read(buffer);
                ProducerRecord<String, byte[]> record = new ProducerRecord<>("dataTopic", buffer);
                String header = "aaa";
                record.headers().add("test_header", header.getBytes(StandardCharsets.UTF_8));
                producer.send(record);
                in.close();
                producer.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    

    接收方

    import org.apache.kafka.clients.consumer.ConsumerRecord;
    import org.apache.kafka.clients.consumer.ConsumerRecords;
    import org.apache.kafka.clients.consumer.KafkaConsumer;
    import org.apache.kafka.common.header.Header;
    import org.apache.kafka.common.header.Headers;
    
    import java.util.Arrays;
    import java.util.Properties;
    
    public class ConsumerFileByteArrayFromKafka {
        public static void main(String[] args) {
            Properties props = new Properties();
            props.put("bootstrap.servers", "192.168.56.112:9092");
            props.put("group.id", "group1");
            props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
            props.put("value.deserializer", "org.apache.kafka.common.serialization.ByteArrayDeserializer");
    
            KafkaConsumer<String, byte[]> consumer = new KafkaConsumer<>(props);
            consumer.subscribe(Arrays.asList("dataTopic"));
            try {
                while (true) {
                    ConsumerRecords<String, byte[]> records = consumer.poll(100);
                    for (ConsumerRecord<String, byte[]> record : records) {
                        Headers headers = record.headers();
                        Iterable<Header> testHeader = headers.headers("test_header");
                        for (Header header : testHeader) {
                            String recordHeader = new String(header.value(), "UTF-8");
                            System.out.println("recordHeader => " + recordHeader);
                        }
                        byte[] message = record.value();
                        System.out.println(new String(message));
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                consumer.close();
            }
        }
    }
    

    在这里插入图片描述

  • 相关阅读:
    【TypeScript笔记】01 - TS初体验 && TS常用类型
    Ubuntu22.04下挂载共享文件夹
    Mozilla Firefox侧边栏和垂直标签在131 Nightly版本中开始试用
    idea一些不太常用但是能提升编码效率的快捷键
    【每日练习】删除公共字符
    Apollo Planning规划算法仿真调试(14):Apollo中添加离线LGSVL仿真环境的HdMap实现联合仿真
    RT thread 信号量操作
    java毕业设计冰球馆管理系统mybatis+源码+调试部署+系统+数据库+lw
    128天创作纪念日
    在IDEA中如何用可视化界面操作数据库? 在idea中如何操作数据库? 在idea中如何像Navicat一样操作数据库?
  • 原文地址:https://blog.csdn.net/qq_37362891/article/details/139390778