@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)
使用Spire组件抛出异常The type initializer for 'spr857' threw an exception