解决StreamListener常量通道名称的方法

时间:2019-03-27 10:48:14

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

我正在使用云流来消费消息,而我正在使用类似

 @StreamListener(target = "CONSTANT_CHANNEL_NAME")
  public void readingData(String input){
    System.out.println("consumed info is"+input);
  }

但是我想根据我的环境保留频道名称,应该从属性文件中选择频道名称,而按照Spring频道名称应该是恒定的。

是否可以解决此问题?

编辑:1 让我们看看实际情况

  1. 我正在使用多个队列和dlq队列,并且通过Rabbit-mq进行绑定

  2. 我想根据环境更改频道名称和队列名称

  3. 我想在同一AMQP主机上做所有事情。

我的接收器代码

public interfaceProcessorSink extends Sink {

    @Input(CONSTANT_CHANNEL_NAME)
    SubscribableChannel channel();

    @Input(CONSTANT_CHANNEL_NAME_1)
    SubscribableChannel channel2();

    @Input(CONSTANT_CHANNEL_NAME_2)
    SubscribableChannel channle2();
}

2 个答案:

答案 0 :(得分:0)

您可以从属性文件中选择目标值,如下所示:

@StreamListener(target = "${streamListener.target}")
  public void readingData(String input){
    System.out.println("consumed info is"+input);
  }

application.yml

streamListener:
      target:  CONSTANT_CHANNEL_NAME

答案 1 :(得分:0)

虽然有许多方法可以做到,但我想知道您为什么还要关心呢?实际上,如果您 想要使其恒定不变 ,那么它总是相同的,但是通过配置属性可将其映射到不同的远程目标(例如,Kafka,Rabbit等) 。例如,spring.cloud.stream.bindings.input.destination=myKafkaTopic声明名称为input的频道将映射到名为myKafkaTopic'的Kafka主题(与之桥接)。 实际上,为了进一步证明我的观点,我们为使用spring-cloud-function编程模型的用户完全将通道完全抽象了出来,但这是一个完全不同的讨论。

我的观点是,我认为您实际上是在创建问题而不是解决问题,因为使用通道名的外部化可能会由于配置错误而导致实际绑定的通道以及您在属性中提及的通道无法使用保持一致。