Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将这个spring集成配置从XML转换为Java?_Java_Spring_Spring Integration - Fatal编程技术网

如何将这个spring集成配置从XML转换为Java?

如何将这个spring集成配置从XML转换为Java?,java,spring,spring-integration,Java,Spring,Spring Integration,在应用程序中而不是在XML中实现这一特定部分是有意义的,因为它是整个集群中的常量,而不是局限于单个作业 通过剖析XSD,我认为它类似于int kafka:outbound channel adapter的xml构造了一个KafkaProducerMessageHandler 没有可见的方法来设置频道、主题或大多数其他属性 注意潜在的落选者-(咆哮)我已经做了一个星期的RTFM'ing,比我开始的时候更困惑。我对语言的选择已经从形容词逐步过渡到副词,我开始借用其他语言的词汇。答案可能就在那里。但如

在应用程序中而不是在XML中实现这一特定部分是有意义的,因为它是整个集群中的常量,而不是局限于单个作业

通过剖析XSD,我认为它类似于
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一章看看所有这些相关性:。
使用协议适配器
一段应该能说明什么是
名称空间工厂
以及如何使用它。