{"id":1490,"date":"2023-03-24T22:48:20","date_gmt":"2023-03-24T14:48:20","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1490"},"modified":"2023-04-28T20:30:14","modified_gmt":"2023-04-28T12:30:14","slug":"problems-caused-by-version-when-integration-of-activemq-in-spring-boot-2-x","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/24\/problems-caused-by-version-when-integration-of-activemq-in-spring-boot-2-x\/","title":{"rendered":"Spring Boot 2.x \u6574\u5408ActiveMQ\u65f6\u7248\u672c\u5f15\u8d77\u7684\u95ee\u9898"},"content":{"rendered":"<p>\u4e4b\u524d\u9879\u76ee\u4f7f\u7528\u7684\u662f\u4e00\u76f4\u662f<code>Spring Boot 2.0.*<\/code>\u7684\u7248\u672c\u6574\u5408ActiveMQ\u3002\u672c\u6765\u4ee5\u4e3aSpring Boot 2\u7684\u7248\u672c\u4e4b\u95f4\u6539\u52a8\u5e94\u8be5\u4e0d\u4f1a\u592a\u5927\uff0c\u6240\u4ee5\u95f2\u6765\u65e0\u4e8b\u8bd5\u7740\u66f4\u6539\u6210<code>Spring Boot 2.1.*<\/code>\u7684\u7248\u672c\uff0c\u7ed3\u679c\u51fa\u73b0\u4e86\u4e00\u4e9b\u7248\u672c\u4e0a\u7684\u95ee\u9898\u3002<\/p>\n<h3>\u4f9d\u8d56\u73af\u5883<\/h3>\n<p><!-- more --><\/p>\n<p>\u9996\u5148\u6dfb\u52a0ActiveMQ\u76f8\u5173\u7684\u4f9d\u8d56\uff1a<\/p>\n<pre><code class=\"language-xml\">&lt;dependency&gt;\n    &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-boot-starter-activemq&lt;\/artifactId&gt;\n&lt;\/dependency&gt;\n&lt;dependency&gt;\n    &lt;groupId&gt;org.apache.activemq&lt;\/groupId&gt;\n    &lt;artifactId&gt;activemq-pool&lt;\/artifactId&gt;\n&lt;\/dependency&gt;<\/code><\/pre>\n<p>\u5c06\u7248\u672c\u66f4\u6539\u4e3aSpring Boot 2.1.1<\/p>\n<pre><code class=\"language-xml\">&lt;!-- pom\u6587\u4ef6\u90e8\u5206\u4ee3\u7801 --&gt;\n&lt;parent&gt;\n    &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n    &lt;artifactId&gt;spring-boot-starter-parent&lt;\/artifactId&gt;\n    &lt;version&gt;2.1.1.RELEASE&lt;\/version&gt;\n&lt;\/parent&gt;<\/code><\/pre>\n<p>\u6dfb\u52a0\u6d4b\u8bd5\u7528\u76f8\u5173\u4e1a\u52a1\u4ee3\u7801\uff0c\u4e3a\u4e86\u6d4b\u8bd5\u65b9\u4fbf\u76f4\u63a5\u5c06\u53d1\u9001\u3001\u63a5\u6536\u6574\u5408\u5728\u4e00\u4e2aService\u4e1a\u52a1\u4e2d<\/p>\n<h3>\u6d4b\u8bd5\u7528Service\u5c42\u63a5\u53e3<\/h3>\n<pre><code class=\"language-java\">public interface MessageService {\n    \/\/\u53d1\u9001\u6d88\u606f\n    void sendMessage(Object message);\n    \/\/\u53d1\u9001\u6d88\u606f\u5bf9\u8c61\n    void sendMessageObj(Object message);\n    \/\/\u63a5\u6536\u6d88\u606f\n    void receiveMessage(String message);\n}<\/code><\/pre>\n<h3>\u6d4b\u8bd5\u7528Service\u5c42\u5b9e\u73b0<\/h3>\n<pre><code class=\"language-java\">@Slf4j\n@Service\npublic class MessageServiceImpl implements MessageService {\n    \/**\n     * \u4f9d\u8d56\u6ce8\u5165jmsTemplate\n     *\/\n    @Resource\n    private JmsTemplate jmsTemplate = null;\n\n    \/**\n     * \u53d1\u9001\u6d88\u606f\n     *\/\n    @Override\n    public void sendMessage(Object message) {\n        jmsTemplate.convertAndSend(message);\n    }\n\n    \/**\n     * \u53d1\u9001\u6d88\u606f\u5bf9\u8c61\n     *\/\n    @Override\n    public void sendMessageObj(Object message) {\n        jmsTemplate.convertAndSend(message);\n    }\n\n    \/**\n     * \u63a5\u6536\u6d88\u606f\n     *\/\n    @Override\n    @JmsListener(destination=&quot;${spring.jms.template.default-destination}&quot;)\n    public void receiveMessage(String message) {\n        \/*\n        if (message instanceof ActiveMQTextMessage) {\n            ActiveMQTextMessage ac = (ActiveMQTextMessage) message;\n            try {\n                log.info(&quot;-------&gt;&quot; + ac.getText());\n            } catch (JMSException e) {\n                log.error(e);\n            }\n        } else if(message instanceof ActiveMQObjectMessage) {\n            ActiveMQObjectMessage s = (ActiveMQObjectMessage) message;\n            try {\n                MessageCustom object = (MessageCustom)s.getObject();\n                log.info(object);\n            } catch (JMSException e) {\n                log.error(e);\n            }\n        }\n        *\/\n        System.err.println(message);\n    }\n\n}<\/code><\/pre>\n<h3>\u6d4b\u8bd5\u7528Controller\u5c42<\/h3>\n<pre><code class=\"language-java\">\/**\n * \u53d1\u9001\u5b57\u7b26\u4e32\u6d88\u606f\n *\/\n@RequestMapping(&quot;\/sendMessage&quot;)\npublic void sendMessage(String message) {\n    messageService.sendMessage(message);\n}<\/code><\/pre>\n<h3>\u6d4b\u8bd5\u7528application.properties\u914d\u7f6e\u6587\u4ef6<\/h3>\n<pre><code>spring.activemq.broker-url=tcp:\/\/localhost:61616\nspring.activemq.user=admin\nspring.activemq.password=admin\nspring.activemq.packages.trusted=com.activemq.bean,java.lang\nspring.activemq.pool.enabled=true\nspring.activemq.pool.max-connections=50\nspring.jms.pub-sub-domain=true\nspring.jms.template.default-destination=active.default.destination\n\n# \u5c06spring boot\u65e5\u5fd7\u7ea7\u522b\u8c03\u6574\u4e3adebug\u7ea7\u522b\uff0c\u4ee5\u4fbf\u66f4\u65b9\u4fbf\u67e5\u770b\u6253\u5370\u51fa\u6765\u7684\u65e5\u5fd7\u4fe1\u606f(\u53ea\u9488\u5bf9org.springframework\u53ca\u5176\u5b50\u5305)\nlogging.level.org.springframework=debug<\/code><\/pre>\n<h3>\u8fd0\u884c\u62a5\u9519\u5206\u6790<\/h3>\n<p>\u53c2\u8003\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/github.com\/spring-projects\/spring-boot\/issues\/15998\">https:\/\/github.com\/spring-projects\/spring-boot\/issues\/15998<\/a><\/p>\n<p>\u6b64\u65f6\u542f\u52a8Spring Boot\u5e94\u7528\u540e\uff0c\u4f1a\u51fa\u73b0\u5982\u4e0b\u65e5\u5fd7\u4fe1\u606f\u3002\u53ea\u622a\u53d6\u91cd\u70b9\u7684\u51e0\u4e2a\u90e8\u5206:<\/p>\n<pre><code class=\"language-java\">....\nNegative matches:\n-----------------\n   ActiveMQConnectionFactoryConfiguration.PooledConnectionFactoryConfiguration:\n      Did not match:\n         - @ConditionalOnClass did not find required class &#039;org.messaginghub.pooled.jms.JmsPoolConnectionFactory&#039; (OnClassCondition)\n   ActiveMQConnectionFactoryConfiguration.SimpleConnectionFactoryConfiguration:\n      Did not match:\n         - @ConditionalOnProperty (spring.activemq.pool.enabled=false) found different value in property &#039;enabled&#039; (OnPropertyCondition)\n      Matched:\n         - @ConditionalOnClass found required class &#039;org.springframework.jms.connection.CachingConnectionFactory&#039; (OnClassCondition)\n   ActiveMQXAConnectionFactoryConfiguration:\n      Did not match:\n         - @ConditionalOnBean (types: org.springframework.boot.jms.XAConnectionFactoryWrapper; SearchStrategy: all) did not find any beans of type org.springframework.boot.jms.XAConnectionFactoryWrapper (OnBeanCondition)\n      Matched:\n         - @ConditionalOnClass found required class &#039;javax.transaction.TransactionManager&#039; (OnClassCondition)\n....\n JmsAnnotationDrivenConfiguration.JndiConfiguration:\n      Did not match:\n         - @ConditionalOnJndi JNDI environment is not available (OnJndiCondition)\n   JmsAutoConfiguration:\n      Did not match:\n         - @ConditionalOnBean (types: javax.jms.ConnectionFactory; SearchStrategy: all) did not find any beans of type javax.jms.ConnectionFactory (OnBeanCondition)\n      Matched:\n         - @ConditionalOnClass found required classes &#039;javax.jms.Message&#039;, &#039;org.springframework.jms.core.JmsTemplate&#039; (OnClassCondition)\n   JmsAutoConfiguration.MessagingTemplateConfiguration:\n      Did not match:\n         - Ancestor org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration did not match (ConditionEvaluationReport.AncestorsMatchedCondition)\n      Matched:\n         - @ConditionalOnClass found required class &#039;org.springframework.jms.core.JmsMessagingTemplate&#039; (OnClassCondition)\n.....\nUnconditional classes:\n----------------------\n    org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration\n    org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration\n    org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration\n2019-01-11 10:52:44.446 DEBUG 680 --- [main] o.s.b.d.LoggingFailureAnalysisReporter   : Application failed to start due to an exception\n\norg.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type &#039;org.springframework.jms.core.JmsTemplate&#039; 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=)}\n    at org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoMatchingBeanFound(DefaultListableBeanFactory.java:1644) ~[spring-beans-5.1.3.RELEASE.jar:5.1.3.RELEASE]\n......\n***************************\nAPPLICATION FAILED TO START\n***************************\nDescription:\nA component required a bean of type &#039;org.springframework.jms.core.JmsTemplate&#039; that could not be found.\nAction:\nConsider defining a bean of type &#039;org.springframework.jms.core.JmsTemplate&#039; in your configuration.<\/code><\/pre>\n<p>\u51fa\u73b0\u4e86\u6ca1\u6709\u627e\u5230<code>jmsTemplate<\/code>\u7ec4\u4ef6\u7684\u9519\u8bef\u3002\u67e5\u4e86\u7f51\u4e0a\u5404\u79cd\u51fa\u73b0\u6b64\u9519\u8bef\u7684\u89e3\u51b3\u529e\u6cd5\uff0c\u90fd\u662f\u624b\u52a8\u521b\u5efa<code>connectionFactory<\/code>\u5e76\u521b\u5efa<code>JmsTemplate<\/code>\u76f8\u5173<code>Bean<\/code>\u5bf9\u8c61\u3002\u4f46\u662f\u8fd9\u79cd\u65b9\u5f0f\u6cbb\u6807\u4e0d\u6cbb\u672c\u3002\u65e2\u7136Spring Boot\u5b98\u65b9\u6709\u6574\u5408ActiveMQ\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u4e0d\u53ef\u80fd\u4f1a\u8981\u6c42\u7528\u6237\u81ea\u5df1\u624b\u52a8\u53bb\u521b\u5efa\u76f8\u5173\u7684<code>Bean<\/code>\u5bf9\u8c61\u7684\u3002<\/p>\n<p>\u901a\u8fc7\u67e5\u770b\u65e5\u5fd7(\u4ee5\u4e0a\u622a\u53d6\u7684\u6709\u8fd9\u6bb5\u65e5\u5fd7)\uff1a<\/p>\n<pre><code class=\"language-java\">JmsAutoConfiguration:\n      Did not match:\n         - @ConditionalOnBean (types: javax.jms.ConnectionFactory; SearchStrategy: all) did not find any beans of type javax.jms.ConnectionFactory (OnBeanCondition)<\/code><\/pre>\n<p>\u8bf4\u660e<code>Spring<\/code>\u5bb9\u5668\u4e2d\u5e76\u672a\u6709<code>ConnectionFactory<\/code>\u76f8\u5173\u7684bean\u5bf9\u8c61\u3002\u518d\u5f80\u4e0a\u7ffb\u65e5\u5fd7\u4f1a\u6709\u5982\u4e0b\u51e0\u6bb5\u65e5\u5fd7:<\/p>\n<pre><code class=\"language-java\">ActiveMQConnectionFactoryConfiguration.PooledConnectionFactoryConfiguration:\n      Did not match:\n         - @ConditionalOnClass did not find required class &#039;org.messaginghub.pooled.jms.JmsPoolConnectionFactory&#039; (OnClassCondition)\n   ActiveMQConnectionFactoryConfiguration.SimpleConnectionFactoryConfiguration:\n      Did not match:\n         - @ConditionalOnProperty (spring.activemq.pool.enabled=false) found different value in property &#039;enabled&#039; (OnPropertyCondition)\n      Matched:\n         - @ConditionalOnClass found required class &#039;org.springframework.jms.connection.CachingConnectionFactory&#039; (OnClassCondition)<\/code><\/pre>\n<p>Spring Boot\u4f7f\u7528<code>PooledConnectionFactoryConfiguration<\/code>\u9759\u6001\u5185\u90e8\u7c7b\u9700\u8981\u7c7b\u8def\u5f84\u4e0b\u5b58\u5728<code>org.messaginghub.pooled.jms.JmsPoolConnectionFactory<\/code>\u7c7b\u3002<\/p>\n<p>\u8fd9\u91cc\u622a\u53d6<code>PooledConnectionFactoryConfiguration<\/code>\u76f8\u5173\u7684\u6e90\u7801\uff1a<\/p>\n<pre><code class=\"language-java\">@Configuration\n@ConditionalOnClass({ JmsPoolConnectionFactory.class, PooledObject.class })\nstatic class PooledConnectionFactoryConfiguration {\n\n    @Bean(destroyMethod = &quot;stop&quot;)\n    @ConditionalOnProperty(prefix = &quot;spring.activemq.pool&quot;, name = &quot;enabled&quot;, havingValue = &quot;true&quot;, matchIfMissing = false)\n    public JmsPoolConnectionFactory pooledJmsConnectionFactory(\n            ActiveMQProperties properties,\n            ObjectProvider&lt;ActiveMQConnectionFactoryCustomizer&gt; factoryCustomizers) {\n        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactoryFactory(\n                properties,\n                factoryCustomizers.orderedStream().collect(Collectors.toList()))\n                        .createConnectionFactory(ActiveMQConnectionFactory.class);\n        return new JmsPoolConnectionFactoryFactory(properties.getPool())\n                .createPooledConnectionFactory(connectionFactory);\n    }\n}<\/code><\/pre>\n<p><code>PooledConnectionFactoryConfiguration<\/code>\u8fd9\u4e2a\u9759\u6001\u5185\u90e8\u7c7b\u4e2d<code>pooledJmsConnectionFactory<\/code>\u65b9\u6cd5\u4e0a\u6807\u6ce8\u4e86<code>@Bean<\/code>\uff0c\u8bf4\u660e\u6b64\u65b9\u6cd5\u8fd4\u56de\u7684\u5bf9\u8c61\u4f1a\u88ab\u52a0\u5165\u5230Spring\u5bb9\u5668\u4e2d\u3002\u800c\u8fd4\u56de\u7684<code>JmsPoolConnectionFactory<\/code>\u5bf9\u8c61\u5143\u7c7b\u5b9e\u73b0\u4e86<code>ConnectionFactory<\/code>\u63a5\u53e3\u3002\u6240\u4ee5\u6b64\u9759\u6001\u5185\u90e8\u7c7b\u4fbf\u662f\u51fa\u73b0\u95ee\u9898\u7684\u6e90\u5934\u3002<\/p>\n<p>\u7531\u4e8eSpring Boot\u81ea\u52a8\u914d\u7f6e\u8be5\u5185\u90e8\u7c7b\u7684\u6761\u4ef6\u662f\u7c7b\u8def\u5f84\u4e0b\u5fc5\u987b\u5b58\u5728<code>JmsPoolConnectionFactory<\/code>\u548c<code>PooledObject<\/code>\u4e24\u4e2a\u7c7b\u3002\u67e5\u770b\u4e86\u4f9d\u8d56\u5305\u4e2d\u5e76\u672a\u627e\u5230<code>JmsPoolConnectionFactory<\/code>\u8be5\u7c7b\uff0c\u4ece\u65e5\u5fd7\u4fe1\u606f\u4e0a\u770b\u5230\u8be5\u7c7b\u5e94\u8be5\u5b58\u653e\u4e8e<code>org.messaginghub.pooled.jms<\/code>\u5305\u4e0b\u7684\u3002\u4f46\u662f\u6211\u4eec\u4f9d\u8d56\u4e2d\u5e76\u672a\u5f15\u5165\u76f8\u5173\u7684\u4f9d\u8d56\u5305\u3002\u4ecemaven\u4e2d\u592e\u4ed3\u5e93\u4e2d\u67e5\u8be2\u8be5\u5305\u7684\u524d\u7f00<code>org.messaginghub<\/code>\u53d1\u73b0\u8be5\u4f9d\u8d56\u662f\u5728<code>PooledJMS Library<\/code>\u4e0b\u7684\u3002\u7136\u540e\u5c1d\u8bd5\u5f15\u5165\u8be5maven\u4f9d\u8d56\u5e76\u53bb\u6389\u539f\u6765\u7684<code>ActiveMQ Pool<\/code>\u4f9d\u8d56:<\/p>\n<pre><code class=\"language-xml\">&lt;dependency&gt;\n    &lt;groupId&gt;org.messaginghub&lt;\/groupId&gt;\n    &lt;artifactId&gt;pooled-jms&lt;\/artifactId&gt;\n&lt;\/dependency&gt;\n&lt;!-- \u53bb\u6389\u539f\u6765\u7684\u8fde\u63a5\u6c60\u4f9d\u8d56\n &lt;dependency&gt;\n    &lt;groupId&gt;org.apache.activemq&lt;\/groupId&gt;\n    &lt;artifactId&gt;activemq-pool&lt;\/artifactId&gt;\n&lt;\/dependency&gt; \n--&gt;<\/code><\/pre>\n<p>\u91cd\u65b0\u542f\u52a8Spring Boot\u5e94\u7528\u540e\uff0c\u95ee\u9898\u89e3\u51b3<\/p>\n<p>Spring Boot 2.1.*\u4e2d\u5f15\u5165\u4e86<code>CachingConnectionFactory<\/code>\uff0c\u6240\u4ee5\u5728<code>application.properties<\/code>\u53ef\u4ee5\u4f7f\u7528<code>spring.jms.cache.**<\/code>\u76f8\u5173\u7684\u914d\u7f6e\u3002<\/p>\n<p>\u67e5\u770bSpring Boot 2.1.<em>\u548cSpring Boot 2.0.<\/em>\u6574\u5408ActiveMQ\u65f6\u9700\u8981\u7684\u91cd\u8981\u7c7b<code>ActiveMQConnectionFactoryConfiguration<\/code>\u6e90\u7801\uff1a<\/p>\n<p>Spring Boot 2.1.*\u7248\u672c\u7684\u6e90\u7801\u5982\u4e0b<\/p>\n<pre><code class=\"language-java\">@Configuration\n@ConditionalOnMissingBean(ConnectionFactory.class)\nclass ActiveMQConnectionFactoryConfiguration {\n\n    @Configuration\n    @ConditionalOnClass(CachingConnectionFactory.class)\n    @ConditionalOnProperty(prefix = &quot;spring.activemq.pool&quot;, name = &quot;enabled&quot;, havingValue = &quot;false&quot;, matchIfMissing = true)\n    static class SimpleConnectionFactoryConfiguration {\n\n        private final JmsProperties jmsProperties;\n\n        private final ActiveMQProperties properties;\n\n        private final List&lt;ActiveMQConnectionFactoryCustomizer&gt; connectionFactoryCustomizers;\n\n        SimpleConnectionFactoryConfiguration(JmsProperties jmsProperties,\n                ActiveMQProperties properties,\n                ObjectProvider&lt;ActiveMQConnectionFactoryCustomizer&gt; connectionFactoryCustomizers) {\n            this.jmsProperties = jmsProperties;\n            this.properties = properties;\n            this.connectionFactoryCustomizers = connectionFactoryCustomizers\n                    .orderedStream().collect(Collectors.toList());\n        }\n\n        @Bean\n        @ConditionalOnProperty(prefix = &quot;spring.jms.cache&quot;, name = &quot;enabled&quot;, havingValue = &quot;true&quot;, matchIfMissing = true)\n        public CachingConnectionFactory cachingJmsConnectionFactory() {\n            JmsProperties.Cache cacheProperties = this.jmsProperties.getCache();\n            CachingConnectionFactory connectionFactory = new CachingConnectionFactory(\n                    createConnectionFactory());\n            connectionFactory.setCacheConsumers(cacheProperties.isConsumers());\n            connectionFactory.setCacheProducers(cacheProperties.isProducers());\n            connectionFactory.setSessionCacheSize(cacheProperties.getSessionCacheSize());\n            return connectionFactory;\n        }\n\n        @Bean\n        @ConditionalOnProperty(prefix = &quot;spring.jms.cache&quot;, name = &quot;enabled&quot;, havingValue = &quot;false&quot;)\n        public ActiveMQConnectionFactory jmsConnectionFactory() {\n            return createConnectionFactory();\n        }\n\n        private ActiveMQConnectionFactory createConnectionFactory() {\n            return new ActiveMQConnectionFactoryFactory(this.properties,\n                    this.connectionFactoryCustomizers)\n                            .createConnectionFactory(ActiveMQConnectionFactory.class);\n        }\n\n    }\n\n    @Configuration\n    @ConditionalOnClass({ JmsPoolConnectionFactory.class, PooledObject.class })\n    static class PooledConnectionFactoryConfiguration {\n\n        @Bean(destroyMethod = &quot;stop&quot;)\n        @ConditionalOnProperty(prefix = &quot;spring.activemq.pool&quot;, name = &quot;enabled&quot;, havingValue = &quot;true&quot;, matchIfMissing = false)\n        public JmsPoolConnectionFactory pooledJmsConnectionFactory(\n                ActiveMQProperties properties,\n                ObjectProvider&lt;ActiveMQConnectionFactoryCustomizer&gt; factoryCustomizers) {\n            ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactoryFactory(\n                    properties,\n                    factoryCustomizers.orderedStream().collect(Collectors.toList()))\n                            .createConnectionFactory(ActiveMQConnectionFactory.class);\n            return new JmsPoolConnectionFactoryFactory(properties.getPool())\n                    .createPooledConnectionFactory(connectionFactory);\n        }\n\n    }\n\n}<\/code><\/pre>\n<p>Spring Boot 2.0.*\u7248\u672c\u7684\u6e90\u7801\u5982\u4e0b<\/p>\n<pre><code class=\"language-java\">@Configuration\n@ConditionalOnMissingBean(ConnectionFactory.class)\nclass ActiveMQConnectionFactoryConfiguration {\n\n    @Bean\n    @ConditionalOnProperty(prefix = &quot;spring.activemq.pool&quot;, name = &quot;enabled&quot;, havingValue = &quot;false&quot;, matchIfMissing = true)\n    public ActiveMQConnectionFactory jmsConnectionFactory(ActiveMQProperties properties,\n            ObjectProvider&lt;List&lt;ActiveMQConnectionFactoryCustomizer&gt;&gt; factoryCustomizers) {\n        return new ActiveMQConnectionFactoryFactory(properties,\n                factoryCustomizers.getIfAvailable())\n                        .createConnectionFactory(ActiveMQConnectionFactory.class);\n    }\n\n    @Configuration\n    @ConditionalOnClass(PooledConnectionFactory.class)\n    static class PooledConnectionFactoryConfiguration {\n\n        @Bean(destroyMethod = &quot;stop&quot;)\n        @ConditionalOnProperty(prefix = &quot;spring.activemq.pool&quot;, name = &quot;enabled&quot;, havingValue = &quot;true&quot;, matchIfMissing = false)\n        public PooledConnectionFactory pooledJmsConnectionFactory(\n                ActiveMQProperties properties,\n                ObjectProvider&lt;List&lt;ActiveMQConnectionFactoryCustomizer&gt;&gt; factoryCustomizers) {\n            PooledConnectionFactory pooledConnectionFactory = new PooledConnectionFactory(\n                    new ActiveMQConnectionFactoryFactory(properties,\n                            factoryCustomizers.getIfAvailable()).createConnectionFactory(\n                                    ActiveMQConnectionFactory.class));\n            ActiveMQProperties.Pool pool = properties.getPool();\n            pooledConnectionFactory.setBlockIfSessionPoolIsFull(pool.isBlockIfFull());\n            if (pool.getBlockIfFullTimeout() != null) {\n                pooledConnectionFactory.setBlockIfSessionPoolIsFullTimeout(\n                        pool.getBlockIfFullTimeout().toMillis());\n            }\n            pooledConnectionFactory\n                    .setCreateConnectionOnStartup(pool.isCreateConnectionOnStartup());\n            if (pool.getExpiryTimeout() != null) {\n                pooledConnectionFactory\n                        .setExpiryTimeout(pool.getExpiryTimeout().toMillis());\n            }\n            if (pool.getIdleTimeout() != null) {\n                pooledConnectionFactory\n                        .setIdleTimeout((int) pool.getIdleTimeout().toMillis());\n            }\n            pooledConnectionFactory.setMaxConnections(pool.getMaxConnections());\n            pooledConnectionFactory.setMaximumActiveSessionPerConnection(\n                    pool.getMaximumActiveSessionPerConnection());\n            pooledConnectionFactory\n                    .setReconnectOnException(pool.isReconnectOnException());\n            if (pool.getTimeBetweenExpirationCheck() != null) {\n                pooledConnectionFactory.setTimeBetweenExpirationCheckMillis(\n                        pool.getTimeBetweenExpirationCheck().toMillis());\n            }\n            pooledConnectionFactory\n                    .setUseAnonymousProducers(pool.isUseAnonymousProducers());\n            return pooledConnectionFactory;\n        }\n\n    }\n\n}<\/code><\/pre>\n<p>\u8be5\u7c7b<code>2.1.*<\/code>\u7248\u672c\u4e0e<code>2.0.*<\/code>\u7248\u672c\u7684\u6e90\u7801\u5dee\u5f02\u8f83\u5927\u3002<code>2.1.*<\/code>\u9700\u8981\u4f7f\u7528<code>JmsPoolConnectionFactory<\/code>\u548c<code>PooledObject<\/code>\uff0c\u800c<code>2.0.*<\/code>\u5219\u662f\u76f4\u63a5\u4f7f\u7528<code>PooledConnectionFactory<\/code>\u3002<code>2.1.*<\/code>\u589e\u52a0\u4e86JMS\u7f13\u5b58\u8fde\u63a5\u5de5\u5382\uff0c\u9ed8\u8ba4\u91c7\u7528\u7684\u8fde\u63a5\u6c60\u4e0d\u518d\u662fActiveMQ\u7684\u8fde\u63a5\u6c60\uff0c\u800c\u662f\u91c7\u7528\u4e86<code>PooledJMS Library<\/code>\u3002\u5f53\u914d\u7f6e<code>spring.activemq.pool.enabled<\/code>\u4e3a<code>true<\/code>\u65f6\u4f7f\u7528\u7684\u662f<code>JmsPoolConnectionFactoryProperties<\/code>\u800c\u4e0d\u662f<code>Pool<\/code>\u3002\u76f8\u6bd4<code>2.0.*<\/code>\u4ee3\u7801\u6709\u8f83\u5927\u7684\u6539\u52a8\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4e4b\u524d\u9879\u76ee\u4f7f\u7528\u7684\u662f\u4e00\u76f4\u662fSpring Boot 2.0.*\u7684\u7248\u672c\u6574\u5408ActiveMQ\u3002\u672c\u6765\u4ee5\u4e3aSpring Bo [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[41],"tags":[365],"class_list":["post-1490","post","type-post","status-publish","format-standard","hentry","category-spring-boot","tag-activemq"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1490","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1490"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1490\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1490"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1490"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1490"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}