Apache kafka spring kafka请求-应答:请求和应答的不同类型

Apache kafka spring kafka请求-应答:请求和应答的不同类型,apache-kafka,spring-kafka,Apache Kafka,Spring Kafka,提供请求-回复支持(Spring Kafka 2.1.3中介绍)的回复KafkaTemplate文档表明,请求和回复可以使用不同的类型: ReplyingKafkaTemplate<K, V, R> 回复卡夫卡模板 其中,参数化类型K指定消息键,V指定值(即请求),R指定回复 到目前为止还不错。但是,用于实现服务器端请求-应答的相应支持类似乎不支持V、R的不同类型。文档建议使用带有添加@SendTo注释的KafkaListener,该注释在幕后使用MessageListenerC

提供请求-回复支持(Spring Kafka 2.1.3中介绍)的回复KafkaTemplate文档表明,请求和回复可以使用不同的类型:

ReplyingKafkaTemplate<K, V, R>
回复卡夫卡模板
其中,参数化类型K指定消息键,V指定值(即请求),R指定回复

到目前为止还不错。但是,用于实现服务器端请求-应答的相应支持类似乎不支持V、R的不同类型。文档建议使用带有添加@SendTo注释的KafkaListener,该注释在幕后使用MessageListenerContainer上配置的replyTemplate。但是AbstractKafkaListenerEndpoint只支持侦听器和replyTemplate的单一类型:

public abstract class AbstractKafkaListenerEndpoint<K, V>
        implements KafkaListenerEndpoint, BeanFactoryAware, InitializingBean {

    ...

    /**
     * Set the {@link KafkaTemplate} to use to send replies.
     * @param replyTemplate the template.
     * @since 2.0
     */
    public void setReplyTemplate(KafkaTemplate<K, V> replyTemplate) {
        this.replyTemplate = replyTemplate;
    }

    ...

}
公共抽象类AbstractKafkaListenerEndpoint
实现KafkaListenerEndpoint、BeanFactoryAware、InitializingBean{
...
/**
*设置用于发送回复的{@link KafkaTemplate}。
*@param replyTemplate模板。
*@自2.0以来
*/
public void setReplyTemplate(KafkaTemplate replyTemplate){
this.replyTemplate=replyTemplate;
}
...
}
因此V和R需要是相同的类型

文档中使用的示例确实使用字符串表示请求和应答

我是否遗漏了一些东西,或者这是Spring Kafka请求-回复支持中的一个设计缺陷,应该报告并更正?

这是

对于早期版本,只需注入原始的
KafkaTemplate
(不带泛型)

编辑

@springboot应用程序
公共类SO53151961应用程序{
公共静态void main(字符串[]args){
SpringApplication.run(So53151961Application.class,args);
}
@卡夫卡列斯汀(id=“so53151961”,topics=“so53151961”)
@森托
公共酒吧把手(Foo-Foo){
系统输出打印项次(foo);
返回新条(foo.getValue().toUpperCase());
}
@豆子
公共回复KafkatTemplate回复模板(ProducerFactory pf,
ConcurrentKafkalistener集装箱工厂){
ConcurrentMessageListenerContainer replyContainer=
createContainer(“so53151961 replyTopic”);
replyContainer.getContainerProperties().setGroupId(“so53151961.reply”);
ReplyingKafkatTemplate ReplyingKafkatTemplate=新的ReplyingKafkatTemplate(pf,replyContainer);
返回回复卡夫卡模板;
}
@豆子
公共卡夫卡模板replyTemplate(ProducerFactory pf,
ConcurrentKafkalistener集装箱工厂){
KafkaTemplate KafkaTemplate=新的KafkaTemplate(pf);
setReplyTemplate(kafkaTemplate);
返回卡夫卡模板;
}
@豆子
公共应用程序运行程序(回复KafkatTemplate模板){
返回参数->{
ProducerRecord记录=新的ProducerRecord(“so53151961”,null,“key”,new Foo(“Foo”));
RequestReplyFuture=template.sendReceive(记录);
System.out.println(future.get(10,TimeUnit.SECONDS.value());
};
}
@豆子
公共新话题(){
返回新的NewTopic(“so53151961”,1,(短)1);
}
@豆子
公众答覆({
返回新的NewTopic(“so53151961 replyTopic”,1,(短)1);
}
公共静态类Foo{
公共字符串值;
公共食物({
超级();
}
公共Foo(字符串值){
这个值=值;
}
公共字符串getValue(){
返回此.value;
}
公共void设置值(字符串值){
这个值=值;
}
@凌驾
公共字符串toString(){
返回“Foo[value=“+this.value+”]”;
}
}
公共静态类栏{
公共字符串值;
公共酒吧(){
超级();
}
公共栏(字符串值){
这个值=值;
}
公共字符串getValue(){
返回此.value;
}
公共void设置值(字符串值){
这个值=值;
}
@凌驾
公共字符串toString(){
返回“Bar[value=“+this.value+”””;
}
}
}
结果

Foo [value=foo]
Bar [value=FOO]

2.2中已确认固定。谢谢有人能提供一个示例代码吗?我在答案中添加了一个示例。卡夫卡主题中的消息将是Foo对象的实例?可以向Topic1生成Foo对象并使用Topic2中的Bar吗@gary Russell不要在对旧答案的评论中提出新问题。你的意思一点也不清楚;问一个更详细的新问题。
Foo [value=foo]
Bar [value=FOO]