Наша задача заключалась в том, чтобы вызвать disnect () из очереди или удаления из администратора очередей, а не close (). Поэтому убедитесь, что ваш наконец блок выглядит примерно так.

сно нашей конфигурации, у нас есть версия WAS 8.5.5.1, версия IBM MQ 7.5.0.3. Мы используем 2 канала для подключения к WMQ, один с MAXINST установлен на 250 и один с 500. SHARECNV установлен на 10 для обоих. Теперь у нас есть верхний предел максимального числа 1600 подключений в администраторе очередей, но в итоге мы пересекаем этот предел после 3-4 дней непрерывной работы WAS Server.

Я хочу понять, как параметры на стороне WAS влияют на этот счет. Мы используем Queue Connection Factory и Act Spec для создания соединений, и у нас есть 23 из них. Из них для 22 параметры в Act Spec и QCF сохраняются по умолчанию, например, максимальное количество сеансов сервера = 10, максимальное число подключений в пуле соединений = 10, максимальное число сеансов в пуле сеансов - 10. Эти сервисы имеют довольно низкую скорость передачи около 15-20. запрос в минуту. Все 22 из них используют один и тот же канал для подключения к администратору очередей с MAXINST, установленным в 250. 1 получает довольно высокую нагрузку с пиком 80 запросов в секунду (приблизительно 40 на сервер), для которого максимальное количество сеансов сервера = 40, максимальное соединение в пуле соединений = 40, максимальное количество сеансов в пуле сеансов установлено равным 10. Значения тайм-аута соединения, времени сбора, неиспользованного времени ожидания и времени ожидания по умолчанию остаются для всех по умолчанию.

С этими настройками мы получаем около 1200 соединений на канале, используемом 22 службами, и около 500 на другом канале после 2-3 дней непрерывной работы. Они накапливаются в течение определенного периода времени. Теперь я хочу настроить эти параметры так, чтобы мы не пересекали предел количества подключений, а также не имели никаких доступных подключений. Итак, у меня есть несколько вопросов:

Что является лучшим вариантом с точки зрения производительности - уменьшение максимального количества соединений в пуле соединений или максимального числа сеансов в пуле сеансов. Какими должны быть идеальные значения для нагрузки, упомянутой ранее.

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

Есть ли какая-либо настройка, которая может быть выполнена на стороне WMQ, чтобы незанятые / неиспользуемые соединения были закрыты, или это может происходить только со стороны клиента.

Значение параметра DISCINT установлено на ноль, а HBINT на 300. Какое должно быть идеальное значение.

Я побежал ниже команды, чтобы просмотреть соединения

echo "DIS CONN(*) TYPE(*) CONNAME CHANNEL OBJNAME OBJTYPE" | mqsc -e -m     QM-p width=1000 | grep -o '^\w\+:\|\w\+[(][^)]\+[)]' | awk -F '[()]' -v OFS="," 'function printValues() { if ("CHANNEL" in p) { print p["CHANNEL"], p["CURSHCNV"], p["CONNAME"],p["CHSTADA"],p["CHSTATI"],p["LSTMSGDA"],p["LSTMSGTI"],p["OBJNAME"],p["OBJTYPE"],p["ASTATE"] } } /^\w+:/ { printValues(); delete p; next } { p[$1] = $2 } END { printValues() }' | grep MYCHANNEL

MYCHANNEL,,10.215.161.65,,,,,,,NONE
MYCHANNEL,,10.215.161.65,,,,,,,SUSPENDED
    MYCHANNEL,,10.215.161.65,,,,,MYQUEUE01,QUEUE,ACTIVE

Я вижу много подключений в состоянии «Нет» и состояние «приостановлено», к которым не привязаны ни OBJNAME, ни OBJTYPE. Я попытался смоделировать проблему в тесте, и происходит то же самое, и эти соединения продолжают увеличиваться, поскольку мы продолжаем выполнять запросы. Может кто-нибудь сказать мне, почему эти связи создаются. Также похоже, что эти соединения никогда не будут использоваться приложением.

Вот как соединение создается и закрывается в приложении: у нас есть класс abstrack, который расширяется всеми MDB

@MessageDriven(activationConfig = {
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue") })
public class TrackBeanV2 extends AbstractServiceBean implements MessageListener {//code}

Компонент abstrack обрабатывает создание и закрытие соединений следующим образом:

public abstract class AbstractServiceBean {

@Resource(name = "myQCF", type = QueueConnectionFactory.class, shareable = true, description = "Reply Connection Factory")
private ConnectionFactory replyCF; 

@PostConstruct
private void postConstruct() {
        replyConnection = replyCF.createConnection();

    }  catch (JMSException e) {
        throw new RuntimeException("Failed to create JMS Connection");
    }

}
@PreDestroy
private void preDestroy() {
    try {
        replyConnection.close();
    } catch (JMSException e) {
        throw new RuntimeException("Failed to close JMS connection", e);
    }
}

private void sendResponseMessage(String outputMessageText, String jmsMessageID , Destination replyDestination) {
    TextMessage replyMessage = null;
    try {           
        createSession();    
        createProducer();
        replyMessage = createReplyMessage(outputMessageText , jmsMessageID);    
        sendReply(replyMessage, replyDestination);  
        closeProducer();
        closeSession();
    } catch (JMSException exp) {
        handleException(exp);
    }
}
private void createSession() throws JMSException{
    replySession = replyConnection.createSession(true, 0);                  
}`
private void createProducer() throws JMSException{                              
    replyProducer = replySession.createProducer(null);      
}

private void closeSession() throws JMSException {
    if (replySession != null) {
        replySession.close();
    }
}

private void closeProducer() throws JMSException{
    if (replyProducer != null) {            
        replyProducer.close();          
    }
}   
private void sendReply(TextMessage replyMessage, Destination replyDestination) throws JMSException {    
    logMessages(replyMessage.getText(), "RESPONSE MESSAGE");
    replyProducer.send(replyDestination, replyMessage);
}

Я не добавил другие методы класса, которые сортируют / отменяют сортировку, и другие вещи.

Ответы на вопрос(3)

Ваш ответ на вопрос