项目使用的是一直是spring boot 2.0.*的版本整合ActiveMQ。本来以为spring boot 2的版本之间改动应该不会太大,所以闲来无事试着更改成spring boot 2.1.*的版本,结果出现了一些版本上的问题。
首先添加ActiveMQ相关的依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>
将版本更改为spring boot 2.1.1
<!-- pom文件部分代码 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
添加测试用相关业务代码,为了测试方便直接将发送、接收整合在了一个service业务中了。
测试用service层接口
public interface MessageService {
//发送消息
void sendMessage(Object message);
//发送消息对象
void sendMessageObj(Object message);
//接收消息
void receiveMessage(String message);
}
测试用service层实现
@Service public class MessageServiceImpl implements MessageService { /** * 依赖注入jmsTemplate */ @Resource private JmsTemplate jmsTemplate = null;
<span class="token comment">/** * 发送消息 */</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">sendMessage</span><span class="token punctuation">(</span><span class="token class-name">Object</span> message<span class="token punctuation">)</span> <span class="token punctuation">{</span> jmsTemplate<span class="token punctuation">.</span><span class="token function">convertAndSend</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * 发送消息对象 */</span> <span class="token annotation punctuation">@Override</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">sendMessageObj</span><span class="token punctuation">(</span><span class="token class-name">Object</span> message<span class="token punctuation">)</span> <span class="token punctuation">{</span> jmsTemplate<span class="token punctuation">.</span><span class="token function">convertAndSend</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">/** * 接收消息 */</span> <span class="token annotation punctuation">@Override</span> <span class="token annotation punctuation">@JmsListener</span><span class="token punctuation">(</span>destination<span class="token operator">=</span><span class="token string">"${spring.jms.template.default-destination}"</span><span class="token punctuation">)</span> <span class="token keyword">public</span> <span class="token keyword">void</span> <span class="token function">receiveMessage</span><span class="token punctuation">(</span><span class="token class-name">String</span> message<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">/*if(message instanceof ActiveMQTextMessage) { ActiveMQTextMessage ac = (ActiveMQTextMessage)message; try { System.err.println("------->"+ac.getText()); } catch (JMSException e) { e.printStackTrace(); } }else if(message instanceof ActiveMQObjectMessage) { ActiveMQObjectMessage s = (ActiveMQObjectMessage) message; try { MessageCustom object = (MessageCustom)s.getObject(); System.err.println(object); } catch (JMSException e) { e.printStackTrace(); } }*/</span> <span class="token class-name">System</span><span class="token punctuation">.</span>err<span class="token punctuation">.</span><span class="token function">println</span><span class="token punctuation">(</span>message<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span>
}
测试用controller层
/**
* 发送字符串消息
*/
@RequestMapping("/sendMessage")
public void sendMessage(String message) {
messageService.sendMessage(message);
}
测试用application.properties配置文件
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.packages.trusted=com.activemq.bean,java.lang
spring.activemq.pool.enabled=true
spring.activemq.pool.max-connections=50
spring.jms.pub-sub-domain=true
spring.jms.template.default-destination=active.default.destination
将spring boot日志级别调整为debug级别,以便更方便查看打印出来的日志信息(只针对org.springframework及其子包)
logging.level.org.springframework=debug
测试用例的代码解释不在此记录的讨论范围内,所以相关配置等详细解释看官方给出的文档
此时启动spring boot 应用后,会出现如下日志信息。只截取重点的几个部分:
....
Negative matches:
-----------------
ActiveMQConnectionFactoryConfiguration.PooledConnectionFactoryConfiguration:
Did not match:
- @ConditionalOnClass did not find required class 'org.messaginghub.pooled.jms.JmsPoolConnectionFactory' (OnClassCondition)
ActiveMQConnectionFactoryConfiguration.SimpleConnectionFactoryConfiguration:
Did not match:
- @ConditionalOnProperty (spring.activemq.pool.enabled=false) found different value in property 'enabled' (OnPropertyCondition)
Matched:
- @ConditionalOnClass found required class 'org.springframework.jms.connection.CachingConnectionFactory' (OnClassCondition)
ActiveMQXAConnectionFactoryConfiguration:
Did not match:
- @ConditionalOnBean (types: org.springframework.boot.jms.XAConnectionFactoryWrapper; SearchStrategy: all) did not find any beans of type org.springframework.boot.jms.XAConnectionFactoryWrapper (OnBeanCondition)
Matched:
- @ConditionalOnClass found required class 'javax.transaction.TransactionManager' (OnClassCondition)
....
JmsAnnotationDrivenConfiguration.JndiConfiguration:
Did not match:
- @ConditionalOnJndi JNDI environment is not available (OnJndiCondition)
JmsAutoConfiguration:
Did not match:
- @ConditionalOnBean (types: javax.jms.ConnectionFactory; SearchStrategy: all) did not find any beans of type javax.jms.ConnectionFactory (OnBeanCondition)
Matched:
- @ConditionalOnClass found required classes 'javax.jms.Message', 'org.springframework.jms.core.JmsTemplate' (OnClassCondition)
JmsAutoConfiguration.MessagingTemplateConfiguration:
Did not match:
- Ancestor org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration did not match (ConditionEvaluationReport.AncestorsMatchedCondition)
Matched:
- @ConditionalOnClass found required class 'org.springframework.jms.core.JmsMessagingTemplate' (OnClassCondition)
.....
Unconditional classes:
----------------------
org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration
org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration
org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration
2019-01-11 10:52:44.446 DEBUG 680 --- [main] o.s.b.d.LoggingFailureAnalysisReporter : Application failed to start due to an exception
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘org.springframework.jms.core.JmsTemplate’ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@javax.annotation.Resource(shareable=true, lookup=, name=, description=, authenticationType=CONTAINER, type=class java.lang.Object, mappedName=)}
at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1644) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE]
…
APPLICATION FAILED TO START
Description:
A component required a bean of type ‘org.springframework.jms.core.JmsTemplate’ that could not be found.
Action:
Consider defining a bean of type ‘org.springframework.jms.core.JmsTemplate’ in your configuration.
出现了没有找到jmsTemplate
组件的错误。
查了网上各种出现此错误的解决办法,都是手动创建connectionFactory并创建JmsTemplate相关Bean对象。但是这种方式治标不治本。既然spring boot官方有整合ActiveMQ的相关方法,不可能会要求用户自己手动去创建相关的Bean对象的。此处个人进行了相关的分析并给出了对应解决办法:
通过查看日志(以上截取的有这段日志):
JmsAutoConfiguration:
Did not match:
- @ConditionalOnBean (types: javax.jms.ConnectionFactory; SearchStrategy: all) did not find any beans of type javax.jms.ConnectionFactory (OnBeanCondition)
说明spring 容器中并未有ConnectionFactory
相关的bean对象。在往上翻日志会有如下几段日志:
ActiveMQConnectionFactoryConfiguration.PooledConnectionFactoryConfiguration:
Did not match:
- @ConditionalOnClass did not find required class 'org.messaginghub.pooled.jms.JmsPoolConnectionFactory' (OnClassCondition)
ActiveMQConnectionFactoryConfiguration.SimpleConnectionFactoryConfiguration:
Did not match:
- @ConditionalOnProperty (spring.activemq.pool.enabled=false) found different value in property 'enabled' (OnPropertyCondition)
Matched:
- @ConditionalOnClass found required class 'org.springframework.jms.connection.CachingConnectionFactory' (OnClassCondition)
spring boot 要使用PooledConnectionFactoryConfiguration
静态内部类需要类路径下存在org.messaginghub.pooled.jms.JmsPoolConnectionFactory
类。
我这里截取了PooledConnectionFactoryConfiguration
相关的源码:
@Configuration @ConditionalOnClass({ JmsPoolConnectionFactory.class, PooledObject.class }) static class PooledConnectionFactoryConfiguration {
<span class="token annotation punctuation">@Bean</span><span class="token punctuation">(</span>destroyMethod <span class="token operator">=</span> <span class="token string">"stop"</span><span class="token punctuation">)</span> <span class="token annotation punctuation">@ConditionalOnProperty</span><span class="token punctuation">(</span>prefix <span class="token operator">=</span> <span class="token string">"spring.activemq.pool"</span><span class="token punctuation">,</span> name <span class="token operator">=</span> <span class="token string">"enabled"</span><span class="token punctuation">,</span> havingValue <span class="token operator">=</span> <span class="token string">"true"</span><span class="token punctuation">,</span> matchIfMissing <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">)</span> <span class="token keyword">public</span> <span class="token class-name">JmsPoolConnectionFactory</span> <span class="token function">pooledJmsConnectionFactory</span><span class="token punctuation">(</span> <span class="token class-name">ActiveMQProperties</span> properties<span class="token punctuation">,</span> <span class="token class-name">ObjectProvider</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">ActiveMQConnectionFactoryCustomizer</span><span class="token punctuation">></span></span> factoryCustomizers<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">ActiveMQConnectionFactory</span> connectionFactory <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ActiveMQConnectionFactoryFactory</span><span class="token punctuation">(</span> properties<span class="token punctuation">,</span> factoryCustomizers<span class="token punctuation">.</span><span class="token function">orderedStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">collect</span><span class="token punctuation">(</span><span class="token class-name">Collectors</span><span class="token punctuation">.</span><span class="token function">toList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">createConnectionFactory</span><span class="token punctuation">(</span><span class="token class-name">ActiveMQConnectionFactory</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">JmsPoolConnectionFactoryFactory</span><span class="token punctuation">(</span>properties<span class="token punctuation">.</span><span class="token function">getPool</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">createPooledConnectionFactory</span><span class="token punctuation">(</span>connectionFactory<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>
PooledConnectionFactoryConfiguration这个静态内部类中pooledJmsConnectionFactory方法上标注了@Bean
,说明此方法返回的对象会被加入到spring容器中。而返回的JmsPoolConnectionFactory对象元类实现了ConnectionFactory接口。所以此静态内部类便是出现问题的源头。
由于spring boot自动配置该内部类的条件是类路径下必须存在JmsPoolConnectionFactory和PooledObject
两个类。
查看了依赖包中并未找到JmsPoolConnectionFactory
该类,从日志信息上看到该类应该存放于org.messaginghub.pooled.jms
包下的。但是我们依赖中并未引入相关的依赖包。从maven中央仓库中查询了该包的前缀org.messaginghub
发现该依赖是在PooledJMS Library
下的。然后尝试引入该maven依赖并去掉原来的ActiveMQ Pool
依赖:
<dependency>
<groupId>org.messaginghub</groupId>
<artifactId>pooled-jms</artifactId>
</dependency>
<!-- 去掉原来的连接池依赖
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-pool</artifactId>
</dependency>
-->
重新启动spring boot 应用后,问题解决了。
spring boot 2.1.*中引入了CachingConnectionFactory
,所以在application.properties可以使用spring.jms.cache.**
相关的配置。
查看spring boot 2.1.*和spring boot 2.0.*整合ActiveMQ时需要的重要类ActiveMQConnectionFactoryConfiguration
源码:
//spring boot 2.1.*版本的源码如下 @Configuration @ConditionalOnMissingBean(ConnectionFactory.class) class ActiveMQConnectionFactoryConfiguration {
<span class="token annotation punctuation">@Configuration</span> <span class="token annotation punctuation">@ConditionalOnClass</span><span class="token punctuation">(</span><span class="token class-name">CachingConnectionFactory</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span> <span class="token annotation punctuation">@ConditionalOnProperty</span><span class="token punctuation">(</span>prefix <span class="token operator">=</span> <span class="token string">"spring.activemq.pool"</span><span class="token punctuation">,</span> name <span class="token operator">=</span> <span class="token string">"enabled"</span><span class="token punctuation">,</span> havingValue <span class="token operator">=</span> <span class="token string">"false"</span><span class="token punctuation">,</span> matchIfMissing <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token keyword">static</span> <span class="token keyword">class</span> <span class="token class-name">SimpleConnectionFactoryConfiguration</span> <span class="token punctuation">{</span> <span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token class-name">JmsProperties</span> jmsProperties<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token class-name">ActiveMQProperties</span> properties<span class="token punctuation">;</span> <span class="token keyword">private</span> <span class="token keyword">final</span> <span class="token class-name">List</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">ActiveMQConnectionFactoryCustomizer</span><span class="token punctuation">></span></span> connectionFactoryCustomizers<span class="token punctuation">;</span> <span class="token class-name">SimpleConnectionFactoryConfiguration</span><span class="token punctuation">(</span><span class="token class-name">JmsProperties</span> jmsProperties<span class="token punctuation">,</span> <span class="token class-name">ActiveMQProperties</span> properties<span class="token punctuation">,</span> <span class="token class-name">ObjectProvider</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">ActiveMQConnectionFactoryCustomizer</span><span class="token punctuation">></span></span> connectionFactoryCustomizers<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">this</span><span class="token punctuation">.</span>jmsProperties <span class="token operator">=</span> jmsProperties<span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>properties <span class="token operator">=</span> properties<span class="token punctuation">;</span> <span class="token keyword">this</span><span class="token punctuation">.</span>connectionFactoryCustomizers <span class="token operator">=</span> connectionFactoryCustomizers <span class="token punctuation">.</span><span class="token function">orderedStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">collect</span><span class="token punctuation">(</span><span class="token class-name">Collectors</span><span class="token punctuation">.</span><span class="token function">toList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Bean</span> <span class="token annotation punctuation">@ConditionalOnProperty</span><span class="token punctuation">(</span>prefix <span class="token operator">=</span> <span class="token string">"spring.jms.cache"</span><span class="token punctuation">,</span> name <span class="token operator">=</span> <span class="token string">"enabled"</span><span class="token punctuation">,</span> havingValue <span class="token operator">=</span> <span class="token string">"true"</span><span class="token punctuation">,</span> matchIfMissing <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">)</span> <span class="token keyword">public</span> <span class="token class-name">CachingConnectionFactory</span> <span class="token function">cachingJmsConnectionFactory</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">JmsProperties</span><span class="token punctuation">.</span><span class="token class-name">Cache</span> cacheProperties <span class="token operator">=</span> <span class="token keyword">this</span><span class="token punctuation">.</span>jmsProperties<span class="token punctuation">.</span><span class="token function">getCache</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token class-name">CachingConnectionFactory</span> connectionFactory <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">CachingConnectionFactory</span><span class="token punctuation">(</span> <span class="token function">createConnectionFactory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> connectionFactory<span class="token punctuation">.</span><span class="token function">setCacheConsumers</span><span class="token punctuation">(</span>cacheProperties<span class="token punctuation">.</span><span class="token function">isConsumers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> connectionFactory<span class="token punctuation">.</span><span class="token function">setCacheProducers</span><span class="token punctuation">(</span>cacheProperties<span class="token punctuation">.</span><span class="token function">isProducers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> connectionFactory<span class="token punctuation">.</span><span class="token function">setSessionCacheSize</span><span class="token punctuation">(</span>cacheProperties<span class="token punctuation">.</span><span class="token function">getSessionCacheSize</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> connectionFactory<span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Bean</span> <span class="token annotation punctuation">@ConditionalOnProperty</span><span class="token punctuation">(</span>prefix <span class="token operator">=</span> <span class="token string">"spring.jms.cache"</span><span class="token punctuation">,</span> name <span class="token operator">=</span> <span class="token string">"enabled"</span><span class="token punctuation">,</span> havingValue <span class="token operator">=</span> <span class="token string">"false"</span><span class="token punctuation">)</span> <span class="token keyword">public</span> <span class="token class-name">ActiveMQConnectionFactory</span> <span class="token function">jmsConnectionFactory</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">createConnectionFactory</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">private</span> <span class="token class-name">ActiveMQConnectionFactory</span> <span class="token function">createConnectionFactory</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">ActiveMQConnectionFactoryFactory</span><span class="token punctuation">(</span><span class="token keyword">this</span><span class="token punctuation">.</span>properties<span class="token punctuation">,</span> <span class="token keyword">this</span><span class="token punctuation">.</span>connectionFactoryCustomizers<span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">createConnectionFactory</span><span class="token punctuation">(</span><span class="token class-name">ActiveMQConnectionFactory</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token annotation punctuation">@Configuration</span> <span class="token annotation punctuation">@ConditionalOnClass</span><span class="token punctuation">(</span><span class="token punctuation">{</span> <span class="token class-name">JmsPoolConnectionFactory</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">,</span> <span class="token class-name">PooledObject</span><span class="token punctuation">.</span><span class="token keyword">class</span> <span class="token punctuation">}</span><span class="token punctuation">)</span> <span class="token keyword">static</span> <span class="token keyword">class</span> <span class="token class-name">PooledConnectionFactoryConfiguration</span> <span class="token punctuation">{</span> <span class="token annotation punctuation">@Bean</span><span class="token punctuation">(</span>destroyMethod <span class="token operator">=</span> <span class="token string">"stop"</span><span class="token punctuation">)</span> <span class="token annotation punctuation">@ConditionalOnProperty</span><span class="token punctuation">(</span>prefix <span class="token operator">=</span> <span class="token string">"spring.activemq.pool"</span><span class="token punctuation">,</span> name <span class="token operator">=</span> <span class="token string">"enabled"</span><span class="token punctuation">,</span> havingValue <span class="token operator">=</span> <span class="token string">"true"</span><span class="token punctuation">,</span> matchIfMissing <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">)</span> <span class="token keyword">public</span> <span class="token class-name">JmsPoolConnectionFactory</span> <span class="token function">pooledJmsConnectionFactory</span><span class="token punctuation">(</span> <span class="token class-name">ActiveMQProperties</span> properties<span class="token punctuation">,</span> <span class="token class-name">ObjectProvider</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">ActiveMQConnectionFactoryCustomizer</span><span class="token punctuation">></span></span> factoryCustomizers<span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token class-name">ActiveMQConnectionFactory</span> connectionFactory <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">ActiveMQConnectionFactoryFactory</span><span class="token punctuation">(</span> properties<span class="token punctuation">,</span> factoryCustomizers<span class="token punctuation">.</span><span class="token function">orderedStream</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">collect</span><span class="token punctuation">(</span><span class="token class-name">Collectors</span><span class="token punctuation">.</span><span class="token function">toList</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">createConnectionFactory</span><span class="token punctuation">(</span><span class="token class-name">ActiveMQConnectionFactory</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">JmsPoolConnectionFactoryFactory</span><span class="token punctuation">(</span>properties<span class="token punctuation">.</span><span class="token function">getPool</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">.</span><span class="token function">createPooledConnectionFactory</span><span class="token punctuation">(</span>connectionFactory<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span>
}
//spring 2.0.*版本的源码如下
@Configuration
@ConditionalOnMissingBean(ConnectionFactory.class)
class ActiveMQConnectionFactoryConfiguration {
<span class="token annotation punctuation">@Bean</span>
<span class="token annotation punctuation">@ConditionalOnProperty</span><span class="token punctuation">(</span>prefix <span class="token operator">=</span> <span class="token string">"spring.activemq.pool"</span><span class="token punctuation">,</span> name <span class="token operator">=</span> <span class="token string">"enabled"</span><span class="token punctuation">,</span> havingValue <span class="token operator">=</span> <span class="token string">"false"</span><span class="token punctuation">,</span> matchIfMissing <span class="token operator">=</span> <span class="token boolean">true</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> <span class="token class-name">ActiveMQConnectionFactory</span> <span class="token function">jmsConnectionFactory</span><span class="token punctuation">(</span><span class="token class-name">ActiveMQProperties</span> properties<span class="token punctuation">,</span>
<span class="token class-name">ObjectProvider</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">List</span><span class="token punctuation"><</span><span class="token class-name">ActiveMQConnectionFactoryCustomizer</span><span class="token punctuation">></span><span class="token punctuation">></span></span> factoryCustomizers<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">ActiveMQConnectionFactoryFactory</span><span class="token punctuation">(</span>properties<span class="token punctuation">,</span>
factoryCustomizers<span class="token punctuation">.</span><span class="token function">getIfAvailable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span>
<span class="token punctuation">.</span><span class="token function">createConnectionFactory</span><span class="token punctuation">(</span><span class="token class-name">ActiveMQConnectionFactory</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token annotation punctuation">@Configuration</span>
<span class="token annotation punctuation">@ConditionalOnClass</span><span class="token punctuation">(</span><span class="token class-name">PooledConnectionFactory</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span>
<span class="token keyword">static</span> <span class="token keyword">class</span> <span class="token class-name">PooledConnectionFactoryConfiguration</span> <span class="token punctuation">{</span>
<span class="token annotation punctuation">@Bean</span><span class="token punctuation">(</span>destroyMethod <span class="token operator">=</span> <span class="token string">"stop"</span><span class="token punctuation">)</span>
<span class="token annotation punctuation">@ConditionalOnProperty</span><span class="token punctuation">(</span>prefix <span class="token operator">=</span> <span class="token string">"spring.activemq.pool"</span><span class="token punctuation">,</span> name <span class="token operator">=</span> <span class="token string">"enabled"</span><span class="token punctuation">,</span> havingValue <span class="token operator">=</span> <span class="token string">"true"</span><span class="token punctuation">,</span> matchIfMissing <span class="token operator">=</span> <span class="token boolean">false</span><span class="token punctuation">)</span>
<span class="token keyword">public</span> <span class="token class-name">PooledConnectionFactory</span> <span class="token function">pooledJmsConnectionFactory</span><span class="token punctuation">(</span>
<span class="token class-name">ActiveMQProperties</span> properties<span class="token punctuation">,</span>
<span class="token class-name">ObjectProvider</span><span class="token generics"><span class="token punctuation"><</span><span class="token class-name">List</span><span class="token punctuation"><</span><span class="token class-name">ActiveMQConnectionFactoryCustomizer</span><span class="token punctuation">></span><span class="token punctuation">></span></span> factoryCustomizers<span class="token punctuation">)</span> <span class="token punctuation">{</span>
<span class="token class-name">PooledConnectionFactory</span> pooledConnectionFactory <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">PooledConnectionFactory</span><span class="token punctuation">(</span>
<span class="token keyword">new</span> <span class="token class-name">ActiveMQConnectionFactoryFactory</span><span class="token punctuation">(</span>properties<span class="token punctuation">,</span>
factoryCustomizers<span class="token punctuation">.</span><span class="token function">getIfAvailable</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">createConnectionFactory</span><span class="token punctuation">(</span>
<span class="token class-name">ActiveMQConnectionFactory</span><span class="token punctuation">.</span><span class="token keyword">class</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token class-name">ActiveMQProperties</span><span class="token punctuation">.</span><span class="token class-name">Pool</span> pool <span class="token operator">=</span> properties<span class="token punctuation">.</span><span class="token function">getPool</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
pooledConnectionFactory<span class="token punctuation">.</span><span class="token function">setBlockIfSessionPoolIsFull</span><span class="token punctuation">(</span>pool<span class="token punctuation">.</span><span class="token function">isBlockIfFull</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>pool<span class="token punctuation">.</span><span class="token function">getBlockIfFullTimeout</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
pooledConnectionFactory<span class="token punctuation">.</span><span class="token function">setBlockIfSessionPoolIsFullTimeout</span><span class="token punctuation">(</span>
pool<span class="token punctuation">.</span><span class="token function">getBlockIfFullTimeout</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toMillis</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
pooledConnectionFactory
<span class="token punctuation">.</span><span class="token function">setCreateConnectionOnStartup</span><span class="token punctuation">(</span>pool<span class="token punctuation">.</span><span class="token function">isCreateConnectionOnStartup</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>pool<span class="token punctuation">.</span><span class="token function">getExpiryTimeout</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
pooledConnectionFactory
<span class="token punctuation">.</span><span class="token function">setExpiryTimeout</span><span class="token punctuation">(</span>pool<span class="token punctuation">.</span><span class="token function">getExpiryTimeout</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toMillis</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>pool<span class="token punctuation">.</span><span class="token function">getIdleTimeout</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
pooledConnectionFactory
<span class="token punctuation">.</span><span class="token function">setIdleTimeout</span><span class="token punctuation">(</span><span class="token punctuation">(</span><span class="token keyword">int</span><span class="token punctuation">)</span> pool<span class="token punctuation">.</span><span class="token function">getIdleTimeout</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toMillis</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
pooledConnectionFactory<span class="token punctuation">.</span><span class="token function">setMaxConnections</span><span class="token punctuation">(</span>pool<span class="token punctuation">.</span><span class="token function">getMaxConnections</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
pooledConnectionFactory<span class="token punctuation">.</span><span class="token function">setMaximumActiveSessionPerConnection</span><span class="token punctuation">(</span>
pool<span class="token punctuation">.</span><span class="token function">getMaximumActiveSessionPerConnection</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
pooledConnectionFactory
<span class="token punctuation">.</span><span class="token function">setReconnectOnException</span><span class="token punctuation">(</span>pool<span class="token punctuation">.</span><span class="token function">isReconnectOnException</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">if</span> <span class="token punctuation">(</span>pool<span class="token punctuation">.</span><span class="token function">getTimeBetweenExpirationCheck</span><span class="token punctuation">(</span><span class="token punctuation">)</span> <span class="token operator">!=</span> <span class="token keyword">null</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
pooledConnectionFactory<span class="token punctuation">.</span><span class="token function">setTimeBetweenExpirationCheckMillis</span><span class="token punctuation">(</span>
pool<span class="token punctuation">.</span><span class="token function">getTimeBetweenExpirationCheck</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">.</span><span class="token function">toMillis</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>
pooledConnectionFactory
<span class="token punctuation">.</span><span class="token function">setUseAnonymousProducers</span><span class="token punctuation">(</span>pool<span class="token punctuation">.</span><span class="token function">isUseAnonymousProducers</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token keyword">return</span> pooledConnectionFactory<span class="token punctuation">;</span>
<span class="token punctuation">}</span>
<span class="token punctuation">}</span>
}