【问题标题】:why does spring cloud stream's @InboundChannelAdapter accept no parameters?为什么spring cloud stream的@InboundChannelAdapter不接受参数?
【发布时间】:2018-01-02 08:10:09
【问题描述】:

我正在尝试使用 Spring Cloud Stream 在 kafka 上发送和接收消息。此示例使用使用时间戳作为消息的简单示例。当我在InboundChannelAdapter docs 上遇到这个阻止程序时,我正试图更进一步地进入一个真实世界的应用程序:

“带有@InboundChannelAdapter注解的方法不能接受任何参数”

我试图这样使用它:

@InboundChannelAdapter(value = ChannelManager.OUTPUT)
public EventCreated createCustomerEvent(String customerId, String thingId) {
    return new EventCreated(customerId, thingId);
}

我缺少什么用途?我想当你想创建一个事件时,你有一些数据要用于该事件,所以你通常会通过参数传递这些数据。但是“用@InboundChannelAdapter 注释的方法不能接受任何参数”。那么你应该如何使用它呢?

我知道 @InboundChannelAdapter 来自 spring-integration,它是 spring-cloud-stream 的扩展,因此 spring-integration 可能有不同的上下文,这在其中是有意义的。但这对我来说似乎不直观(就像使用 _INBOUND_ChannelAdapter 作为输出/生产者/源一样)

【问题讨论】:

    标签: spring apache-kafka spring-integration spring-cloud spring-cloud-stream


    【解决方案1】:

    嗯,首先@InboundChannelAdapter 完全在Spring Integration 中定义,Spring Cloud Stream 没有扩展它。那是假的。不知道你是从哪里得到这些信息的......

    此注解构建类似SourcePollingChannelAdapter 的东西,它提供基于调度程序的轮询器并定期调用MessageSource.receive()。由于没有任何上下文并且最终用户无法使用自己的参数影响轮询器的行为,因此对空方法参数的要求是显而易见的。

    这个@InboundChannelAdapter 是流程的开始,它是活动的。它在没有您的事件的情况下在后台执行其逻辑。

    如果你想调用一些带参数的方法并触发一些流程,你应该考虑使用@MessagingGatewayhttp://docs.spring.io/spring-integration/reference/html/messaging-endpoints-chapter.html#messaging-gateway-annotation

    【讨论】:

    • 我在哪里说过关于扩展 InboundChannelAdapter 的内容?我说了什么或暗示了什么,你说的是假的?民意调查也使消息来源感到困惑。为什么我要对我正在制作的东西进行投票?从 Spring 集成来看,这些模式在 Spring Cloud 流中的用法似乎很糟糕。我想我会看看 spring kafka 或 confluent。
    【解决方案2】:

    您希望如何调用该方法?我认为您的说法“流扩展集成”存在误解,Artem 可能理解我们扩展 @InboundChannelAdatper

    因此,如果您正在主动调用此方法,因为您确实有传递给它的参数,为什么不直接使用您的源通道来发送数据?

    通常源不需要参数,因为它们要么像点击 twitter 的 twitter 流一样推送,监听事件并将它们推送到源通道,要么被轮询,在这种情况下,它们在定义的时间间隔内被调用通过轮询器。

    正如 Artem 指出的那样,如果您打算从业务流程中调用此方法,并在触发消息流时处理返回,那么请从文档中查看他的链接。

    【讨论】:

    • 有“使用源通道发送数据”的例子吗?我一直在使用参考文档,但没有看到清晰的文档。我们是否应该扩展 Source 接口来做到这一点?还是第 3.1.3 节中关于访问绑定通道的示例?
    • 是的,你可以在这里找到它:docs.spring.io/spring-cloud-stream/docs/Ditmars.BUILD-SNAPSHOT/…。您需要做的就是注入您的 Source 通道,然后调用 MessageChannel 的 send() 方法
    • 您知道如何在 application.yml 中进行配置的任何示例吗?尤其是卡夫卡主题?这是另一件我找不到例子的作品。例如,我有一个带有 @Output("is-this-my-kafka-topic-name") 的处理器,我想知道如何将它与神奇的 application.yml 属性连接起来
    • 文档?如果你通过第 1-6 节,你应该有足够的理解。它解释了编程模型和配置选项。你在说什么魔法?您的频道名称反映在 spring.cloud.bindings.<channelName> 上,从此基本属性值您可以控制诸如目标名称(默认为频道名称)、contentType 和 binder 特定属性等内容
    • 谢谢。我试过了。我正在发送和接收消息,所以我有一个处理器,通道带有 customNames,但是 spring bean 工厂很难找到 @Qualified bean。我在这里创建了另一个问题stackoverflow.com/questions/45358914/…
    猜你喜欢
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 2022-09-23
    • 1970-01-01
    • 2018-03-28
    • 2017-07-27
    • 2015-08-21
    • 1970-01-01
    相关资源
    最近更新 更多