spring-amqp очищает ресурсы при завершении работы контейнера прослушивателя

У меня есть несколько контейнеров сообщений с одним слушателем в каждом.

Каждый слушатель

  1. Не является потокобезопасным
  2. Объявлено @Scope (значение = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
  3. Не является лицом без гражданства. имеет внутренний буфер обработанных сообщений
  4. Каждое полученное сообщение X сбрасывает буфер на диск.

Запись на этот тип диска очень затратна, и единственный способ достичь желаемой пропускной способности — очищать буфер только через каждые X сообщений.

Каждый слушатель пишет в свои файлы, так что нет необходимости в блокировке.

Я хочу сбросить буферы, когда контейнер Spring выключен.

Каждый слушатель реализует DisposableBean и метод destroy() для очистки буфера.

После некоторых исследований я обнаружил, что, поскольку bean-компоненты объявлены как прототип области видимости, метод destroy никогда не будет вызываться Spring, потому что он перестает управлять bean-компонентом после его создания.

Как я могу очистить оставшиеся сообщения в буфере, когда весна отключается в этой ситуации?

Есть ли в SimpleMessageListenerContainer хук, который я могу использовать для вызова метода уничтожения в моем слушателе?


person Fab    schedule 11.02.2016    source источник


Ответы (1)


Сам разобрался. Просто нужно было создать собственный BeanPostProcessor, который также реализует DisposableBean.

@Component
public class MyListenerBeanPostProcessor implements BeanPostProcessor, DisposableBean {
    private List<MyListener> listeners = new ArrayList<ExportVisitsListenerBase>();

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (bean instanceof MyListener) {
            listeners.add((MyListener) bean);
        }
        return bean;
    }

    @Override
    public void destroy() throws Exception {
        for (MyListener listener : listeners) {
            listener.destroy();
        }
    }
}
person Fab    schedule 11.02.2016