#java #garbage-collection #connection #jms #release
#java #сбор мусора #подключение #jms #освободить
Вопрос:
Я использую GlassFish JMS ConnectionFactory. Соединение закрыто окончательно. и максимальный размер пула установлен равным 5.
Тестовый пример: я постоянно отправлял 10 сообщений в течение 3 секунд от invoker ().
Результат: первые 5 сообщений отправлены успешно, и последующему сообщению 6 не удалось выделить больше соединений. Это означает, что все предыдущие 5 соединений все еще были открыты.
Вопрос 1: Сколько времени требуется для освобождения опроса соединения после connection.close ()?
Вопрос 2: Отвечает ли сборщик мусора за освобождение соединения после JMS connection.close()?
Это мой простой клиент сообщений, который отправляет сообщения в очередь
private void invoker (идентификатор строки){
Connection connection = null;
Session session = null;
MessageProducer messageProducer = null;
TextMessage message = null;
try {
connection = connectionFactory.createConnection();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
messageProducer = session.createProducer(successfulQueue);
String msg = id;
message = session.createTextMessage(msg);
messageProducer.send(message);
log.info("Successful message is Sent to ProcessQueue: [" msg "]");
}
catch (Exception e) {
log.error(e);
}
finally {
if (messageProducer != null) {
try {
messageProducer.close();
}
catch (JMSException e) {
log.error(e);
}
}
if (session != null) {
try {
session.close();
}
catch (JMSException e) {
log.error(e);
}
}
if (connection != null) {
try {
connection.close();
}
catch (JMSException e) {
log.error(e);
}
}
}
Комментарии:
1. Это
Garbage Collector
неJMS Connection Releaser
, так что попробуйте угадать.2. Спасибо за ответ, итак, каков наилучший подход, чтобы избежать сбоя выделения?
3. Ну, я подозреваю, что вы делаете много неправильных вещей. Прежде всего, вы говорите, что это ваше
MDB
, что неверно. Для обработки сообщения выполняется компонент, управляемый сообщениями. Ваш код не обрабатывает сообщения, он отправляет сообщение.4. Отмечено с благодарностью. Просто чтобы внести изменения в мой пост, это простой клиент сообщений, который отправляет сообщения в очередь 🙂
Ответ №1:
Ответ на ваш 2-й вопрос заключается в том, что соединение не закрывается GC, но вместо этого фоновый процесс, который поддерживает соединение, прерывается connection.close()
(О том, как работает GC, читайте:https://www.quora.com/How-does-garbage-collection-work-in-the-JVM )
Рекомендация: Попробуйте использовать PooledConnectionFactory и выполните .stop() для того же самого, кроме connection.close
@Override
public void contextDestroyed(ServletContextEvent arg0) {
if (connection != null || pcf != null) try {
connection.close();
//pcf.stop();
}
catch (JMSException e) {
//log
}