我想知道如何使用Spring Cloud Stream简化多重绑定

时间:2018-12-14 01:17:09

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

我正在尝试使用Spring Cloud Stream连接到多个Kafka经纪人。
在运行时,我想避免在具有特定配置文件或条件时绑定到特定代理。

下面的代码是我开发的示例。

@Profile({"b","c"})
@EnableBinding(AConsumer.AChanel.class)
public class AConsumer {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    @StreamListener(AConsumer.AChanel.INPUT)
    public void subscribe(String message, @Headers Map<String, Object> headers) {
        logger.info("i receive message(A) --> message : {}", message);
    }

    public interface AChanel {
        public static final String INPUT = "a_input";
        @Input(INPUT) SubscribableChannel aInput();
    }

}


@Profile({"a","c"})
@EnableBinding(BConsumer.BChanel.class)
public class BConsumer {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    @StreamListener(BConsumer.BChanel.INPUT)
    public void subscribe(String message, @Headers Map<String, Object> headers) {
        logger.info("i receive message(B) --> message : {}", message);
    }

    public interface BChanel {
        public static final String INPUT = "b_input";
        @Input(INPUT) SubscribableChannel bInput();
    }
}


@Profile({"a","b"})
@EnableBinding(CConsumer.CChanel.class)
public class CConsumer {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    @StreamListener(CConsumer.CChanel.INPUT)
    public void subscribe(String message, @Headers Map<String, Object> headers) {
        logger.info("i receive message(C) --> message : {}", message);
    }

    public interface CChanel {
        public static final String INPUT = "c_input";
        @Input(INPUT) SubscribableChannel cInput();
    }

}

还有没有比这更好的方法了?
我认为还有另一种使用注释的方式(如条件式或其他方式)或自定义弹簧云流 库。

知道的任何人,请帮助我。

1 个答案:

答案 0 :(得分:0)

我认为个人档案不是解决此问题的最佳方法。

根据我对您的要求的理解,可以使用不同的属性值甚至使用属性解析器进一步轻松地完成上述操作

  1. 您可以简单地在启动时通过命令行,配置服务器和许多其他方式定义属性

  2. 您可以在yaml或属性文件中静态定义属性,然后使用标准的属性解析符号提供实际值

    spring.cloud.stream.someproperty=${someproperty.value}