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

Spring AMQP Rabbit侦听器在“ApplicationReadyEvent”之前启动

穆歌者
2023-03-14

在Spring应用程序启动时,我想在Redis中查找一个值,并根据该值关闭或保留消息侦听器。

完全不初始化这些bean也是可以的,但是我也找不到方法

目前,我正在尝试使用Spring的Application ationReadyEvents关闭容器:

@Component
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent> {

    private @Autowired @Qualifier("completedOrderContainer") SimpleMessageListenerContainer container;
    private @Autowired RedisManagerImpl redis;

    @Override
    public void onApplicationEvent(ApplicationReadyEvent event) {
        if (!Boolean.valueOf(redis.isRabbitListenerActive())) container.shutdown();
    }

}

容器

    @Bean
    @Conditional(RabbitCondition.class)
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory();
        connectionFactory.setAddresses(rabbitHost + ":" + rabbitPort);
        connectionFactory.setUsername(rabbitUsername);
        connectionFactory.setPassword(rabbitPassword);
        return connectionFactory;
    }

    @Bean
    @Conditional(RabbitCondition.class)
    Queue completedOrderQueue() {
        return new Queue(completedOrderQueueName, true);
    }

    @Bean
    @Conditional(RabbitCondition.class)
    TopicExchange completedOrderExchange() {
        return new TopicExchange(completedOrderExchangeName);
    }

    @Bean
    @Conditional(RabbitCondition.class)
    Binding binding(Queue completedOrderQueue, TopicExchange completedOrderExchange) {
        return BindingBuilder.bind(completedOrderQueue).to(completedOrderExchange).with(completedOrderQueueName);
    }

    @Bean
    @Conditional(RabbitCondition.class)
    SimpleMessageListenerContainer completedOrderContainer(ConnectionFactory connectionFactory, MessageListenerAdapter completedOrderListenerAdapter) {
        SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
        container.setConnectionFactory(connectionFactory);
        container.setQueueNames(completedOrderQueueName);
        container.setMessageListener(completedOrderListenerAdapter);
        return container;
    }

    @Bean
    @Conditional(RabbitCondition.class)
    MessageListenerAdapter completedOrderListenerAdapter(CompletedOrderMessageReceiver receiver) {
        return new MessageListenerAdapter(receiver, "completedOrder");
    }

消息侦听器:

@Component
public class CompletedOrderMessageReceiver {
    public void completedOrder(Object asyncTask) throws Exception {
        //impl
    }
}

问题是,如果我用已经在队列中的消息启动应用程序,消息侦听器将在执行container.shutdown()之前拾取消息。

有办法实现我的目标吗?即使采用不同的方法

共有1个答案

壤驷向明
2023-03-14

在侦听器容器上将autoStartup设置为false。然后根据需要执行start()stop()操作。

 类似资料:
  • 问题内容: 有一种简单的方法可以在调用之前和之后调用JavaScript动作,例如,我想在后备bean中调用 之前 和 之后 调用JavaScript动作: 添加多个元素似乎不起作用(也许应该吗?!),例如 仅被调用。 问题答案: 使用属性。它必须指向一个回调函数引用(所以不要包括括号!): 实际的回调函数如下所示(JSF会自己提供参数):

  • 我们有web服务(jaxws),它正在调用另一个web服务(aslo jaxws)。Jaxws客户端配置如下所示-- 正如您所看到的,我们有两个拦截器和一个故障侦听器。我们希望在这些拦截器、故障侦听器和web服务代码之间进行通信。正如SO线程中所述,我们使用cxf交换对象在web服务和拦截器之间进行通信。 我们的inFaultInterceptor代码如下所示-- } Web服务代码如下所示- 但

  • 问题内容: 我当时在上网,但找不到很好的信息。我试图在每次运行应用程序时检测按键。我正在使用JavaFX并将其与FXML一起运行。我尝试了很多事情,但没有任何效果。请帮我。 问题答案: 您应该签出Ensemble示例。这是关键的侦听器代码。

  • 我正在使用Realex Payments的HPP API开发一个卡支付页面,其中包含一个iFrame,用于托管Realex页面。在Realex请求表单上,我将字段HPP_POST_维度和HPP_POST_响应设置为我的URL,如下所示: 付款页: www.example.com/account/payment.html 隐藏字段值用于在HPP页面大小更改和事务完成时,使用事件侦听器将数据从Real

  • 虽然计算属性在大多数情况下更合适,但有时也需要一个自定义的侦听器。这就是为什么 Vue 通过watch选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。例如: <div id="watch-example"> <p> Ask a yes/no question: <input v-model="question">

  • 1. 前言 本节介绍侦听器 watch 的使用方法。包括什么是侦听器,侦听器的特点,以及如何对不同类型的数据进行监听。其中重点掌握对不同类型的数据如何使用侦听器,了解它之后,在才能在之后的日常开发中熟练运用。 2. 慕课解释 Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。 — 官方定义 侦听器 watch 是 Vue 提供的一种用来观察和响应 Vue 实例上的数据