@MaxLich
java developer

Как и когда создаются соединения объектом класса CachingConnectionFactory?

Здравствуйте. Использую activiti 6, и service tasks на схеме. Почти у каждого service task прописан один и тот же класс, который отправляет некоторое сообщение. Судя по документации активити, экземпляр этого класса создаётся один на каждый service task. То есть сколько service task, столько и экземпляров этого класса будет (но не больше). В конструкторе класса я создаю экземпляр класса org.springframework.amqp.rabbit.connection.CachingConnectionFactory:
JdbcTemplateNsiDao jdbcTemplateNsiDao = new JdbcTemplateNsiDao();
            jdbcTemplateRlDao = new JdbcTemplateRlDao();

            String hostName = jdbcTemplateNsiDao.getHostName();
            Long port = jdbcTemplateNsiDao.getPort();

            logger.info(String.format("Create the ConnectionFactory for the RabbitMQ with host name = %s and port = %d", hostName, port));
            CachingConnectionFactory connectionFactory =
                    new CachingConnectionFactory(hostName, port.intValue());

            sendService = new SendServiceImpl(new RabbitTemplate(connectionFactory));
            ((SendToETPServiceImpl) sendToETPService).setQueueNameForStatusMovement(jdbcTemplateNsiDao.getQueueNameForStatusMovement());
        } catch (NamingException | IOException e) {
          logger.error("Error while creating JdbcTemplate Dao for Activiti ", e);
        }
    }

Сообщение отправляю уже в классе SendServiceImpl, используя такой код:
rabbitTemplate.convertAndSend(queueNameForStatusMovement, message);

Вопрос: сколько соединений с RabbitMQ будет создано и когда они создаются? Одно на фабрику или при отправке каждый раз будет создаваться соединение? Сейчас есть ощущение, что создаётся больше одного соединения на фабрику.
И ещё вопрос: как происходит закрытие всех открытых соединений? Необходимо явно вызвать destroy()?

ЗЫ К сожалению, не могу создавать объекты RabbitTemplate и CachingConnectionFactory как бины спринговского контейнера. Как я понял, если они созданы как бины, то не возникает проблем с большим количеством соединений, и спринг сам закрывает соединения при закрытии контекста.
  • Вопрос задан
  • 131 просмотр
Решения вопроса 1
@MaxLich Автор вопроса
java developer
Проблема стала не сильно актуальной, так как удалось использовать бины спринга из активити.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Losted
@Losted
Software Architect
Вы ж явно на каждый вызов создаете по новому инстансу фабрики, сервис и дао. Спринговая магия будет работать только, если эти фабрики являются частью спрингового контекста и, по сути, синглтоны.

Собственно - правильное решение - заводить их как бины. Костыльное - управлять количеством инстансов на уровне класса вручную. Но это вам в какой-то момент отстрелит колено, да и по сути, нивелирует смысл спринга в приложении
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 02:56
10000 руб./за проект
22 нояб. 2024, в 00:55
500 руб./за проект
21 нояб. 2024, в 23:30
300000 руб./за проект