Spring云流 – 应用初始化后发送消息

我试图使用“spring cloud stream”向rabbitmq发送一条简单的消息。 基本上代码看起来像这样:

@EnableBinding(Source.class) @SpringBootApplication public class SourceApplication { public static void main(String[] args) { SpringApplication.run(SourceApplication.class, args); } @Autowired Source source; @PostConstruct public void init() { source.send(MessageBuilder.withPayload("payload").build()); } } 

然后我收到此错误消息:

 org.springframework.messaging.MessageDeliveryException: Dispatcher has no subscribers for channel 'unknown.channel.name'.; nested exception is org.springframework.integration.MessageDispatchingException: Dispatcher has no subscribers, failedMessage=GenericMessage [payload=******, headers={id=c60dd5be-6576-99d5-fd1b-b1cb94c191c1, timestamp=1488651422892}] at org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:93) at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:423) at org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:373) 

但是,如果我添加一些延迟,在发送消息(只是第二或少数)之前,它可以正常工作。 我的问题是:如何才能在spring完全初始化消息通道然后发送消息之前等待?

@PostConstruct过早触发(在创建配置bean时,但在上下文启动并发生绑定之前)。 你想要的是在上下文完全初始化后触发发送消息,或者至少在绑定输出通道之后触发。

你有几个选择,都依赖于创建一个额外的bean:

  1. 要使用Spring的SmartLifecycle支持(确保isAutoStartup默认返回true并且阶段为零 – 默认值 – 以便在绑定输出后启动bean)。

  2. ContextRefreshedEvent使用ApplicationListener

  3. 由于这是一个Spring Boot应用程序,因此您可以使用ApplicationRunner bean(在创建上下文后调用它)。

您可以查看Spring的任务执行和调度function 。

特别是,听起来你想要的是34.4节所涵盖的内容 。

另外,我发现了类似问题的答案 。