0

Spring Boot アプリの jta トランザクション マネージャーとして Bitronix XA を使用しています。問題は、MQ サーバー上のリソースを消費する複数の接続を作成していることです。MQ サーバーとして IBM websphere を使用しています。何らかの理由で、Bitronix は指定したプールサイズを受け入れていません。もう 1 つの観察結果は、メッセージのバーストを同時に受信または送信すると、接続リークが発生することです。以下は、コード内の構成です。接続リークの問題を解決する方法を教えてください。

PoolingConnectionFactory:

PoolingConnectionFactory connectionFactory = new PoolingConnectionFactory();
        connectionFactory.setClassName("com.ibm.mq.jms.MQXAQueueConnectionFactory");
        connectionFactory.setUniqueName(XA_FACTORY_NAME);
        connectionFactory.setAllowLocalTransactions(false);
        connectionFactory.setTestConnections(true);
        connectionFactory.setUser(user);
        connectionFactory.setPassword(password);
        connectionFactory.setMaxPoolSize(20);
        Properties driverProperties = connectionFactory.getDriverProperties();
        driverProperties.setProperty("port",  ...);
        driverProperties.setProperty("transportType", ...);
        driverProperties.setProperty("channel", ...);
        driverProperties.setProperty("hostName", ...);
        driverProperties.setProperty("queueManager", ...);

Btm 構成:

@Bean
    @Profile({"cloud", "local"})
    @DependsOn("instanceInfo")
    public bitronix.tm.Configuration btmConfig() {
        bitronix.tm.Configuration btmConfig = TransactionManagerServices.getConfiguration();
        btmConfig.setDisableJmx(true);
        btmConfig.setServerId(instanceInfo);
        return btmConfig;
    }

    @Bean
    @DependsOn("btmConfig")
    public BitronixTransactionManager bitronixTransactionManager() {
        BitronixTransactionManager transactionManager = TransactionManagerServices.getTransactionManager();
        return transactionManager;
    }

SpringIntegrationFlowsで使用される Messagecontainer:

private DefaultMessageListenerContainer createMessageContainer(MessageListenerAdapter messageListenerAdapter,
            ConnectionFactory connectionFactory, String queue, JtaTransactionManager jtaTransactionManager) {
        DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
        container.setMessageListener(messageListenerAdapter);
        container.setConnectionFactory(connectionFactory);
        container.setDestinationName(queue);
        container.setSessionTransacted(true);
        container.setTransactionManager(jtaTransactionManager);
        container.setErrorHandler(containerErrorHandler);
        return container;
    }

DB接続用のPoolingDataSource :

  public PoolingDataSource createPooledDataSource(String driverClassName, String userName, String password, String jdbcURL, String validationQuery) {      
        PoolingDataSource dataSource = new PoolingDataSource();
        dataSource.setUniqueName("dataSource");
        dataSource.setMaxIdleTime(8);
        dataSource.setMinPoolSize(1);
        dataSource.setMaxPoolSize(20);
        dataSource.setTestQuery(validationQuery);
        dataSource.getDriverProperties().setProperty("user", userName);
        dataSource.getDriverProperties().setProperty("password", password);
        dataSource.getDriverProperties().setProperty("URL", jdbcURL);
        dataSource.setClassName(driverClassName);
        dataSource.setTestQuery(validationQuery);
        dataSource.setAllowLocalTransactions(true);
        dataSource.init();
        return dataSource;
}
4

1 に答える 1