首页 > 解决方案 > 关于 KafkaTemplate 类型参数

问题描述

我正在使用KafkaTemplate#send(Message<?>). 我没有发送密钥。我想知道使用类型参数是否可以KafkaTemplate<Object,Object>?会KafkaTemplate<Object, PlanDTO>是更相关的类型参数吗?有没有与此相关的规则?我正在使用spring boot 2.5.4jdk 11。这是我所拥有的:

@Component
public class PlanProducer 
{
    @Autowired
    private KafkaTemplate<Object, Object> kafkaTemplate;

    public void postPlanToKafka(PlanDTO plan)
    {
            Message<PlanDTO> message = MessageBuilder.withPayload(plan)
            .setHeader(KafkaHeaders.TOPIC, "plan")
            .setHeader(KafkaHeaders.TIMESTAMP, Instant.now().getEpochSecond())
            .build();
            ListenableFuture<SendResult<Object, Object>> future = kafkaTemplate.send(message);
            future.addCallback(new KafkaSendCallback<Object, Object>() 
            {
                @Override
                public void onSuccess(SendResult<Object, Object> result) 
                {
                    RecordMetadata metadata = result.getRecordMetadata();
                    log.info("Message sent successfully with the following information : topic - {} , "
                            + "partition  - {} , offset - {}",metadata.topic(),
                            metadata.partition(),metadata.offset());
                }

                @Override
                public void onFailure(KafkaProducerException e) 
                {
                    log.error("Error posting data to kafka ={}",e);
                }
            });
    }
}

标签: javaspring-bootapache-kafkaspring-kafka

解决方案


使用起来完全没问题<Object, Object>

没有“规则”,因为实际类型由序列化程序确定。

2.8 中的新receive()方法将需要更窄的类型,但对于发送,这不是问题。


推荐阅读