﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-paulwong-随笔分类-JMS</title><link>http://www.blogjava.net/paulwong/category/51879.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 12 Jul 2021 15:33:35 GMT</lastBuildDate><pubDate>Mon, 12 Jul 2021 15:33:35 GMT</pubDate><ttl>60</ttl><item><title>构建ARTEMIS集群</title><link>http://www.blogjava.net/paulwong/archive/2021/06/30/435912.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 30 Jun 2021 08:33:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/06/30/435912.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435912.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/06/30/435912.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435912.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435912.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 如果多个ARTEMIS以单体的方式启动，则各个实例互不相关，不能实现高可用。集群因此需将多个实例组队--集群，以实现高可用，即集群内可实现实例的失败转移，消息的负载均衡，消息的重新分配。这需要在集群配置区指定所有所有实例的IP和PORT。但集群实例如果DOWN机，其保存的消息也会随之消失，因此需要实现高可用，有两种方式：共享存储及消息复制。共享存储共享存储是由master/slave对组成，指两个...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2021/06/30/435912.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/435912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-06-30 16:33 <a href="http://www.blogjava.net/paulwong/archive/2021/06/30/435912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>!!深入了解ActiveMQ！</title><link>http://www.blogjava.net/paulwong/archive/2021/04/01/435839.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 01 Apr 2021 08:36:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/04/01/435839.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435839.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/04/01/435839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435839.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435839.html</trackback:ping><description><![CDATA[<a href="https://my.oschina.net/u/1388595/blog/4545503" target="_blank">https://my.oschina.net/u/1388595/blog/4545503</a><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435839.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-04-01 16:36 <a href="http://www.blogjava.net/paulwong/archive/2021/04/01/435839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在SPRING BOOT中使用多JMS CONNECTION</title><link>http://www.blogjava.net/paulwong/archive/2020/03/19/435278.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 19 Mar 2020 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/03/19/435278.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435278.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/03/19/435278.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435278.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435278.html</trackback:ping><description><![CDATA[使用自定义CONNECTION FACTORY，这样会覆盖SPRING&nbsp;的AUTO CONFIGURATION。<br /><br />ActiveMQConnectionFactoryFactory.java<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;java.lang.reflect.InvocationTargetException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Collections;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.List;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.activemq.ActiveMQConnectionFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.autoconfigure.jms.activemq.ActiveMQConnectionFactoryCustomizer;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.autoconfigure.jms.activemq.ActiveMQProperties;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.autoconfigure.jms.activemq.ActiveMQProperties.Packages;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.util.Assert;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.util.StringUtils;<br /><br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;Factory&nbsp;to&nbsp;create&nbsp;a&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;ActiveMQConnectionFactory}&nbsp;instance&nbsp;from&nbsp;properties&nbsp;defined<br />&nbsp;*&nbsp;in&nbsp;{</span><span style="color: #808080; ">@link</span><span style="color: #008000; ">&nbsp;SecondaryActiveMQProperties}.<br />&nbsp;*<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;Phillip&nbsp;Webb<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;Venil&nbsp;Noronha<br />&nbsp;</span><span style="color: #008000; ">*/</span><br /><span style="color: #0000FF; ">class</span>&nbsp;ActiveMQConnectionFactoryFactory&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;DEFAULT_EMBEDDED_BROKER_URL&nbsp;=&nbsp;"vm://localhost?broker.persistent=false";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;DEFAULT_NETWORK_BROKER_URL&nbsp;=&nbsp;"tcp://localhost:61616";<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;ActiveMQProperties&nbsp;properties;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;List&lt;ActiveMQConnectionFactoryCustomizer&gt;&nbsp;factoryCustomizers;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ActiveMQConnectionFactoryFactory(ActiveMQProperties&nbsp;properties,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;ActiveMQConnectionFactoryCustomizer&gt;&nbsp;factoryCustomizers)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.notNull(properties,&nbsp;"Properties&nbsp;must&nbsp;not&nbsp;be&nbsp;null");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.properties&nbsp;=&nbsp;properties;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.factoryCustomizers&nbsp;=&nbsp;(factoryCustomizers&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;?&nbsp;factoryCustomizers&nbsp;:&nbsp;Collections.emptyList();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;&lt;T&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;ActiveMQConnectionFactory&gt;&nbsp;T&nbsp;createConnectionFactory(Class&lt;T&gt;&nbsp;factoryClass)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;doCreateConnectionFactory(factoryClass);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;ex)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IllegalStateException("Unable&nbsp;to&nbsp;create&nbsp;"&nbsp;+&nbsp;"ActiveMQConnectionFactory",&nbsp;ex);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;&lt;T&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;ActiveMQConnectionFactory&gt;&nbsp;T&nbsp;doCreateConnectionFactory(Class&lt;T&gt;&nbsp;factoryClass)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;factory&nbsp;=&nbsp;createConnectionFactoryInstance(factoryClass);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(<span style="color: #0000FF; ">this</span>.properties.getCloseTimeout()&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory.setCloseTimeout((<span style="color: #0000FF; ">int</span>)&nbsp;<span style="color: #0000FF; ">this</span>.properties.getCloseTimeout().toMillis());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory.setNonBlockingRedelivery(<span style="color: #0000FF; ">this</span>.properties.isNonBlockingRedelivery());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(<span style="color: #0000FF; ">this</span>.properties.getSendTimeout()&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory.setSendTimeout((<span style="color: #0000FF; ">int</span>)&nbsp;<span style="color: #0000FF; ">this</span>.properties.getSendTimeout().toMillis());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Packages&nbsp;packages&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.properties.getPackages();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(packages.getTrustAll()&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory.setTrustAllPackages(packages.getTrustAll());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!packages.getTrusted().isEmpty())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factory.setTrustedPackages(packages.getTrusted());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;customize(factory);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;factory;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;&lt;T&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;ActiveMQConnectionFactory&gt;&nbsp;T&nbsp;createConnectionFactoryInstance(Class&lt;T&gt;&nbsp;factoryClass)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;InstantiationException,&nbsp;IllegalAccessException,&nbsp;InvocationTargetException,&nbsp;NoSuchMethodException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;brokerUrl&nbsp;=&nbsp;determineBrokerUrl();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;user&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.properties.getUser();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;password&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.properties.getPassword();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(StringUtils.hasLength(user)&nbsp;&amp;&amp;&nbsp;StringUtils.hasLength(password))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;factoryClass.getConstructor(String.<span style="color: #0000FF; ">class</span>,&nbsp;String.<span style="color: #0000FF; ">class</span>,&nbsp;String.<span style="color: #0000FF; ">class</span>).newInstance(user,&nbsp;password,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;brokerUrl);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;factoryClass.getConstructor(String.<span style="color: #0000FF; ">class</span>).newInstance(brokerUrl);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;customize(ActiveMQConnectionFactory&nbsp;connectionFactory)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(ActiveMQConnectionFactoryCustomizer&nbsp;factoryCustomizer&nbsp;:&nbsp;<span style="color: #0000FF; ">this</span>.factoryCustomizers)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factoryCustomizer.customize(connectionFactory);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;determineBrokerUrl()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(<span style="color: #0000FF; ">this</span>.properties.getBrokerUrl()&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">this</span>.properties.getBrokerUrl();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(<span style="color: #0000FF; ">this</span>.properties.isInMemory())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;DEFAULT_EMBEDDED_BROKER_URL;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;DEFAULT_NETWORK_BROKER_URL;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br />TwinJmsConnectionFactoryConfiguration.java<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;java.util.stream.Collectors;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.activemq.ActiveMQConnectionFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.messaginghub.pooled.jms.JmsPoolConnectionFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.ObjectProvider;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.autoconfigure.jms.JmsPoolConnectionFactoryFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.autoconfigure.jms.activemq.ActiveMQConnectionFactoryCustomizer;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.autoconfigure.jms.activemq.ActiveMQProperties;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.context.properties.ConfigurationProperties;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Bean;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Configuration;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Primary;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Profile;<br /><br /><br />@Configuration<br />@Profile({"local"})<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;TwinJmsConnectionFactoryConfiguration&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;@ConfigurationProperties(prefix&nbsp;=&nbsp;"spring.activemq.primary")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ActiveMQProperties&nbsp;primaryActiveMQProperties()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ActiveMQProperties();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean(destroyMethod&nbsp;=&nbsp;"stop")<br />&nbsp;&nbsp;&nbsp;&nbsp;@Primary<br />&nbsp;&nbsp;&nbsp;&nbsp;@ConditionalOnProperty(prefix&nbsp;=&nbsp;"spring.activemq.pool",&nbsp;name&nbsp;=&nbsp;"enabled",&nbsp;havingValue&nbsp;=&nbsp;"true")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;JmsPoolConnectionFactory&nbsp;connectionFactory(ActiveMQProperties&nbsp;primaryActiveMQProperties,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectProvider&lt;ActiveMQConnectionFactoryCustomizer&gt;&nbsp;factoryCustomizers)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActiveMQConnectionFactory&nbsp;connectionFactory&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ActiveMQConnectionFactoryFactory(primaryActiveMQProperties,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factoryCustomizers.orderedStream().collect(Collectors.toList()))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.createConnectionFactory(ActiveMQConnectionFactory.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JmsPoolConnectionFactoryFactory(primaryActiveMQProperties.getPool())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.createPooledConnectionFactory(connectionFactory);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">////////////////////////////////////////////////////////////////////////////////<br /></span>&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;@ConfigurationProperties(prefix&nbsp;=&nbsp;"spring.activemq.sescond")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ActiveMQProperties&nbsp;sescondActiveMQProperties()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ActiveMQProperties();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean(destroyMethod&nbsp;=&nbsp;"stop")<br />&nbsp;&nbsp;&nbsp;&nbsp;@ConditionalOnProperty(prefix&nbsp;=&nbsp;"spring.activemq.pool",&nbsp;name&nbsp;=&nbsp;"enabled",&nbsp;havingValue&nbsp;=&nbsp;"true")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;JmsPoolConnectionFactory&nbsp;sescondPooledJmsConnectionFactory(ActiveMQProperties&nbsp;sescondActiveMQProperties,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectProvider&lt;ActiveMQConnectionFactoryCustomizer&gt;&nbsp;factoryCustomizers)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActiveMQConnectionFactory&nbsp;connectionFactory&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ActiveMQConnectionFactoryFactory(sescondActiveMQProperties,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factoryCustomizers.orderedStream().collect(Collectors.toList()))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.createConnectionFactory(ActiveMQConnectionFactory.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JmsPoolConnectionFactoryFactory(sescondActiveMQProperties.getPool())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.createPooledConnectionFactory(connectionFactory);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}</div><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435278.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-03-19 09:45 <a href="http://www.blogjava.net/paulwong/archive/2020/03/19/435278.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Which is better: PooledConnectionFactory or CachingConnectionFactory?</title><link>http://www.blogjava.net/paulwong/archive/2020/03/19/435277.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 19 Mar 2020 01:37:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/03/19/435277.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435277.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/03/19/435277.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435277.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435277.html</trackback:ping><description><![CDATA[<p style="margin: 0px 0px 1em; padding: 0px; border: 0px; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-stretch: inherit; line-height: inherit; font-family: Arial, &quot;Helvetica Neue&quot;, Helvetica, sans-serif; font-size: 15px; vertical-align: baseline; box-sizing: inherit; clear: both; color: #242729; background-color: #ffffff;">From&nbsp;<a href="http://bsnyderblog.blogspot.com/2010/05/tuning-jms-message-consumption-in.html" rel="noreferrer" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; cursor: pointer;">here</a>:</p><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-stretch: inherit; line-height: inherit; font-family: Arial, &quot;Helvetica Neue&quot;, Helvetica, sans-serif; font-size: 15px; vertical-align: baseline; box-sizing: inherit; clear: both; color: #242729; background-color: #ffffff;">The difference between the PooledConnectionFactory and the CachingConnectionFactory is a difference in implementation. Below are some of the characteristics that differ between them:</p><ul style="margin: 0px 0px 1em 30px; padding: 0px; border: 0px; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-stretch: inherit; line-height: inherit; font-family: Arial, &quot;Helvetica Neue&quot;, Helvetica, sans-serif; font-size: 15px; vertical-align: baseline; list-style-position: initial; list-style-image: initial; box-sizing: inherit; color: #242729; background-color: #ffffff;"><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; overflow-wrap: break-word;"><p style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; clear: both;">Although both the PooledConnectionFactory and the CachingConnectionFactory state that they each pool connections, sessions and producers, the PooledConnectionFactory does not actually create a cache of multiple producers. It simply uses a singleton pattern to hand out a single cached producer when one is requested. Whereas the CachingConnectionFactory actually creates a cache containing multiple producers and hands out one producer from the cache when one is requested.</p></li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; overflow-wrap: break-word;"><p style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; clear: both;">The PooledConnectionFactory is built on top of the Apache Commons Pool project for pooling JMS sessions. This allows some additional control over the pool because there are features in Commons Pool that are not being used by the PooledConnectionFactory. These additional features include growing the pool size instead of blocking, throwing an exception when the pool is exhausted, etc. You can utilize these features by creating your own Commons Pool GenericObjectPool using your own customized settings and then handing that object to the PooledConnectionFactory via the setPoolFactory method. See the following for additional info:&nbsp;<a href="http://commons.apache.org/pool/api-1.4/org/apache/commons/pool/impl/GenericObjectPoolFactory.html" rel="noreferrer" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; cursor: pointer;">http://commons.apache.org/pool/api-1.4/org/apache/commons/pool/impl/GenericObjectPoolFactory.html</a></p></li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; overflow-wrap: break-word;"><p style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; clear: both;">The CachingConnectionFactory has the ability to also cache consumers. Just need to take care when using this feature so that you know the consumers are cached according to the rules noted in the blog post.</p></li><li style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; overflow-wrap: break-word;"><p style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; clear: both;"><strong style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit;">But most importantly, the CachingConnectionFactory will work with any JMS compliant MOM. It only requires a JMS connection factory. This is important if you are using more than one MOM vendor which is very common in enterprise organizations (this is mainly due to legacy and existing projects). The important point is that the CachingConnectionFactory works very well with many different MOM implementations, not only ActiveMQ.</strong></p></li></ul><p style="margin: 0px 0px 1em; padding: 0px; border: 0px; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-stretch: inherit; line-height: inherit; font-family: Arial, &quot;Helvetica Neue&quot;, Helvetica, sans-serif; font-size: 15px; vertical-align: baseline; box-sizing: inherit; clear: both; color: #242729; background-color: #ffffff;">From&nbsp;<a href="http://singztechmusings.wordpress.com/2011/06/21/pooledconnectionfactory-vs-cachingconnectionfactory-which-one-is-a-perfect-match-for-spring-jmstemplate/" rel="noreferrer" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; cursor: pointer;">here</a>:</p><ul style="margin: 0px 0px 1em 30px; padding: 0px; border: 0px; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-stretch: inherit; line-height: inherit; font-family: Arial, &quot;Helvetica Neue&quot;, Helvetica, sans-serif; font-size: 15px; vertical-align: baseline; list-style-position: initial; list-style-image: initial; box-sizing: inherit; color: #242729; background-color: #ffffff;"><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; overflow-wrap: break-word;"><p style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; clear: both;"><strong style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit;">If you have clustered ActiveMQs, and use failover transport it has been reported that CachingConnectionFactory is not a right choice.</strong></p></li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; overflow-wrap: break-word;"><p style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; clear: both;">The problem I&#8217;m having is that if one box goes down, we should start sending messages on the other, but it seems to still be using the old connection (every send times out). If I restart the program, it&#8217;ll connect again and everything works. Source:&nbsp;<a href="https://stackoverflow.com/questions/5916638/autoreconnect-problem-with-activemq-and-cachingconnectionfactory" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; cursor: pointer;">Autoreconnect problem with ActiveMQ and CachingConnectionFactory</a></p></li><li style="margin: 0px 0px 0.5em; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; overflow-wrap: break-word;"><p style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; clear: both;"><strong style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit;">The problem is that cached connections to the failed ActiveMQ was still in use and that created the problem for the user. Now, the choice for this scenario is PooledConnectionFactory.</strong></p></li><li style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; overflow-wrap: break-word;"><p style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; clear: both;"><strong style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit;">If you&#8217;re using ActiveMQ today, and chances are that you may switch to some other broker (JBoss MQ, WebSphere MQ) in future, do not use PooledConnectionFactory, as it tightly couples your code to ActiveMQ.</strong></p></li></ul><img src ="http://www.blogjava.net/paulwong/aggbug/435277.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-03-19 09:37 <a href="http://www.blogjava.net/paulwong/archive/2020/03/19/435277.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Setting up ActiveMQ for HA-Load Balance</title><link>http://www.blogjava.net/paulwong/archive/2019/11/04/434897.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 04 Nov 2019 08:14:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/11/04/434897.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434897.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/11/04/434897.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434897.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434897.html</trackback:ping><description><![CDATA[<h3><br /></h3><div style="line-height: 1.6; margin: 0px 0px 1em; color: #997755; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12.88px; background-color: #c0a154;"><div></div></div><div entry-content"="" id="post-body-6360934389531311177" itemprop="description articleBody" style="width: 518px; font-size: 13.524px; line-height: 1.5; position: relative; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; background-color: #c0a154;"><div dir="ltr" trbidi="on">In a typical enterprise applications, we often need messaging and asynchronous processing.<br />To satisfy this need, we need a reliable as well as scalable messaging infrastructure. In currently available messaging infrastructures&nbsp;<a href="http://activemq.apache.org/" style="text-decoration-line: none; color: #993322;">Apache ActiveMQ</a>&nbsp;stands out in terms of features and simplicity.<br /><br />Apache ActiveMQ comes with lot of features in built and also provides a way to configure or tweak as per the needs of an application.<br /><br />In this post , we will explore how to enable network of activeMQ brokers so that we achieve HA(High Availability) as well as load balance between consumers &amp; producers.<br /><br />I carried out &nbsp;my experiment on local machine with ACtiveMQ 5.8.0, but this can be easily upgraded to latest versions of ActiveMQ viz. 5.10.0<br /><br />To have network of brokers, we need multiple brokers. So, I changed tcp and admin ports of brokers so that I can run multiple brokers on single machine.<br /><br />To get brief background on network of broker, please visit this&nbsp;<a href="http://activemq.apache.org/networks-of-brokers.html" style="text-decoration-line: none; color: #993322;">link</a><br /><br />In this post we will setup below topology, we will mix failover and NOB to get work done,<br /><br /><div style="clear: both;"><a href="http://4.bp.blogspot.com/-T5tEwJbScxY/VeIIMNVISDI/AAAAAAAAG9Y/vbwwRUtiEe8/s1600/NOB.PNG" imageanchor="1" style="text-decoration-line: none; color: #993322; margin-left: 1em; margin-right: 1em;"></a></div><div style="clear: both;"></div><div style="clear: both;"></div><div style="clear: both;">1. Producer1 is configured to send messages to broker3 with failover to broker2</div><div style="clear: both;">2. Producer2 is configured to send messages to broker2 with failover to broker3</div><div style="clear: both;">3. Broker3, Broker2 are networked with Broker1as below<br /><br /><img src="http://www.blogjava.net/images/blogjava_net/paulwong/NOB.PNG" border="0" alt="" /><br /></div><div style="clear: both;"></div><div style="clear: both;"></div><div style="clear: both;"></div><div style="clear: both;">4. Broker1 is connected with broker4 with NOB.</div><div style="clear: both;">5. Make sure you enable "advisorySupport" on the broker, which is essential for transparent routing of messages across brokers.</div><div style="clear: both;"><img src="http://www.blogjava.net/images/blogjava_net/paulwong/nob-xml.PNG" width="470" height="120" alt="" /></div><div style="clear: both;">Dry Run:</div><div style="clear: both;">1. Producer1 sends messages to queue "input.q" on broker3, where there are no active consumers, but it see subscriptions from broker1</div><div style="clear: both;">2. Broker1 and broker 4 are has consumers which are looking at "input.q".</div><div style="clear: both;">3. When broker3 receives a message it forwards it to broker1, as its in networked and has active consumers for "input.q"&nbsp;</div><div style="clear: both;">4. When broker1 receives a messages on "input.q", it gets load balanced between broker1 and broker4 &nbsp;as both has consumers looking for "input.q".</div><div style="clear: both;">5. Whenever broker3 goes down, producer1 switches transparently to broker2, as its configured with failover.</div><div style="clear: both;">6. I used prefetch size as 1, so that you can load balancing on consumers</div><div style="clear: both;"></div><div style="clear: both;">Sample activemq configurations can be downloaded from&nbsp;<a href="https://drive.google.com/folderview?id=0B6Izg8p-_St6fmh1ejd3eXRkd1IzUUN1cERkQ1FwRjFnMmpNRXZQUlRid1ZNVWZGWjE0MWM&amp;usp=sharing" style="text-decoration-line: none; color: #993322;">here</a>.</div></div></div><img src ="http://www.blogjava.net/paulwong/aggbug/434897.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-11-04 16:14 <a href="http://www.blogjava.net/paulwong/archive/2019/11/04/434897.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ACTIVE MQ HA</title><link>http://www.blogjava.net/paulwong/archive/2019/11/01/434889.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 01 Nov 2019 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/11/01/434889.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434889.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/11/01/434889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434889.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434889.html</trackback:ping><description><![CDATA[组建ACTIVEMQ CLUSTER，使得其中一个ACTIVE MQ DOWN掉时，能自动切换到其他节点。<br />
<br />
ACTIVEMQ&nbsp;只有MASTER-SLAVE模式，集群中的多个节点共享消息的存储，多个节点同时启动时，竞争消息存储的锁，谁先取得，谁就是MASTER，当MASTER DOWN掉时，锁被释放，SALVE中马上又竞争锁，取得者成为MASTER。<br />
<br />
方案：<br />
<ul>
     <li>安装NFSV4</li>
     <li>修改消息存储路径<br />
     <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
     <br />
     Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
     http://www.CodeHighlighter.com/<br />
     <br />
     --><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">persistenceAdapter</span><span style="color: #0000FF; ">&gt;</span><br />
     &nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">kahaDB&nbsp;</span><span style="color: #FF0000; ">directory</span><span style="color: #0000FF; ">="/sharedFileSystem/sharedBrokerData"</span><span style="color: #0000FF; ">/&gt;</span><br />
     <span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">persistenceAdapter</span><span style="color: #0000FF; ">&gt;</span></div>
     </li>
     <li>客户端修改连接字符串<br />
     <div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
     <br />
     Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
     http://www.CodeHighlighter.com/<br />
     <br />
     -->failover:<span style="color: #008000; ">//</span><span style="color: #008000; ">(tcp:</span><span style="color: #008000; ">//</span><span style="color: #008000; ">master:61616,tcp:</span><span style="color: #008000; ">//</span><span style="color: #008000;">slave:61616)?randomize=false</span></div>
     </li>
</ul>
<img src="https://activemq.apache.org/assets/img/Startup.png" width="328" height="247" alt="" />--》<img src="https://activemq.apache.org/assets/img/MasterFailed.png" alt="" /><br />
<br />
<br />
<a href="https://my.oschina.net/hzchenyh/blog/716424" target="_blank">https://my.oschina.net/hzchenyh/blog/716424</a><br />
<br />
<a href="https://www.iteye.com/blog/shift-alt-ctrl-2069250" target="_blank">https://www.iteye.com/blog/shift-alt-ctrl-2069250</a><br />
<br />
<a href="https://stackoverflow.com/questions/53542928/activemq-ha-on-failover" target="_blank">https://stackoverflow.com/questions/53542928/activemq-ha-on-failover</a><br />
<br />
<a href="https://activemq.apache.org/shared-file-system-master-slave" target="_blank">https://activemq.apache.org/shared-file-system-master-slave</a><br /><br />ActiveMQ(6)-基于networkConnector的Broker-Cluster方案<br /><a href="https://blog.csdn.net/jinjin603/article/details/78657387" target="_blank">https://blog.csdn.net/jinjin603/article/details/78657387</a><br /><br /><br />Multi Data Centre Message Brokers with ActiveMQ<br /><a href="https://medium.com/thg-tech-blog/multi-data-centre-message-brokers-with-activemq-28495046370e" target="_blank">https://medium.com/thg-tech-blog/multi-data-centre-message-brokers-with-activemq-28495046370e</a><br /><br />ActiveMQ中的NetworkConnector（网络连接器）详解<br /><a href="https://www.iteye.com/blog/manzhizhen-2116920" target="_blank">https://www.iteye.com/blog/manzhizhen-2116920</a><br /><br />a<img src ="http://www.blogjava.net/paulwong/aggbug/434889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-11-01 10:46 <a href="http://www.blogjava.net/paulwong/archive/2019/11/01/434889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ACTIVEMQ设置预取消息数目</title><link>http://www.blogjava.net/paulwong/archive/2019/10/31/434888.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 31 Oct 2019 03:28:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/10/31/434888.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434888.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/10/31/434888.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434888.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434888.html</trackback:ping><description><![CDATA[当ACTIVEMQ的某个QUEUE有多个消费者，为避免某个消息者取了更多个消息处理，而造成其他消费者无消息可处理的情况，可以设置每个消费者不预取消息，即每个消费者消费完单个消息后，再去取消息，这样其他消费者就能平均的有消息可处理。<br />
<br />
<br />
<a href="https://stackoverflow.com/questions/35928089/activemq-how-to-prevent-message-from-going-to-dispatched-queue" target="_blank">https://stackoverflow.com/questions/35928089/activemq-how-to-prevent-message-from-going-to-dispatched-queue</a>
<br />
<br />
<br />
设置方法，在CONNECT STRING中设置：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->tcp://localhost:61616?jms.prefetchPolicy.all=0&nbsp;<br />
<br />
tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=0&nbsp;<br />
<br />
queue&nbsp;=&nbsp;new&nbsp;ActiveMQQueue("TEST.QUEUE?consumer.prefetchSize=10")<span style="color: #008000; ">;</span><span style="color: #008000; ">&nbsp;</span><span style="color: #008000; "><br />
</span>consumer&nbsp;=&nbsp;session.createConsumer(queue)<span style="color: #008000; ">;</span></div>
<br /><a href="http://activemq.apache.org/what-is-the-prefetch-limit-for.html" target="_blank">http://activemq.apache.org/what-is-the-prefetch-limit-for.html</a><img src ="http://www.blogjava.net/paulwong/aggbug/434888.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-10-31 11:28 <a href="http://www.blogjava.net/paulwong/archive/2019/10/31/434888.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Springboot ActiveMQ jmsTemplate配置</title><link>http://www.blogjava.net/paulwong/archive/2019/07/24/434287.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 24 Jul 2019 03:40:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/07/24/434287.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434287.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/07/24/434287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434287.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Configuration<br />@DependsOn(value="cachingConnectionFactory")<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;JmsTemplateConfiguration&nbsp;{<br /><br />@Value("${wechat.sendmessage.queue}")<br /><span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;queueName;<br /><br />@Value("${wechat.sendmessage.topic}")<br /><span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;topicName;<br /><br />@Value("${spring.jms.pub-sub-domain}")<br /><span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;isPubSubDomain;<br /><br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;定义点对点队列<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; "><br />&nbsp;</span><span style="color: #008000; ">*/</span><br />@Bean<br /><span style="color: #0000FF; ">public</span>&nbsp;Queue&nbsp;queue()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ActiveMQQueue(queueName);<br />}<br /><br /><br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;定义一个主题<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; "><br />&nbsp;</span><span style="color: #008000; ">*/</span><br />@Bean<br /><span style="color: #0000FF; ">public</span>&nbsp;Topic&nbsp;topic()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ActiveMQTopic(topicName);<br />}<br /><br /><span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;ObjectProvider&lt;DestinationResolver&gt;&nbsp;destinationResolver;<br /><span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;ObjectProvider&lt;MessageConverter&gt;&nbsp;messageConverter;<br /><span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;CachingConnectionFactory&nbsp;cachingConnectionFactory;<br /><br />@Autowired<br /><span style="color: #0000FF; ">public</span>&nbsp;JmsTemplateConfiguration(ObjectProvider&lt;DestinationResolver&gt;&nbsp;destinationResolver,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectProvider&lt;MessageConverter&gt;&nbsp;messageConverter,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CachingConnectionFactory&nbsp;cachingConnectionFactory)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.destinationResolver&nbsp;=&nbsp;destinationResolver;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.messageConverter&nbsp;=&nbsp;messageConverter;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.cachingConnectionFactory&nbsp;=&nbsp;cachingConnectionFactory;<br />}<br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;配置队列生产者的JmsTemplate<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;JmsTemplate<br />&nbsp;</span><span style="color: #008000; ">*/</span><br />@Bean(name="jmsQueueTemplate")<br /><span style="color: #0000FF; ">public</span>&nbsp;JmsTemplate&nbsp;jmsQueueTemplate()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">设置创建连接的工厂<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">JmsTemplate&nbsp;jmsTemplate&nbsp;=&nbsp;new&nbsp;JmsTemplate(connectionFactory);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">优化连接工厂，这里应用缓存池&nbsp;连接工厂就即可</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;JmsTemplate&nbsp;jmsTemplate&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JmsTemplate(cachingConnectionFactory);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">设置默认消费topic<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">jmsTemplate.setDefaultDestination(topic());<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">设置P2P队列消息类型</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jmsTemplate.setPubSubDomain(isPubSubDomain);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;DestinationResolver&nbsp;destinationResolver&nbsp;=&nbsp;(DestinationResolver)&nbsp;<span style="color: #0000FF; ">this</span>.destinationResolver.getIfUnique();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(destinationResolver&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmsTemplate.setDestinationResolver(destinationResolver);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;MessageConverter&nbsp;messageConverter&nbsp;=&nbsp;(MessageConverter)&nbsp;<span style="color: #0000FF; ">this</span>.messageConverter.getIfUnique();<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(messageConverter&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmsTemplate.setMessageConverter(messageConverter);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">deliveryMode,&nbsp;priority,&nbsp;timeToLive&nbsp;的开关，要生效，必须配置为true，默认false</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jmsTemplate.setExplicitQosEnabled(<span style="color: #0000FF; ">true</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">DeliveryMode.NON_PERSISTENT=1:非持久&nbsp;;&nbsp;DeliveryMode.PERSISTENT=2:持久<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">定义持久化后节点挂掉以后，重启可以继续消费.</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">默认不开启事务</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("默认是否开启事务："+jmsTemplate.isSessionTransacted());<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">如果不启用事务，则会导致XA事务失效；<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">作为生产者如果需要支持事务，则需要配置SessionTransacted为true<br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">jmsTemplate.setSessionTransacted(true);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">消息的应答方式，需要手动确认，此时SessionTransacted必须被设置为false，且为Session.CLIENT_ACKNOWLEDGE模式<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">Session.AUTO_ACKNOWLEDGE&nbsp;&nbsp;消息自动签收<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">Session.CLIENT_ACKNOWLEDGE&nbsp;&nbsp;客户端调用acknowledge方法手动签收<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">Session.DUPS_OK_ACKNOWLEDGE&nbsp;不必必须签收，消息可能会重复发送</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;jmsTemplate;<br />}<br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;配置发布订阅生产者的JmsTemplate<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;JmsTemplate<br />&nbsp;</span><span style="color: #008000; ">*/</span><br />@Bean(name="jmsTopicTemplate")<br /><span style="color: #0000FF; ">public</span>&nbsp;JmsTemplate&nbsp;jmsTopicTemplate()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">设置创建连接的工厂<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">JmsTemplate&nbsp;jmsTemplate&nbsp;=&nbsp;new&nbsp;JmsTemplate(connectionFactory);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">优化连接工厂，这里应用缓存池&nbsp;连接工厂就即可</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;JmsTemplate&nbsp;jmsTemplate&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JmsTemplate(cachingConnectionFactory);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">设置默认消费topic<br />&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">jmsTemplate.setDefaultDestination(topic());<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">设置发布订阅消息类型</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jmsTemplate.setPubSubDomain(isPubSubDomain);<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">deliveryMode,&nbsp;priority,&nbsp;timeToLive&nbsp;的开关，要生效，必须配置为true，默认false</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jmsTemplate.setExplicitQosEnabled(<span style="color: #0000FF; ">true</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">DeliveryMode.NON_PERSISTENT=1:非持久&nbsp;;&nbsp;DeliveryMode.PERSISTENT=2:持久</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">默认不开启事务</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("是否开启事务"+jmsTemplate.isSessionTransacted());<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">如果session带有事务，并且事务成功提交，则消息被自动签收。如果事务回滚，则消息会被再次传送。<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">jmsTemplate.setSessionTransacted(true);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">不带事务的session的签收方式，取决于session的配置。<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">默认消息确认方式为1，即AUTO_ACKNOWLEDGE</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("是否消息确认方式"+jmsTemplate.getSessionAcknowledgeMode());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">消息的应答方式，需要手动确认，此时SessionTransacted必须被设置为false，且为Session.CLIENT_ACKNOWLEDGE模式<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">Session.AUTO_ACKNOWLEDGE&nbsp;&nbsp;消息自动签收<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">Session.CLIENT_ACKNOWLEDGE&nbsp;&nbsp;客户端调用acknowledge方法手动签收<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">Session.DUPS_OK_ACKNOWLEDGE&nbsp;不必必须签收，消息可能会重复发送</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;jmsTemplate;<br />}<br /><br />}</div><img src ="http://www.blogjava.net/paulwong/aggbug/434287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-07-24 11:40 <a href="http://www.blogjava.net/paulwong/archive/2019/07/24/434287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Build Messaging Between Ruby/Rails Applications with ActiveMQ</title><link>http://www.blogjava.net/paulwong/archive/2019/07/12/434156.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 12 Jul 2019 09:12:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/07/12/434156.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434156.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/07/12/434156.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434156.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434156.html</trackback:ping><description><![CDATA[<a href="https://dev.to/kirillshevch/build-messaging-between-ruby-rails-applications-with-activemq-4fin" target="_blank">https://dev.to/kirillshevch/build-messaging-between-ruby-rails-applications-with-activemq-4fin</a><img src ="http://www.blogjava.net/paulwong/aggbug/434156.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-07-12 17:12 <a href="http://www.blogjava.net/paulwong/archive/2019/07/12/434156.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RABBITMQ资源</title><link>http://www.blogjava.net/paulwong/archive/2019/06/28/434001.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 28 Jun 2019 02:24:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/06/28/434001.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434001.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/06/28/434001.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434001.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434001.html</trackback:ping><description><![CDATA[消息队列之 RabbitMQ<br /><a href="https://www.jianshu.com/p/79ca08116d57" target="_blank">https://www.jianshu.com/p/79ca08116d57</a><br /><br />Spring Boot 中使用 RabbitMQ<br /><a href="https://juejin.im/post/59f194e06fb9a0451329ec53" target="_blank">https://juejin.im/post/59f194e06fb9a0451329ec53</a><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/434001.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-06-28 10:24 <a href="http://www.blogjava.net/paulwong/archive/2019/06/28/434001.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to implement JMS ReplyTo using SpringBoot</title><link>http://www.blogjava.net/paulwong/archive/2019/06/27/433981.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 27 Jun 2019 01:20:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/06/27/433981.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/433981.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/06/27/433981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/433981.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/433981.html</trackback:ping><description><![CDATA[<div style="box-sizing: border-box; margin: 0px; border: 0px; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-stretch: inherit; font-size: 18px; line-height: inherit; font-family: Helvetica, Arial, sans-serif; vertical-align: baseline; color: #333333; background-color: #ffffff;"><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">Request-Response is a&nbsp;<a href="https://en.wikipedia.org/wiki/Messaging_pattern" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline; color: #4183c4; text-decoration-line: none; cursor: pointer;">message-exchange-pattern</a>. In some cases, a message producer may want the consumers to reply to a message. The JMSReplyTo header indicates which destination, if any, a JMS consumer should reply to. The JMSReplyTo header is set explicitly by the JMS client; its contents will be a javax.jms.Destination object (either Topic or Queue).</p><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">In some cases, the JMS client will want the message consumers to reply to a temporary topic or queue set up by the JMS client. When a JMS message consumer receives a message that includes a JMSReplyTo destination, it can reply using that destination. A JMS consumer is not required to send a reply, but in some JMS applications, clients are programmed to do so.</p><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">For simplicity, this pattern is typically implemented in a purely synchronous fashion, as in web service calls over HTTP, which holds a connection open and waits until the response is delivered or the timeout period expires. However, request&#8211;response may also be implemented asynchronously, with a response being returned at some unknown later time.</p><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">For more information, check&nbsp;<a href="https://en.wikipedia.org/wiki/Request%E2%80%93response" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline; color: #4183c4; text-decoration-line: none; cursor: pointer;">here</a>.</p><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">Now, let&#8217;s jump into the code. In Spring, there are 2 ways to implement this (at least I know of).</p><ol style="box-sizing: border-box; margin: 15px 0px; padding: 0px 0px 0px 30px; border: 0px; font: inherit; vertical-align: baseline; list-style-position: initial; list-style-image: initial;"><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">Using&nbsp;<a href="https://github.com/spring-projects/spring-framework/blob/master/src/docs/asciidoc/integration.adoc#jms-jmstemplate" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline; color: #4183c4; text-decoration-line: none; cursor: pointer;">JMSTemplate</a></li><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">Using&nbsp;<a href="http://spring.io/projects/spring-integration" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline; color: #4183c4; text-decoration-line: none; cursor: pointer;">Spring Integration</a></li></ol><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">For demo purpose, I used&nbsp;<a href="http://activemq.apache.org/" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline; color: #4183c4; text-decoration-line: none; cursor: pointer;">ActiveMQ</a>. However, you can implement this in other messaging systems like IBM MQ, Rabbit MQ, Tibco EMS, etc. In this demo, I send an ObjectMessage of type&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">Order</em>&nbsp;and reply with a&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">Shipment</em>&nbsp;object.</p><h3>Using JMSTemplate</h3><ol style="box-sizing: border-box; margin: 15px 0px; padding: 0px 0px 0px 30px; border: 0px; font: inherit; vertical-align: baseline; list-style-position: initial; list-style-image: initial;"><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;"><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">First, we include the required dependencies. Replace the&nbsp;<code style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: &quot;Bitstream Vera Sans Mono&quot;, Courier, monospace; vertical-align: baseline;">activemq</code>&nbsp;dependency with your messaging system&#8217;s jars if not using ActiveMQ<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependencies</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">org.springframework.boot</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">spring-boot-starter-activemq</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">org.apache.activemq.tooling</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">activemq-junit</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">${activemq.version}</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">version</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">test</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">org.springframework.boot</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">spring-boot-starter-test</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">test</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependencies</span><span style="color: #0000FF; ">&gt;</span></div><div highlighter-rouge"="" style="box-sizing: border-box; margin: 0px; border: 0px; font: inherit; vertical-align: baseline;"></div></li><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;"><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">Using the default&nbsp;<strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">spring.activemq.</strong>&nbsp;properties to configure the application with the ActiveMQ. However, you can do this inside a&nbsp;<strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">@Configuration</strong>&nbsp;class as well.<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;spring:<br />&nbsp;&nbsp;&nbsp;activemq:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;broker-url:&nbsp;tcp://localhost:</span><span style="color: #000000; ">61616</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;non-blocking-redelivery:&nbsp;true<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packages:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trust-all:&nbsp;true&nbsp; &nbsp;&nbsp;</span></div><div highlighter-rouge"="" style="box-sizing: border-box; margin: 0px; border: 0px; font: inherit; vertical-align: baseline;"></div></li><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">Note in the above configuration&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">spring.activemq.packages.trust-all</em>&nbsp;can be changed to&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">spring.activemq.packages.trusted</em>&nbsp;with the appropriate packages.</li><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;"><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">Now spring will do it&#8217;s magic and inject all the required Beans as usual :) However, in our code, we need to&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">EnableJms<br /></em></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.springframework.context.annotation.Configuration;<br />&nbsp;</span><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.springframework.jms.annotation.EnableJms;<br /><br />&nbsp;@EnableJms<br />&nbsp;@Configuration<br />&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;ActiveMQConfig&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;ORDER_QUEUE&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">order-queue</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;ORDER_REPLY_2_QUEUE&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">order-reply-2-queue</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /><br />&nbsp;}</span></div><div highlighter-rouge"="" style="box-sizing: border-box; margin: 0px; border: 0px; font: inherit; vertical-align: baseline;"></div></li><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;"><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">First, we will configure the&nbsp;<strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">Producer<br /></strong></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;@Slf4j<br />&nbsp;@Service<br />&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Producer&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JmsMessagingTemplate&nbsp;jmsMessagingTemplate;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JmsTemplate&nbsp;jmsTemplate;<br />&nbsp; &nbsp; &nbsp; private Session session;<br /><br />&nbsp; &nbsp; &nbsp; @PostConstruct<br />&nbsp; &nbsp; &nbsp; &nbsp;public void init(){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;jmsTemplate.setReceiveTimeout(1000L);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jmsMessagingTemplate.setJmsTemplate(jmsTemplate);<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;session&nbsp;=&nbsp;jmsMessagingTemplate.getConnectionFactory().createConnection()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.createSession(<span style="color: #0000ff;">false</span>,&nbsp;Session.AUTO_ACKNOWLEDGE);<br />&nbsp; &nbsp; &nbsp; &nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Shipment&nbsp;sendWithReply(Order&nbsp;order)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;JMSException&nbsp;{<br /></span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectMessage&nbsp;objectMessage&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;session.createObjectMessage(order);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectMessage.setJMSCorrelationID(UUID.randomUUID().toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectMessage.setJMSReplyTo(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ActiveMQQueue(ORDER_REPLY_2_QUEUE));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectMessage.setJMSCorrelationID(UUID.randomUUID().toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectMessage.setJMSExpiration(</span><span style="color: #000000; ">1000L</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectMessage.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;jmsMessagingTemplate.convertSendAndReceive(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ActiveMQQueue(ORDER_QUEUE),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objectMessage,&nbsp;Shipment.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">);&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">this&nbsp;operation&nbsp;seems&nbsp;to&nbsp;be&nbsp;blocking&nbsp;+&nbsp;sync</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;}</span></div><div highlighter-rouge"="" style="box-sizing: border-box; margin: 0px; border: 0px; font: inherit; vertical-align: baseline;"></div></li><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">Note in the above code that,&nbsp;<a href="https://docs.spring.io/spring-framework/docs/4.3.x/javadoc-api/org/springframework/jms/core/JmsMessagingTemplate.html" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline; color: #4183c4; text-decoration-line: none; cursor: pointer;">JmsMessagingTemplate</a>&nbsp;is used instead of&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">JmsTemplate</em>because, we are interested in the method&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">convertSendAndReceive</em>. As seen in the method signature, it waits to receive the&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">Shipment</em>&nbsp;object from the consumer.</li><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;"><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">Next, we can see the&nbsp;<strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">Receiver<br /></strong></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;@Component<br />&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Receiver&nbsp;</span><span style="color: #0000FF; ">implements</span><span style="color: #000000; ">&nbsp;SessionAwareMessageListener</span><span style="color: #000000; ">&lt;</span><span style="color: #000000; ">Message</span><span style="color: #000000; ">&gt;</span><span style="color: #000000; ">&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@JmsListener(destination&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;ORDER_QUEUE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;onMessage(Message&nbsp;message,&nbsp;Session&nbsp;session)&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;JMSException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Order&nbsp;order&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;(Order)&nbsp;((ActiveMQObjectMessage)&nbsp;message).getObject();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Shipment&nbsp;shipment&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Shipment(order.getId(),&nbsp;UUID.randomUUID().toString());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;done&nbsp;handling&nbsp;the&nbsp;request,&nbsp;now&nbsp;create&nbsp;a&nbsp;response&nbsp;message</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;ObjectMessage&nbsp;responseMessage&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;ActiveMQObjectMessage();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;responseMessage.setJMSCorrelationID(message.getJMSCorrelationID());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;responseMessage.setObject(shipment);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Message&nbsp;sent&nbsp;back&nbsp;to&nbsp;the&nbsp;replyTo&nbsp;address&nbsp;of&nbsp;the&nbsp;income&nbsp;message.</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;MessageProducer&nbsp;producer&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;session.createProducer(message.getJMSReplyTo());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;producer.send(responseMessage);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;}</span></div><div highlighter-rouge"="" style="box-sizing: border-box; margin: 0px; border: 0px; font: inherit; vertical-align: baseline;"></div></li><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">Using the&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">javax.jms.Session</em>&nbsp;the&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">javax.jms.MessageProducer</em>&nbsp;is created and used to send the reply message to the JMSReplyTo queue. In real life, this receiver could be a different application altogether.</li></ol><h3>Using Spring Integration</h3><ol style="box-sizing: border-box; margin: 15px 0px; padding: 0px 0px 0px 30px; border: 0px; font: inherit; vertical-align: baseline; list-style-position: initial; list-style-image: initial;"><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;"><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">First, we include the required dependencies in addition to the above dependencies<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">org.springframework.integration</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">spring-integration-jms</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span></div><div highlighter-rouge"="" style="box-sizing: border-box; margin: 0px; border: 0px; font: inherit; vertical-align: baseline;"></div></li><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;"><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">Using the default&nbsp;<strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">spring.activemq.</strong>&nbsp;properties to configure the application with the ActiveMQ. However, you can do this inside a&nbsp;<strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">@Configuration</strong>&nbsp;class as well.<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;spring</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;activemq</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;broker</span><span style="color: #000000; ">-</span><span style="color: #000000; ">url</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;tcp</span><span style="color: #000000; ">://</span><span style="color: #000000; ">localhost</span><span style="color: #000000; ">:</span><span style="color: #800000; ">61616</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;non</span><span style="color: #000000; ">-</span><span style="color: #000000; ">blocking</span><span style="color: #000000; ">-</span><span style="color: #000000; ">redelivery</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;true<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;packages</span><span style="color: #000000; ">:</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;trust</span><span style="color: #000000; ">-</span><span style="color: #000000; ">all</span><span style="color: #000000; ">:</span><span style="color: #000000; ">&nbsp;true&nbsp; &nbsp;</span></div><div highlighter-rouge"="" style="box-sizing: border-box; margin: 0px; border: 0px; font: inherit; vertical-align: baseline;"></div></li><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">Note in the above configuration&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">spring.activemq.packages.trust-all</em>&nbsp;can be changed to&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">spring.activemq.packages.trusted</em>&nbsp;with the appropriate packages.</li><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;"><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">Next we create the required Beans for the Spring Integration.<br /><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;@EnableIntegration<br />&nbsp;@IntegrationComponentScan<br />&nbsp;@Configuration<br />&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;ActiveMQConfig&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;ORDER_QUEUE&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">order-queue</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">final</span><span style="color: #000000; ">&nbsp;String&nbsp;ORDER_REPLY_2_QUEUE&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">order-reply-2-queue</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;MessageConverter&nbsp;messageConverter()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MappingJackson2MessageConverter&nbsp;converter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;MappingJackson2MessageConverter();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;converter.setTargetType(MessageType.TEXT);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;converter.setTypeIdPropertyName(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">_type</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;converter;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;MessageChannel&nbsp;requests()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;DirectChannel();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@ServiceActivator(inputChannel&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">requests</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;JmsOutboundGateway&nbsp;jmsGateway(ActiveMQConnectionFactory&nbsp;activeMQConnectionFactory)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JmsOutboundGateway&nbsp;gateway&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JmsOutboundGateway();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gateway.setConnectionFactory(activeMQConnectionFactory);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gateway.setRequestDestinationName(ORDER_QUEUE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gateway.setReplyDestinationName(ORDER_REPLY_2_QUEUE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gateway.setCorrelationKey(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">JMSCorrelationID</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gateway.setSendTimeout(</span><span style="color: #000000; ">100L</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gateway.setReceiveTimeout(</span><span style="color: #000000; ">100L</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;gateway;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Receiver&nbsp;receiver;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;DefaultMessageListenerContainer&nbsp;responder(ActiveMQConnectionFactory&nbsp;activeMQConnectionFactory)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DefaultMessageListenerContainer&nbsp;container&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;DefaultMessageListenerContainer();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.setConnectionFactory(activeMQConnectionFactory);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.setDestinationName(ORDER_QUEUE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageListenerAdapter&nbsp;adapter&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;MessageListenerAdapter(</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Object()&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@SuppressWarnings(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">unused</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Shipment&nbsp;handleMessage(Order&nbsp;order)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;receiver.receiveMessage(order);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;container.setMessageListener(adapter);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;container;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;}</span></div><div highlighter-rouge"="" style="box-sizing: border-box; margin: 0px; border: 0px; font: inherit; vertical-align: baseline;"></div></li><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;"><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">Next, we will configure the&nbsp;<strong style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">MessagingGateway<br /><br /></strong></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;@MessagingGateway(defaultRequestChannel&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">requests</span><span style="color: #000000; ">"</span><span style="color: #000000; ">)<br />&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">interface</span><span style="color: #000000; ">&nbsp;ClientGateway&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Shipment&nbsp;sendAndReceive(Order&nbsp;order);<br />&nbsp;}</span></div><div highlighter-rouge"="" style="box-sizing: border-box; margin: 0px; border: 0px; font: inherit; vertical-align: baseline;"></div></li><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;"><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">We then&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">Autowire</em>&nbsp;this gateway in our&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">Component</em>&nbsp;class when we want to send and receive the message. A sample is shown below.<br /><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">&nbsp;@Slf4j<br />&nbsp;@Component<br />&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;Receiver&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;Shipment&nbsp;receiveMessage(@Payload&nbsp;Order&nbsp;order)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Shipment&nbsp;shipment&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;Shipment(order.getId(),&nbsp;UUID.randomUUID().toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;shipment;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;}</span></div><div highlighter-rouge"="" style="box-sizing: border-box; margin: 0px; border: 0px; font: inherit; vertical-align: baseline;"></div></li><li style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">Next we configure the&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">Componen</em>&nbsp;to process the&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">Order</em>&nbsp;message. After successful execution, this component will send the&nbsp;<em style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline;">Shipment</em>&nbsp;message to the JMSReplyTo queue. In real life, this receiver could be a different application altogether.</li></ol><p style="box-sizing: border-box; margin: 15px 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline;">For those, who just want to clone the code, head out to&nbsp;<a href="https://github.com/aniruthmp/jms.git" style="box-sizing: border-box; margin: 0px; padding: 0px; border: 0px; font: inherit; vertical-align: baseline; color: #4183c4; text-decoration-line: none; cursor: pointer;">aniruthmp/jms</a></p></div><div style="box-sizing: border-box; margin: 0px; border: 0px; font-style: italic; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-stretch: inherit; font-size: 18px; line-height: inherit; font-family: Helvetica, Arial, sans-serif; vertical-align: baseline; color: #666666; background-color: #ffffff;">Written on June 5, 2018<br /><a href="https://aniruthmp.github.io/Spring-JMS-request-response/" target="_blank">https://aniruthmp.github.io/Spring-JMS-request-response/</a></div><img src ="http://www.blogjava.net/paulwong/aggbug/433981.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-06-27 09:20 <a href="http://www.blogjava.net/paulwong/archive/2019/06/27/433981.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ACTIVE MQ高级特性</title><link>http://www.blogjava.net/paulwong/archive/2019/06/26/433972.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 26 Jun 2019 06:13:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/06/26/433972.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/433972.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/06/26/433972.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/433972.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/433972.html</trackback:ping><description><![CDATA[<a href="https://blog.51cto.com/1754966750/category17.html" target="_blank">https://blog.51cto.com/1754966750/category17.html</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/433972.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-06-26 14:13 <a href="http://www.blogjava.net/paulwong/archive/2019/06/26/433972.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JMS消息消费的顺序性</title><link>http://www.blogjava.net/paulwong/archive/2019/06/24/433942.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 24 Jun 2019 09:42:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/06/24/433942.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/433942.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/06/24/433942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/433942.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/433942.html</trackback:ping><description><![CDATA[现有的系统架构都是分布式的。有多个消息的发送者和多个消息的消费者。例如订单创建消息和订单支付消息，我们需要保证先消费订单创建消息，然后消费订单支付消息。<br /><br />如何解决MQ消息消费顺序问题<br /><a href="https://segmentfault.com/a/1190000014512075" target="_blank">https://segmentfault.com/a/1190000014512075</a><br /><br />jms-如何保证消息的顺序<br /><a href="https://leokongwq.github.io/2017/01/23/jms-message-order.html" target="_blank">https://leokongwq.github.io/2017/01/23/jms-message-order.html</a><br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/433942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-06-24 17:42 <a href="http://www.blogjava.net/paulwong/archive/2019/06/24/433942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JMS最简单的解释</title><link>http://www.blogjava.net/paulwong/archive/2012/06/06/380104.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 06 Jun 2012 02:18:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/06/06/380104.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/380104.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/06/06/380104.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/380104.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/380104.html</trackback:ping><description><![CDATA[JMS是远程调用的一种，如写了一个方法，想被远程JVM中的对象调用时，就作了这样一个规定，在本身的JVM中建一个队列：List，里面只能放这个方法所需参数类型的对象，如有马上执行本方法，执行后将此对象从队列中移除。远程对象如果想调用此方法，只需往这队列插对象即可。<img src ="http://www.blogjava.net/paulwong/aggbug/380104.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2012-06-06 10:18 <a href="http://www.blogjava.net/paulwong/archive/2012/06/06/380104.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>