Mab*_*uro 4 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());
}
}
Run Code Online (Sandbox Code Playgroud)
然后我收到此错误消息:
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)
Run Code Online (Sandbox Code Playgroud)
但是,如果我添加一些延迟,在发送消息(只是第二个或几个)之前,它可以正常工作.我的问题是:如何在Spring完全初始化消息通道然后发送消息之前等待?
@PostConstruct过早触发(在创建配置bean时,但在上下文启动并发生绑定之前).您想要的是在上下文完全初始化后触发消息的发送,或者至少在绑定输出通道之后触发.
你有几个选择,都依赖于创建一个额外的bean:
要使用SmartLifecycleSpring 的支持(确保默认isAutoStartup返回true并且阶段为零 - 默认值 - 以便在绑定输出后启动bean).
使用ApplicationListenerfor ContextRefreshedEvent.
由于这是一个Spring Boot应用程序,因此您可以使用ApplicationRunnerbean(在创建上下文后调用它).
| 归档时间: |
|
| 查看次数: |
876 次 |
| 最近记录: |