Search code examples
spring-jmsspring-messaging

Separate ErrorHandlers for separate JmsListeners


Here is answered how to set an ErrorHandler for a whole JmsListenerContainerFactory.

But I need each JmsListener (DefaultMessageListenerContainer) to have its own ErrorHandler.

Just having a try-catch inside my listener would not fit, because it won't catch JMS transactions' failures (transaction is committed in Spring, outside of my listener).

I would like to collect such failures by a monitoring system.

I tried to use

JmsListenerEndpointRegistry
  .getListenerContainers()
  .forEach{ it.errorHandler = myErrorHandler }

But

  1. This is a bit tricky.
  2. Containers are registered later than JmsListener-annotated beans are handled by its BeanPostProcessor. So I struggle with choosing a moment to set error handlers.

Please advise something.


Solution

  • The only way I see is to configure separate JmsListenerContainerFactory beans for all those different @JmsListener and their specific ErrorHandler. Each of those @JmsListener should refer to their own factory from this option:

    /**
     * The bean name of the {@link org.springframework.jms.config.JmsListenerContainerFactory}
     * to use to create the message listener container responsible for serving this endpoint.
     * <p>If not specified, the default container factory is used, if any.
     */
    String containerFactory() default "";