springboot-34-activemq配置连接池
(2017-09-26 20:34:45)| 分类: 微服务 |
一般我们在springboot中配置activemq只有以下一行:
spring.activemq.broker-url=tcp://localhost:61616
但如果mq服务器压力过大,可能会导致out of memory,此时就需要进行优化,首先考虑使用mq连接池,避免broker频繁创建连接,减小服务器开销。
1.
首先需要引入activemq-pool:
<dependency>
org.springframework.boot</groupId> <groupId>
spring-boot-starter-activemq</artifactId> <artifactId>
</dependency>
<dependency>
org.apache.activemq</groupId> <groupId>
activemq-pool</artifactId> <artifactId>
</dependency>
2.
我们可以在application.yml中加入:
spring:
tcp://localhost:61616 activemq:
broker-url:
pool:
true enabled:
configuration:
2 max-connections:
spring.activemq.pool.enabled=true表示打开连接池
spring.activemq.pool.maxConnections=2表示最大连接数为2
但如果我们使用了自定义的mq配置中注入了ActiveMQConnectionFactor
@Configuration
public classActivemqComponent {
@Autowired
private ActiveMQConnectionFactor y connectionFactory;
@Bean(name = "queueListenerFactory")
public DefaultJmsListenerContai nerFactory queueListenerFactory(){
new DefaultJmsListenerContai nerFactory factory = DefaultJmsListenerContai nerFactory() ;
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(false);
//return factory.setMessageConverter(new SimpleMessageConverter());
factory;
}
直接启动项目就会出现以下错误:
Field connectionFactory in
com.scn7th.mqConfig.ActivemqComponent required a bean of type
'org.apache.activemq.ActiveMQConnectionFactor
- Bean method 'jmsConnectionFactory' in
'ActiveMQConnectionFactor
- Bean method 'nonXaJmsConnectionFactor
其中第二句是关键,也就是说,springboot-activemq-starter中的自定义配置ActiveMQConnectionFactor
【注】springboot的ActiveMQConnectionFactor
packageorg.springframework.boot.autoconfigure.jms.activemq;
importjavax.jms.ConnectionFactory;
importorg.apache.activemq.ActiveMQConnectionFactor y ;
importorg.apache.activemq.pool.PooledConnectionFactory;
importorg.springframework.boot.autoconfigure.condition.ConditionalOnClass;
importorg.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean ;
importorg.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
importorg.springframework.boot.context.properties.ConfigurationProperties;
importorg.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;
@Configuration
@ConditionalOnMissingBean(ConnectionFactory.class)
classActiveMQConnectionFactor yConfiguration { @Bean
(prefix @ConditionalOnProperty = "spring.activemq.pool", name = "enabled", havingValue = "false", matchIfMissing = true)
public ActiveMQConnectionFactor y jmsConnectionFactory(ActiveMQProperties properties) {
return new ActiveMQConnectionFactor yFactory(properties) class);
.createConnectionFactory(ActiveMQConnectionFactor y.
}
@ConditionalOnClass(PooledConnectionFactory.class)
static class PooledConnectionFactoryC onfiguration { @Bean(destroyMethod
= "stop")
@ConditionalOnProperty(prefix = "spring.activemq.pool", name = "enabled", havingValue = "true", matchIfMissing = false)
@ConfigurationProperties(prefix = "spring.activemq.pool.configuration")
public PooledConnectionFactory pooledJmsConnectionFacto ry (
new ActiveMQProperties properties) {
PooledConnectionFactory pooledConnectionFactory = PooledConnectionFactory(
new ActiveMQConnectionFactor yFactory(properties) class));
.createConnectionFactory(ActiveMQConnectionFactor y.
ActiveMQProperties.Pool pool = properties.getPool();
pooledConnectionFactory.setMaxConnections(pool.getMaxConnections());
pooledConnectionFactory.setIdleTimeout(pool.getIdleTimeout());
pooledConnectionFactory.setExpiryTimeout(pool.getExpiryTimeout());
pooledConnectionFactory; return
}
}
}
3.
@Configuration
public classActivemqComponent {
@Autowired
//private private ActiveMQConnectionFactor y connectionFactory;
PooledConnectionFactory connectionFactory;
@Bean(name = "queueListenerFactory")
public DefaultJmsListenerContai nerFactory queueListenerFactory(){
new DefaultJmsListenerContai nerFactory factory = DefaultJmsListenerContai nerFactory() ;
factory.setConnectionFactory(connectionFactory);
factory.setPubSubDomain(false);
//return factory.setMessageConverter(new SimpleMessageConverter());
factory;
}
}
完成以上三点配置后,就可以成功启动了

加载中…