如何将这个spring集成配置从XML转换为Java?
在应用程序中而不是在XML中实现这一特定部分是有意义的,因为它是整个集群中的常量,而不是局限于单个作业 通过剖析XSD,我认为它类似于如何将这个spring集成配置从XML转换为Java?,java,spring,spring-integration,Java,Spring,Spring Integration,在应用程序中而不是在XML中实现这一特定部分是有意义的,因为它是整个集群中的常量,而不是局限于单个作业 通过剖析XSD,我认为它类似于int kafka:outbound channel adapter的xml构造了一个KafkaProducerMessageHandler 没有可见的方法来设置频道、主题或大多数其他属性 注意潜在的落选者-(咆哮)我已经做了一个星期的RTFM'ing,比我开始的时候更困惑。我对语言的选择已经从形容词逐步过渡到副词,我开始借用其他语言的词汇。答案可能就在那里。但如
int kafka:outbound channel adapter
的xml构造了一个KafkaProducerMessageHandler
没有可见的方法来设置频道、主题或大多数其他属性
注意潜在的落选者-(咆哮)我已经做了一个星期的RTFM'ing,比我开始的时候更困惑。我对语言的选择已经从形容词逐步过渡到副词,我开始借用其他语言的词汇。答案可能就在那里。但如果是的话,仅仅是凡人是无法找到的。(咆哮)
XML配置:
<int-kafka:outbound-channel-adapter id="kafkaOutboundChannelAdapter"
kafka-template="kafkaTemplate"
auto-startup="false"
channel="outbound-staging"
topic="foo"
sync="false"
message-key-expression="'bar'"
send-failure-channel="failures"
send-success-channel="successes"
partition-id-expression="2">
</int-kafka:outbound-channel-adapter>
编辑:有关正在解决的高级问题的附加信息
作为一个更大项目的一部分,我尝试从实现教科书示例,使用Kafka支持而不是JMS支持
我相信最终的集成流程应该是这样的:
@Bean
public KafkaProducerMessageHandler kafkaOutboundChannelAdapter () {
KafkaProducerMessageHandler result = new KafkaProducerMessageHandler(kafkaTemplate());
result.set????? (); // WTH?? No methods for most of the attributes?!!!
return result;
}
partitionHandler->messagingTemplate->出站请求(DirectChannel)->出站暂存(KafkaProducerMessageHandler)->kafka
kafka->executionContainer(KafkaMessageListenerContainer)->内置KafkarRequests(KafCamessageDrivenChannelAdapter)->入站请求(DirectChannel)->serviceActivator(StepExecutionRequestHandler)
serviceActivator(StepExecutionRequestHandler)->应答转移(KafkaProducerMessageHandler)->kafka
kafka->replyContainer(KafkaMessageListenerContainer)->InboundKafkarReplies(KafkaMessageDrivenChannelAdapter)->入站回复(DirectChannel)->partitionhandler不确定遗漏它们是什么意思,但这是我在
KafkaProducerMessageHandler
的源代码中看到的:
public void setTopicExpression(Expression topicExpression) {
this.topicExpression = topicExpression;
}
public void setMessageKeyExpression(Expression messageKeyExpression) {
this.messageKeyExpression = messageKeyExpression;
}
public void setPartitionIdExpression(Expression partitionIdExpression) {
this.partitionIdExpression = partitionIdExpression;
}
/**
* Specify a SpEL expression to evaluate a timestamp that will be added in the Kafka record.
* The resulting value should be a {@link Long} type representing epoch time in milliseconds.
* @param timestampExpression the {@link Expression} for timestamp to wait for result
* fo send operation.
* @since 2.3
*/
public void setTimestampExpression(Expression timestampExpression) {
this.timestampExpression = timestampExpression;
}
等等
您还可以访问超级类设置器,例如XML变量的setSync()
输入通道
不是消息处理程序
的职责。它进入端点
,可以通过@ServiceActivator
与该@Bean
一起进行确认
请参阅Core Spring集成参考手册中的更多信息:
开头还有非常重要的一章:
此外,最好使用java DSL代替直接<代码> MessageHandler < /Cord>用法:
Kafka
.outboundChannelAdapter(producerFactory)
.sync(true)
.messageKey(m -> m
.getHeaders()
.get(IntegrationMessageHeaderAccessor.SEQUENCE_NUMBER))
.headerMapper(mapper())
.partitionId(m -> 0)
.topicExpression("headers[kafka_topic] ?: '" + topic + "'")
.configureKafkaTemplate(t -> t.id("kafkaTemplate:" + topic))
.get();
请参阅上述Spring集成文档中有关Java DSL的更多信息:谢谢Artem。我真的很感谢你的帮助。我将审查这些文件。我只想建立一个与卡夫卡的“简单”连接,我必须学习嵌入java中的两种新编程语言,并对先前的知识进行未陈述的假设。最后,我希望有几十行代码,但是这一点非常令人沮丧。对于简单的用例,你可以直接考虑使用<代码> KAFKATEMETHOL/<代码>或<代码> KafkaProducer <代码>。然而,最终你会发现Spring集成确实是构建复杂消息集成解决方案的有用工具。我同意,它看起来是一个好的(而且是必要的)工具,否则我不会坚持到现在。不幸的是,这些文档读起来像是一个功能规范,而不是一个操作指南,因此,除非你非常熟悉其内部结构,并计划在你的职业生涯中花很大一部分时间专门研究它,否则你就无法知道如何将它们连接起来,甚至无法找到如何将它们连接起来。我从DSL示例开始,后来又回到了一些我可以理解的东西。DSL在熟悉它的人看来可能很棒,但我发现它完全不可读。
get()
返回一个对象的实例,该对象将成为Spring容器中的bean。Spring之后会自动完成更多的工作。不确定如何从这里提供帮助,但您确实需要熟悉所有的EIP(),首先要有一包原则和概念,然后来我们的Java DSL一章看看所有这些相关性:。使用协议适配器
一段应该能说明什么是名称空间工厂
以及如何使用它。