【发布时间】:2018-11-16 08:31:59
【问题描述】:
我们在 Spring Boot 应用程序中使用 Bitronix XA 作为 jta 事务管理器。问题是它建立的多个连接会占用 MQ 服务器上的资源。我们使用 IBM websphere 作为 MQ 服务器。出于某种原因,Bitronix 不尊重我们提供的池大小。另一个观察结果是,当我们同时接收或发送大量消息时,就会发生连接泄漏。下面是代码中的配置。请告知如何解决连接泄漏问题。
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;
}
Messagecontainer在 SpringIntegrationFlows 中使用:
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;
}
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;
}
【问题讨论】:
标签: spring-boot ibm-mq xa bitronix