@EnableBinding @deprecated 自 3.1 起支持函数式编程模型

meu*_*det 3 spring spring-cloud-stream

我看到 Spring Cloud Stream 的以下注释已折旧

@Input @Output @EnableBinding @StreamListener

请提供示例和文档链接,了解如何以功能方式进行操作。

小智 7

Spring 现在不再使用基于注解的配置,而是使用检测到的 Consumer/Function/Supplier 的 bean 来为您定义流。旧版本带有注释的代码如下所示:

interface InputChannels {
    
        @Input("input")
        SubscribableChannel input();
    }

    @EnableBinding(InputChannels.class)
    public class PubSubDemo {
    @StreamListener("input")
    public void listen() {
            
        if (LOG.isInfoEnabled()) {
            LOG.info(context.toString());
        }
    }
Run Code Online (Sandbox Code Playgroud)

新版本代码如下:

public class PubSubDemo {
   @Bean
   Consumer<String> input() {
    return str -> {
        
        if (LOG.isInfoEnabled()) {
            LOG.info(context.toString());
             }
        };
   }
}
Run Code Online (Sandbox Code Playgroud)

Check Consumer bean 替换了@StreamListener@Input

关于配置,如果之前为了配置你有一个 application.yml 看起来像这样:

spring:
  cloud:
    stream:
      bindings:
        input:
          destination: destination
          group: group
          consumer:
            concurrency: 10
            max-attempts: 3
Run Code Online (Sandbox Code Playgroud)

现在新的配置会像

spring:
  cloud:
    stream:
      bindings:
        input-in-0:
          destination: destination
          group: group
          consumer:
            concurrency: 10
            max-attempts: 3
Run Code Online (Sandbox Code Playgroud)

in 和 out 对应于绑定的类型(例如输入或输出)。索引是输入或输出绑定的索引。对于典型的单输入/输出功能,它始终为 0。

现在让我们考虑输出通道:

    public interface OutputChannels {
        @Output
        MessageChannel output();
    }

    @Service
    @EnableBinding(OutputChannels.class)
    class PubSubSendQueue {
    
    OutputChannels  outputChannel;

    public void publish() {
        outputChannel.output().send("Hello");
    }
}
Run Code Online (Sandbox Code Playgroud)

现在函数代码将如下:

@Service
class PubSubSendQueue {
    @Bean
    public Supplier<String> output(){
        return Supplier { "Adam" }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的例子,这对我帮助很大。我深入了解了该方法是如何引用的,最后我发现 input-in-0: 输入实际上是方法名称。还将 @Service 添加到消费者示例中,只是为了有一个工作示例。再次感谢! (2认同)