Как получить количество использованных / открытых соединений на фабрике MQ Connection, настроенной в WebSphere Application Server - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть приложение java, работающее на сервере WebSphere 8.5.5.12. Я подключаюсь к другим приложениям через MQ. Я столкнулся с проблемой производительности приложения и обнаружил, что всякий раз, когда для ответа MQ истекает время ожидания, соединение с очередью не закрывалось должным образом. Я исправил проблему. Я планирую увеличить максимальное соединение для конкретной фабрики соединений с очередью и хочу получить количество соединений, используемых / открытых в фабрике соединений с помощью кода, чтобы я мог соответственно увеличить максимальное количество соединений в зависимости от трафика / объема. Любые выводы будут очень полезны.

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

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

У меня есть пример кода с использованием источника данных, который может помочь ответить на ваш вопрос. Где я использую name = встроенный-derby-datasource, вы можете изменить имя на ваше имя фабрики соединений с очередью. Если вам нужен поиск, замените это имя jndi jdbc / built-in-derby-datasource на имя jndi фабрики соединений с очередью.

Код получит клиент администратора, предоставляющий вам доступ к queryMBeans. После того, как у вас есть mbean, вы можете динамически изменять максимальное количество соединений во время работы сервера.

@SuppressWarnings("unchecked")
public void AdminClientExample() 
{
    Object adminClient = null;

    // Need to set the properties, type, host and port, defaults likely will work for most
    Properties acProps = new Properties();
    acProps.setProperty(AdminClient.CONNECTOR_TYPE, AdminClient.CONNECTOR_TYPE_SOAP);
    acProps.setProperty(AdminClient.CONNECTOR_HOST, "localhost");
    acProps.setProperty(AdminClient.CONNECTOR_PORT, "8880");

    // Set if security is enabled
    //acProps.setProperty(AdminClient.CONNECTOR_SECURITY_ENABLED, "true");
    //acProps.setProperty(AdminClient.USERNAME, "userid");
    //acProps.setProperty(AdminClient.PASSWORD, "userid password");

    try 
    {
        adminClient = AdminClientFactory.createAdminClient(acProps);

    } 
    catch (Exception e)  
    {
        e.printStackTrace();
    }

    ObjectInstance obi = null;
    ObjectName obn = null;
    Set<ObjectInstance> s = null;
    try {
        // The two types to use are J2CConnectionFactory and DataSource if searching through a list of mbeans of that type.
        // type=J2CConnectionFactory
        // type=DataSource
        // obn = new ObjectName("WebSphere:type=DataSource,*");
        // s1 =((AdminClient)adminClient).queryMBeans(obn, null);   // search through s1

        // You can provide the name like this, 
        obn = new ObjectName("WebSphere:name=built-in-derby-datasource,*");
        s =((AdminClient)adminClient).queryMBeans(obn, null);
        // s should contain WebSphere:name=built-in-derby-datasource,process=server1,platform=dynamicproxy,node=DefaultNode01,JDBCProvider=Derby JDBC Provider (XA),diagnosticProvider=true,j2eeType=JDBCDataSource,J2EEServer=server1,Server=server1,version=9.0.0.11,type=DataSource,mbeanIdentifier=cells/DefaultCell01/resources.xml#DataSource_9007001,JDBCResource=Derby JDBC Provider (XA),cell=DefaultCell01,spec=1.0
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (s == null) {
        System.out.println("Did not find MBeans querying for object name " + obn.toString());
        return;
    } else {
        obi = s.iterator().next();  
    }

    // Normally the application using the connection pool will have
    // already done the lookup which creates the objects
    // required to change maxConnections.  This lookup is only for
    // this example.
    InitialContext ctx;
    try {  
        ctx = new InitialContext();
        ctx.lookup("jdbc/built-in-derby-datasource");
    } catch (Exception e) {
        e.printStackTrace();
    }

    // show the connection pool contents
    Object [] parms =  null;
    String [] parmsTypes = null;
    try {
        String ss = (String) ((AdminClient)adminClient).invoke(obi.getObjectName(), "showPoolContents", parms, parmsTypes);
        System.out.println(ss);
    } catch (Exception e) {
        e.printStackTrace(); 
    }

    // get maxConnections
    try {
        Object maxConnections = ((AdminClient)adminClient).getAttribute(obi.getObjectName(), "maxConnections");
        System.out.println(maxConnections);
    } catch (Exception e) {
        e.printStackTrace();
    }

    // change the maxConnections to 11,
    try {
        Integer it = new Integer(11);
        Attribute at = new Attribute("maxConnections", it);
        ((AdminClient)adminClient).setAttribute(obi.getObjectName(), at );
    } catch (Exception e) {
        e.printStackTrace();
    }

    // show the connection pool contents, maxConnection now should be 11.
    // or you can use the get maxConnection to check
    // the changed value.
    try {
        String ss = (String) ((AdminClient)adminClient).invoke(obi.getObjectName(), "showPoolContents", parms, parmsTypes);
        System.out.println(ss);
        // or
        Object maxConnections = ((AdminClient)adminClient).getAttribute(obi.getObjectName(), "maxConnections");
        System.out.println(maxConnections);
    } catch (Exception e) {
        e.printStackTrace();
    }


}
1 голос
/ 07 февраля 2020

Чтобы узнать количество использованных соединений и количество очередей, открытых приложением, вы можете использовать команду MQS C DISPLAY CONN, например: -

DISPLAY CONN(*) TYPE(ALL) ALL WHERE(OBJNAME EQ reply-q-name)

Это покажет вам все соединения и все открытые дескрипторы.

Вы также можете обнаружить точно такие же данные, используя программный интерфейс c, называемый командами PCF, хотя, учитывая, сколько там превосходных инструментов администратора MQ, я не уверен почему вам нужно сделать это "через код", как вы это выразили?

...