es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Detener los oyentes de RabbitMQ durante la ejecución

Mis beans/listeners son construidos utilizando IntegrationFlows

Ejemplo:

@Bean
IntegrationFlow registerDevices() {
    return IntegrationFlows
        .from(adapter)
        .channel(channel)
        .get();
}

Existe una manera de detener los listeners después de que ocurra algo, como una llamada a un endpoint o un evento.

RabbitListenerEndpointRegistry no funciona, porque no estoy usando @RabbitListener.

Existe la posibilidad de configurar autostart a false, pero ¿cómo manipularlo de manera adecuada durante la ejecución?

Tags:  

Answer

  1. Avatar for davy.ai

    Sí, hay una manera de detener los oyentes en Spring Integration usando las IntegrationFlow. Puedes establecer la propiedad autoStartup en false al definir el flujo, y luego manipularlo durante la ejecución con un LifecycleProcessor.

    Aquí tienes un ejemplo:

    @Bean
    public IntegrationFlow myIntegrationFlow(MyMessageSource myMessageSource,
                                              MyMessageHandler myMessageHandler) {
        return IntegrationFlows.from(myMessageSource)
                .handle(myMessageHandler)
                .autoStartup(false)
                .get();
    }
    
    @Bean
    public LifecycleProcessor lifecycleProcessor(DefaultListableBeanFactory beanFactory) {
        LifecycleProcessor processor = new DefaultLifecycleProcessor();
        beanFactory.addBeanPostProcessor(processor);
        return processor;
    }
    
    @Autowired
    private LifecycleProcessor lifecycleProcessor;
    
    @Autowired
    private IntegrationFlow myIntegrationFlow;
    
    public void stopMyIntegrationFlow() {
        lifecycleProcessor.stop(); // esto detendrá todos los flujos con autoStartup = true
    }
    
    public void startMyIntegrationFlow() {
        lifecycleProcessor.start(); // esto iniciará todos los flujos con autoStartup = true
    }
    
    

    En este ejemplo, definimos un IntegrationFlow con autoStartup(false). También definimos un LifecycleProcessor, que utilizamos para iniciar y detener el flujo durante la ejecución. Ten en cuenta que llamar a stop() en el LifecycleProcessor detendrá todos los flujos con autoStartup = true, así que asegúrate de usarlo solo si deseas detener todos los flujos en el contexto.

    Para iniciar y detener un flujo específico, puedes hacer algo como esto:

    @Autowired
    private LifecycleProcessor lifecycleProcessor;
    
    @Autowired
    private IntegrationFlow myIntegrationFlow;
    
    @Autowired
    private SmartLifecycle myIntegrationFlowLifecycle;
    
    public void stopMyIntegrationFlow() {
        lifecycleProcessor.stop(myIntegrationFlowLifecycle); // esto detendrá solo myIntegrationFlow
    }
    
    public void startMyIntegrationFlow() {
        lifecycleProcessor.start(myIntegrationFlowLifecycle); // esto iniciará solo myIntegrationFlow
    }
    

    En este caso, también inyectamos el SmartLifecycle de nuestro flujo específico, que podemos usar para detenerlo e iniciarlo individualmente.

Comments are closed.