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

时间:2017-03-04 18:49:15

标签: java spring rabbitmq spring-cloud-stream

我正在尝试使用" 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完全初始化消息通道然后发送消息之前等待?

2 个答案:

答案 0 :(得分:6)

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

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

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

  2. ApplicationListener使用ContextRefreshedEvent

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

答案 1 :(得分:0)

您可以查看Spring的Task Execution and Scheduling features

特别是,听起来你想要像section 34.4 covers那样的东西。

另外,我发现了this answer类似的问题。