Почему DefaultJmsListenerContainerFactory не предоставляет метод setExceptionListener? - PullRequest
0 голосов
/ 05 декабря 2018

Я нахожусь в процессе построения телеметрии и мониторинга для приложения, которое использует DefaultJmsListenerContainerFactory для регистрации @JmsListener аннотированных методов.

У меня уже есть обработчик ошибок, зарегистрированный для исключений, выданных при получениисообщение, но я хочу зарегистрировать аналогичный обработчик ошибок для контроля целостности соединения между моим приложением и темой, на которую оно подписано.

Я нашел этот отличный метод setExceptionListener в AbstractMessageListenerContainter,но DefaultJmsListenerContainerFactory не предоставляет метод конфигурации для установки этого атрибута.

Я искал в Javadocs JMS фреймворка Spring, чтобы узнать, есть ли объяснение , почему этот параметр конфигурациине существуетКто-нибудь знает причину, почему это не разоблачается?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Вот что в итоге предоставило мне доступ к этому атрибуту.Я проверил, что я все еще могу получать сообщения из темы, как и раньше

public class PortalJmsListenerContainerFactory
        extends DefaultJmsListenerContainerFactory {

    private ExceptionListener exceptionListener;

    /**
     * @see DefaultMessageListenerContainer#setExceptionListener
     */
    public void setExceptionListener(ExceptionListener exceptionListener) {
        this.exceptionListener = exceptionListener;
    }

    @Override
    protected DefaultMessageListenerContainer createContainerInstance() {
        return new DefaultMessageListenerContainer();
    }

    @Override
    protected void initializeContainer(DefaultMessageListenerContainer container) {
        super.initializeContainer(container);

        if (this.exceptionListener != null) {
            container.setExceptionListener(this.exceptionListener);
        }
    }

}
0 голосов
/ 05 декабря 2018

Похоже на упущение или считалось не тем, что было сочтено необходимым разоблачить.Я предлагаю вам открыть вопрос Improvement JIRA .

Тем временем вы можете получить ссылку на контейнер из JmsListenerEndpointRegistry (используя идентификатор), привести его и установить свойство.

РЕДАКТИРОВАТЬ

Нечто подобное должно работать ...

@Bean
public SmartInitializingSingleton lcPostProcessor(JmsListenerEndpointRegistry registry) {
    return () -> registry.getListenerContainers().forEach(c ->
            ((DefaultMessageListenerContainer) c).setExceptionListener(myExceptionListener()));
}

Он запускается после создания всех bean-компонентов, но до запуска любых контейнеров..

...