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

时间:2021-01-05 09:15:04

标签: spring spring-cloud-stream

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

@Input @Output @EnableBinding @StreamListener

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

2 个答案:

答案 0 :(得分:4)

Spring 现在不再使用基于注解的配置,而是使用检测到的消费者/功能/供应商 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());
        }
    }

新版本代码如下:

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

Check Consumer bean 替换了 @StreamListener@Input

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

spring:
  cloud:
    stream:
      bindings:
        input:
          destination: destination
          group: group
          consumer:
            concurrency: 10
            max-attempts: 3

现在新的配置会像

spring:
  cloud:
    stream:
      bindings:
        input-in-0:
          destination: destination
          group: group
          consumer:
            concurrency: 10
            max-attempts: 3

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

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

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

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

    public void publish() {
        outputChannel.output().send("Hello");
    }
}

现在函数代码如下:

@Service
class PubSubSendQueue {
    @Bean
    public Supplier<String> output(){
        return Supplier { "Adam" }
    }
}

答案 1 :(得分:2)