当前位置: 首页 > 知识库问答 >
问题:

Spring Cloud stream-应用程序初始化后发送消息

岳卓君
2023-03-14

我正在尝试使用“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个答案

缪成天
2023-03-14

您可以研究Spring的任务执行和调度特性。

特别是,听起来你想要第34.4节所涵盖的东西。

此外,我发现了一个类似问题的答案。

宋涵忍
2023-03-14

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

您有几个选项,都依赖于创建一个额外的bean

>

  • 要使用来自Spring的SmartLifesycle支持(确保isAutoStartup默认返回true并且相位为零-默认-以便在输出绑定后启动bean)。

    Application ationListener用于ContextReFreshedEvent

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

  •  类似资料:
    • 问题内容: 我正在尝试使用“春季云流”向Rabbitmq发送一条简单消息。基本上,代码如下所示: 然后我收到此错误消息: 但是,如果我增加了一些延迟,则在发送消息之前(仅几秒钟或几秒钟),它可以正常工作。我的问题是:如何在spring完全初始化消息通道然后发送消息之前等待? 问题答案: 太早触发(在创建配置Bean时,但是在上下文启动并进行绑定之前)。您想要的是一旦上下文完全初始化,或者至少在绑定

    • 经过一些调试,我找到了这行代码 导致我的应用程序崩溃,我已经尝试过了 ; 但结果还是一样,有什么帮助吗??

    • 经过测试,它在非android程序上工作,但在android上初始化后立即崩溃。日志cat也没有生成任何错误消息。我从CircularFifoBuffer找到了这个。 编辑2: 08-05 21:12:48.837:I//system/bin/batteryd(1189):1566474 v_bat 3.678(3.677),i_supply 0.500,i_demand 0.282=>v_bat

    • 我有以下情况。在我的微服务[MA]中,我希望在应用程序启动后或基于某个事件初始化/销毁一些bean。想象一下,还有另一个微服务[MB],它保存关于ContentStores的信息。在MA启动之后,我想向MB请求contentStore条目,基于此,我想根据需要创建这么多bean。可能会有一个事件触发storrecreated/storredeleted,在这种情况下,我需要销毁bean。 我目前不

    • 你已经有了基本的页面布局和需要用的CSS以及JS文件。现在我们需要初始化我们的应用,比如在 my-app.js中 var myApp = new Framework7(); 上面这个例子中我们使用了 myApp 作为变量名存储 Framework7 初始化之后的实例。 这样初始化非常简单,但是Framework7 也提供了更多个性化的定制,只需要在初始化的时候传入一个配置对象即可。 var myA

    • 10.6.1.程序初始化 现在用户启动程序就会首先看到Timeline界面。但是用户必须先设置个人选项并启动Service,否则就没有消息显示。这很容易让人摸不着头脑。 一个解决方案是,在启动时检查用户的个人选项是否存在。若不存在,就跳到选项界面,并给用户一个提示,告诉她下一步该怎么做。 ... @Override protected void onCreate(Bundle savedInsta