springboot 集成kafka,自定义序列化类

spring:
  kafka:
    # 以逗号分隔的地址列表,用于建立与Kafka集群的初始连接(kafka 默认的端口号为9092)
    bootstrap-servers: ip1:port1,ip2:port2,ip3:port3
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringDeserializer
      # 值的序列化方式
      value-serializer: org.apache.kafka.common.serialization.StringDeserializer

序列化方式换成 value-serializer::com.xxx.xxx.ObjectSerializer 

反序列化方式换成value-serializer::com.xxx.xxx.ObjectDeserializer

注意:kafka属性配置文件中红色,可以满足只发送字符串数据时候用。然而想发送对象数据,就得用以下自定义序列类来实现。java代码如下:

1.ObjectSerializer.java


public class ObjectSerializer implements Serializer<Object> {

	@Override
	public byte[] serialize(String topic, Object data) {
		if(data instanceof byte[]){
			return (byte[])data;
		}else{
			return BeanUtils.ObjectToBytes(data);
		}
	}
}

2.ObjectDeserializer.java

public class ObjectDeserializer implements Deserializer<Object> {
    @Override
    public Object deserialize(String topic, byte[] data) {
        if (data == null) {
            return null;
        }
        return BeanUtils.BytesToObject(data);
    }
}

3.BeanUtils.java

public class BeanUtils {
    private BeanUtils(){}
    /**
     * 对象转字节数组
     * @param obj
     * @return
     */
    public static byte[] ObjectToBytes(Object obj){
        byte[] bytes = null;
        ByteArrayOutputStream bo = null;
        ObjectOutputStream oo = null;
        try {
            bo = new ByteArrayOutputStream();
            oo = new ObjectOutputStream(bo);
            oo.writeObject(obj);
            bytes = bo.toByteArray();

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(bo!=null){
                    bo.close();
                }
                if(oo!=null){
                    oo.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return bytes;
    }
    /**
     * 字节数组转对象
     * @param bytes
     * @return
     */
    public static Object BytesToObject(byte[] bytes){
        Object obj = null;
        ByteArrayInputStream bi = null;
        ObjectInputStream oi = null;
        try {
            bi =new ByteArrayInputStream(bytes);
            oi =new ObjectInputStream(bi);
            obj = oi.readObject();

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                if(bi!=null){
                    bi.close();
                }
                if(oi!=null){
                    oi.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return obj;
    }
}

4.发送对象代码

public void sendObj(){
        try{
            log.info("发送给kafka 发对象开始");
            Map m = new HashMap<String, Object>();
            m.put("name", "jim");
            kafkaTemplate.send(topicName, m);//或者这里发字符串也一样可用
            log.info("发送给kafka结束");
        }catch(Exception e){
            e.printStackTrace();
        }
}

5.消费对象代码

@Component
public class KafkaConsumer {
    // 消费监听
    @KafkaListener(topics = {"${config.kafka.send-topic}"},groupId = "${config.kafka.group-id}")
    public void onMessage1(ConsumerRecord<?, ?> record){
        String a = record.value().toString();
        log.info("消费的数据:"+ a);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值