Spring 云流 - 应用程序初始化后发送消息
Spring cloud stream - send message after application initalization
我正在尝试使用 "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 完全初始化消息通道然后发送消息?
您可能会查看 Spring 的 Task Execution and Scheduling features。
特别是,听起来您想要 section 34.4 covers.
另外,我发现 有一个类似的问题。
@PostConstruct
触发得太早(在创建配置 bean 时,但在启动上下文和发生绑定之前)。您想要的是在上下文完全初始化后或至少在输出通道绑定后触发消息的发送。
您有几个选项,都依赖于创建一个额外的 bean:
要使用 Spring 的 SmartLifecycle
支持(确保 isAutoStartup
returns true
默认并且相位是零 - 默认值 - 这样 bean 在输出绑定后启动)。
对 ContextRefreshedEvent
使用 ApplicationListener
。
因为这是一个 Spring 引导应用程序,您可以使用 ApplicationRunner
bean(在创建上下文后调用它)。
我正在尝试使用 "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 完全初始化消息通道然后发送消息?
您可能会查看 Spring 的 Task Execution and Scheduling features。
特别是,听起来您想要 section 34.4 covers.
另外,我发现
@PostConstruct
触发得太早(在创建配置 bean 时,但在启动上下文和发生绑定之前)。您想要的是在上下文完全初始化后或至少在输出通道绑定后触发消息的发送。
您有几个选项,都依赖于创建一个额外的 bean:
要使用 Spring 的
SmartLifecycle
支持(确保isAutoStartup
returnstrue
默认并且相位是零 - 默认值 - 这样 bean 在输出绑定后启动)。对
ContextRefreshedEvent
使用ApplicationListener
。因为这是一个 Spring 引导应用程序,您可以使用
ApplicationRunner
bean(在创建上下文后调用它)。