为什么spring cloud stream的@InboundChannelAdapter不接受任何参数?

时间:2017-07-26 20:11:34

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

我正在尝试使用spring cloud stream在kafka上发送和接收消息。这方面的示例使用了使用时间戳作为消息的简单示例。当我在InboundChannelAdapter docs遇到这个拦截器时,我正试图进一步进入真实世界的应用程序:

“使用@InboundChannelAdapter注释的方法不能接受任何参数”

我试图像这样使用它:

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

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

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

2 个答案:

答案 0 :(得分:2)

嗯,首先@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

答案 1 :(得分:1)

您打算怎么称呼该方法?我认为你的陈述“流扩展整合”存在误传,Artem可能理解我们延伸@InboundChannelAdatper

所以,如果你正在积极调用这个方法,因为它确实有传递给它的参数,为什么不只是使用源通道发送数据呢?

通常来源不需要参数,因为它们要么像twitter上的Twitter流一样推送,监听事件并将它们推送到源通道,要么轮询它们,在这种情况下,它们是在定义的间隔上调用的通过投票人。

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