2017-03-04 59 views
2

我试图用“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) 

但是,如果我添加了一些延迟,发送消息(只是第二或很少),它的工作原理确定之前。我的问题是:如何在春季完全初始化消息通道然后发送消息之前等待?

回答

4

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

您有几种选择,全是靠创建一个额外的bean:

  1. 要使用从春天的SmartLifecycle支持(确保isAutoStartup返回true默认和相位为零 - 的默认 - 以便在输出被绑定后启动bean)。

  2. 对于ContextRefreshedEvent使用ApplicationListener

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