@ServiceActivator 如何在 Spring Boot 中从属性文件中读取 inputChannel?

Posted

技术标签:

【中文标题】@ServiceActivator 如何在 Spring Boot 中从属性文件中读取 inputChannel?【英文标题】:@ServiceActivator How to read inputChannel from property file in spring boot? 【发布时间】:2020-04-27 00:58:14 【问题描述】:

我开发 google pubsub 消费者,当我使用修复值“my-alpha-pubsub-topic”时,它已完成运行

@ServiceActivator(inputChannel = "my-alpha-pubsub-topic" )
 public void messageReceiver(String payload) 
  LOGGER.info("Message arrived! Payload: " + payload);

 

但我在 Kubernetes 的容器上运行它,我需要通过 Environment 传递来自 env 参数的 inputChannel 值,以便 1 个容器构建支持多个环境

Alpha => inputChannel = "my-alpha-pubsub-topic"
Staging => inputChannel = "my-staging-pubsub-topic"
Production => inputChannel = "my-pubsub-topic"

购买我无法在 inputChannel 中传递参数。运行失败

@Value("$pubsub.name")
 private String pubsubName;


@ServiceActivator(inputChannel = "$pubsubName" )
 public void messageReceiver(String payload) 
  LOGGER.info("Message arrived! Payload: " + payload);

 

我尝试这个并失败了

@ServiceActivator(inputChannel = "$pubsubName" ) 
@ServiceActivator(inputChannel = "#$pubsubName" )
@ServiceActivator(inputChannel = "$pubsub.name" )

如何将值从属性或 env 参数传递给 inputChannel

【问题讨论】:

@ServiceActivator(inputChannel = "$pubsub.name" ) 应该可以工作。异常说明了什么? @Vladucu net.trueid.platform.cmschange.MyGcpSubPlanetApplication 中方法 messageChannelAdapter 的参数 0 需要一个找不到的 'org.springframework.messaging.MessageChannel' 类型的 bean。注入点有以下注解: - @org.springframework.beans.factory.annotation.Qualifier(value="$pubsub.name") 找到以下候选但无法注入: - 用户定义的 bean 方法'MyGcpSubPlanetApplication' 中的 'myInputChannel' - 用户定义的 bean - 用户定义的 bean 好的,我意识到问题出在哪里。您不能使用@ServiceActivator(inputChannel = "$pubsub.name" ),因为inputChannel 需要接收spring bean 的限定符而不是env 变量。我想在您的代码中的某个地方,您有一个带有限定符 my-alpha-pubsub-topic 的频道,这就是它第一次起作用的原因。也许使用 spring 配置文件创建所有这些 bean 并具有以下内容是有意义的:@Profile("Staging") @ServiceActivator(inputChannel = "my-staging-pubsub-topic" ) public void messageReceiver。每个环境一个。 @Vladucu Voican 这解决了我的问题。你可以回答,我会接受你的回答 很高兴听到这个消息,我会在一分钟内添加它。也谢谢你。 【参考方案1】:

问题是你不能使用 @ServiceActivator(inputChannel = "$pubsub.name" ) 因为 inputChannel 需要指定 spring bean 的限定符而不是环境变量。 我想在您的代码中的某个地方,您有一个带有限定符 my-alpha-pubsub-topic 的频道,这就是它第一次起作用的原因。

在我看来,使用 spring 配置文件创建所有这些 bean 并为每个环境提供类似以下内容会更有意义

 @Profile("Staging") 
 @ServiceActivator(inputChannel = "my-staging-pubsub-topic" ) 
  public void messageReceiver(String payload) 
  LOGGER.info("Message arrived! Payload: " + payload);
 

【讨论】:

以上是关于@ServiceActivator 如何在 Spring Boot 中从属性文件中读取 inputChannel?的主要内容,如果未能解决你的问题,请参考以下文章

@KafkaListener、@StreamListener 和 @ServiceActivator 的区别?

Java 8默认接口方法上的Spring集成@ServiceActivator

Pygame错误:self.spritedict [spr] = surface_blit(spr.image,spr.rect)

十 如何应用设计原则

我的大学,我的SPR

使用Spire组件抛出异常The type initializer for 'spr857' threw an exception