﻿<?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-随笔分类-SPRING INTERGRATION</title><link>http://www.blogjava.net/paulwong/category/51928.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 21 Jan 2022 02:24:41 GMT</lastBuildDate><pubDate>Fri, 21 Jan 2022 02:24:41 GMT</pubDate><ttl>60</ttl><item><title>SPRING INTEGRATION - 集群选主、分布式锁</title><link>http://www.blogjava.net/paulwong/archive/2022/01/20/439381.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 20 Jan 2022 05:49:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2022/01/20/439381.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/439381.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2022/01/20/439381.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/439381.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/439381.html</trackback:ping><description><![CDATA[集群通常是有多个相同的实例，但对于定时任务场景，只希望有一个实例工作即可，如果这个实例挂了，其他实例可以顶替。<br /><br />这个问题的方案则是集群选主，一个集群中，只有一个LEADER，由LEADER负责执行定时任务工作。当LEADER被取消时，会在剩下的实例中再选LEADER。<br /><br />持有分布式锁的实例则是LEADER。<br /><br />SPRING INTEGRATION JDBC&nbsp;则已提供相关功能。<br /><br />pom.xml<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 />-->&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.springframework.integration<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-integration-jdbc<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.springframework.boot<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>spring-boot-starter-jdbc<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.flywaydb<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>flyway-core<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>org.mariadb.jdbc<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>mariadb-java-client<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span></div><br />LeaderElectionIntegrationConfig.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.List;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.concurrent.CopyOnWriteArrayList;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;javax.sql.DataSource;<br /><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.integration.jdbc.lock.DefaultLockRepository;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.jdbc.lock.JdbcLockRegistry;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.jdbc.lock.LockRepository;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.support.leader.LockRegistryLeaderInitiator;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.paul.integration.leader.ControlBusGateway;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.paul.integration.leader.MyCandidate;<br /><br />@Configuration<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;LeaderElectionIntegrationConfig&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;List&lt;String&gt;&nbsp;needToStartupAdapterList(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CopyOnWriteArrayList&lt;&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;DefaultLockRepository&nbsp;defaultLockRepository(DataSource&nbsp;dataSource){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DefaultLockRepository&nbsp;defaultLockRepository&nbsp;=<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;DefaultLockRepository(dataSource);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defaultLockRepository.setTimeToLive(60_000);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;defaultLockRepository;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;JdbcLockRegistry&nbsp;jdbcLockRegistry(LockRepository&nbsp;lockRepository){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;JdbcLockRegistry(lockRepository);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;MyCandidate&nbsp;myCandidate(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ControlBusGateway&nbsp;controlBusGateway,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;String&gt;&nbsp;needToStartupAdapterList<br />&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;MyCandidate(controlBusGateway,&nbsp;needToStartupAdapterList);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;LockRegistryLeaderInitiator&nbsp;leaderInitiator()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;LockRegistryLeaderInitiator(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jdbcLockRegistry(<span style="color: #0000FF; ">null</span>),&nbsp;myCandidate(<span style="color: #0000FF; ">null</span>,&nbsp;<span style="color: #0000FF; ">null</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}</div><br /><br /><div>MyCandidate.java</div><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.List;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.Logger;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.LoggerFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.leader.Context;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.leader.DefaultCandidate;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.novacredit.mcra.mcracommon.integration.gateway.ControlBusGateway;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MyCandidate&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;DefaultCandidate{<br />&nbsp;&nbsp;&nbsp;&nbsp;<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;Logger&nbsp;LOG&nbsp;=&nbsp;LoggerFactory.getLogger(MyCandidate.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;List&lt;String&gt;&nbsp;needToStartupAdapterList;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;ControlBusGateway&nbsp;controlBusGateway;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;MyCandidate(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ControlBusGateway&nbsp;controlBusGateway,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;String&gt;&nbsp;needToStartupAdapterList<br />&nbsp;&nbsp;&nbsp;&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.controlBusGateway&nbsp;=&nbsp;controlBusGateway;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.needToStartupAdapterList&nbsp;=&nbsp;needToStartupAdapterList;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;onGranted(Context&nbsp;context)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">super</span>.onGranted(context);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.info("***&nbsp;Leadership&nbsp;granted&nbsp;***");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.info("STARTING&nbsp;MONGODB&nbsp;POLLER");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;needToStartupAdapterList<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.forEach(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;-&gt;&nbsp;{<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;"@'testIntegrationFlow.org.springframework.integration.config."<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&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;"SourcePollingChannelAdapterFactoryBean#0'";</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;command&nbsp;=&nbsp;c&nbsp;+&nbsp;".start()";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.info("-----{}",&nbsp;command);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controlBusGateway.sendCommand(command);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.info("STARTUP&nbsp;MESSAGE&nbsp;SENT");<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;onRevoked(Context&nbsp;context)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">super</span>.onRevoked(context);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.info("***&nbsp;Leadership&nbsp;revoked&nbsp;***");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.info("STOPPING&nbsp;MONGODB&nbsp;POLLER");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;needToStartupAdapterList<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.forEach(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;-&gt;&nbsp;{<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c&nbsp;=&nbsp;"@'testIntegrationConfig.testIntegrationFlow."<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&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;"mongoMessageSource.inboundChannelAdapter'";</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;command&nbsp;=&nbsp;c&nbsp;+&nbsp;".stop()";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.info("-----{}",&nbsp;command);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;controlBusGateway.sendCommand(command);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOG.info("SHUTDOWN&nbsp;MESSAGE&nbsp;SENT");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br /><br />ControlBusIntegrationConfig.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;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.integration.dsl.IntegrationFlow;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.IntegrationFlows;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.MessageChannels;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.gateway.GatewayProxyFactoryBean;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.handler.LoggingHandler;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.messaging.MessageChannel;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;com.paul.integration.gateway.ControlBusGateway;<br /><br />@Configuration<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ControlBusIntegrationConfig&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;MessageChannel&nbsp;controlBusChannel()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;MessageChannels.direct().get();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;controlBusFlow()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IntegrationFlows.from(controlBusChannel())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.log(LoggingHandler.Level.INFO,&nbsp;"controlBusChannel")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.controlBus()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;GatewayProxyFactoryBean&nbsp;controlBusGateway()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GatewayProxyFactoryBean&nbsp;gateway&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;GatewayProxyFactoryBean(ControlBusGateway.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gateway.setDefaultRequestChannel(controlBusChannel());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gateway.setDefaultRequestTimeout(300l);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gateway.setDefaultReplyTimeout(300l);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;gateway;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />}</div><br /><br />ControlBusGateway.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; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;ControlBusGateway&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;sendCommand(String&nbsp;command);<br /><br />}</div><br /><br />各个应用实例运行时，其中的LockRegistryLeaderInitiator会自动运行，抢夺LEADER数据，最终只有一个实例夺取。之后再执行MyCandidate中的代码。<br /><br /><br /><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/439381.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> 2022-01-20 13:49 <a href="http://www.blogjava.net/paulwong/archive/2022/01/20/439381.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EVEN DRIVEN - SPRING CLOUD STREAM 3.x - Functional Programming Model</title><link>http://www.blogjava.net/paulwong/archive/2021/11/10/436035.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 10 Nov 2021 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/11/10/436035.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/436035.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/11/10/436035.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/436035.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/436035.html</trackback:ping><description><![CDATA[<div>SPRING CLOUD STREAM 3.x&nbsp;版本时，之前的一些编程模式，如@Enablebindding，@StreamListenner等注释被废弃了，这是由于一些框架的代码必需由用户编写，如配置框架用的Input MessageChannel，Output&nbsp; MessageChannel，连接MessageHandler与MessageChannel等，被视为不必要的动作。为了简化用户代码，于是推出Functional Programming Model。<br /><br />引入了新名词：Supplier、Function与Consumer。实际上这几个类可视为Adapter，如果之前已经有存在的Service类，且方法名为各种各样，可以重新包装成Supplier、Function与Consumer，并在固定的方法名：apply/get/accept中调用Service的方法。<br /><br /><h2>Supplier</h2>当在配置文件中注入此类型的Bean，并在spring.cloud.stream.function.definition加入此Bean的名称，SPRING CLOUD STREAM就会帮你生成一个Output&nbsp; MessageChannel，并连接上此Bean，后续只需要在BINDDING中加入对应的Destination Name，即可向BROKER发消息了。<br /><br /><h2>Consumer</h2>当在配置文件中注入此类型的Bean，并在spring.cloud.stream.function.definition加入此Bean的名称，SPRING CLOUD STREAM就会帮你生成一个Input&nbsp; MessageChannel，并连接上此Bean，后续只需要在BINDDING中加入对应的Destination Name，即可收到BROKER推送关于此Destination的消息了。<br /></div><h2>Function</h2>当在配置文件中注入此类型的Bean，并在spring.cloud.stream.function.definition加入此Bean的名称，SPRING CLOUD STREAM就会帮你生成一个Input和Output&nbsp; MessageChannel，并连接上此Bean，后续只需要在BINDDING中分别对Input和Output&nbsp;MessageChannel加入对应的Destination Name1/Name2，即可收到BROKER推送关于此Destination的消息，也可以向BROKER发消息了。<br /><br /><h2>与SPRING INTEGRATION的整合</h2>如果要对消息进行复杂处理，如拆分消息、聚合消息、IF ELSE消息等，就要借助SPRING INTEGRATION了。<br /><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 />-->@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;upperCaseFlow(LoanService&nbsp;loanService)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IntegrationFlows<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">turn&nbsp;this&nbsp;IntegrationFlow&nbsp;as&nbsp;a&nbsp;gateway,&nbsp;here&nbsp;is&nbsp;a&nbsp;Function&nbsp;interface&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">with&nbsp;loadCheckerFunction&nbsp;as&nbsp;bean&nbsp;name</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.from(LoadCheckerFunction.<span style="color: #0000FF; ">class</span>,&nbsp;gateway&nbsp;-&gt;&nbsp;gateway.beanName("loadCheckerFunction"))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.handle(loanService,&nbsp;"check")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.logAndReply(LoggingHandler.Level.WARN);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">interface</span>&nbsp;LoadCheckerFunction&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;Function&lt;Loan,&nbsp;Loan&gt;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><br />IntegrationFlows.from(Class&lt;?&gt; serviceInterface)是可以将本IntegrationFlow包装成serviceInterface的实现类，如果调用此接口，最终会返回IntegrationFlow最后一个步骤的实体，如果这个serviceInterface是Function的话，刚好和SPRING CLOUD STREAM对接上。<br /><br />后续在spring.cloud.stream.function.definition加入此Bean的名称loadCheckerFunction，SPRING CLOUD STREAM就会帮你生成一个Input和Output&nbsp; MessageChannel，并连接上此Bean，再在BINDDING中分别对Input和Output&nbsp;MessageChannel加入对应的Destination Name1/Name2，即可收到BROKER推送关于此Destination的消息，也可以向BROKER发消息。<br /><br />application.yaml<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: #008000; ">#</span><span style="color: #008000; ">&nbsp;This&nbsp;setting&nbsp;can&nbsp;increase&nbsp;or&nbsp;decrease&nbsp;the&nbsp;rate&nbsp;of&nbsp;message&nbsp;production&nbsp;(1000&nbsp;=&nbsp;1s)<br />#&nbsp;spring.cloud.stream.poller.fixed-delay=1000<br /><br />#&nbsp;This&nbsp;setting&nbsp;can&nbsp;control&nbsp;which&nbsp;function&nbsp;method&nbsp;in&nbsp;our&nbsp;code&nbsp;will&nbsp;be&nbsp;triggered&nbsp;if&nbsp;there&nbsp;are&nbsp;multiple<br />#&nbsp;spring.cloud.function.definition=supplyLoan<br /><br />#&nbsp;Give&nbsp;the&nbsp;autogenerated&nbsp;binding&nbsp;a&nbsp;friendlier&nbsp;name</span><span style="color: #008000; "><br /></span>spring:<br />&nbsp;&nbsp;&nbsp;application:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name:&nbsp;loan-check-rabbit<br />&nbsp;&nbsp;&nbsp;banner:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location:&nbsp;classpath:/banner-rabbit.txt<br />&nbsp;&nbsp;&nbsp;cloud:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stream:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function.definition:&nbsp;loadCheckerFunction<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">BindingProperties</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bindings:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadCheckerFunction-in-<span style="color: #800000; ">0</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destination:&nbsp;queue.pretty.<span style="color: #0000FF; ">log</span>.messages<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;binder:&nbsp;local_rabbit<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loadCheckerFunction-out-<span style="color: #800000; ">0</span>:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;destination:&nbsp;queue.pretty.approved.messages<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;binder:&nbsp;local_rabbit<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">#</span><span style="color: #008000; ">BinderProperties</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;binders:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local_rabbit:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type:&nbsp;rabbit<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;environment:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;spring:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rabbitmq:<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;host:&nbsp;<span style="color: #800000; ">10.80</span>.<span style="color: #800000; ">27.69</span><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;port:&nbsp;<span style="color: #800000; ">5672</span><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;username:&nbsp;guest<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;password:&nbsp;guest<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;virtual-host:&nbsp;<span style="color: #0000FF; ">my</span>-virtual-host</div><br /><h2>Reference</h2><a href="https://spring.io/blog/2019/10/25/spring-cloud-stream-and-spring-integration" target="_blank">https://spring.io/blog/2019/10/25/spring-cloud-stream-and-spring-integration</a><img src ="http://www.blogjava.net/paulwong/aggbug/436035.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-11-10 15:10 <a href="http://www.blogjava.net/paulwong/archive/2021/11/10/436035.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING INTEGRATION - ENRICH</title><link>http://www.blogjava.net/paulwong/archive/2021/09/21/435976.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 21 Sep 2021 05:40:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/09/21/435976.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435976.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/09/21/435976.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435976.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435976.html</trackback:ping><description><![CDATA[enrich时可以发起一个子流程，取得结果后再设置回当前的对象中。<br /><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; ">package</span>&nbsp;org.springframework.integration.stackoverflow.enricher;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.List;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Map;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.function.Function;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.stream.Collectors;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.SpringApplication;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.autoconfigure.SpringBootApplication;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Bean;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.http.HttpMethod;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.IntegrationFlow;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.IntegrationFlows;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.Transformers;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.http.dsl.Http;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.client.RestTemplate;<br /><br />@SpringBootApplication<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;SpringIntegrationEnricherApplication&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SpringApplication.run(SpringIntegrationEnricherApplication.<span style="color: #0000FF; ">class</span>,&nbsp;args);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;jsonEnricherFlow(RestTemplate&nbsp;restTemplate)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IntegrationFlows.from(Function.<span style="color: #0000FF; ">class</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.transform(Transformers.fromJson(Map.<span style="color: #0000FF; ">class</span>))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.enrich((enricher)&nbsp;-&gt;&nbsp;enricher<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;.&lt;Map&lt;String,&nbsp;?&gt;&gt;requestPayload((message)&nbsp;-&gt;<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;((List&lt;?&gt;)&nbsp;message.getPayload().get("attributeIds"))<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.stream()<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(Object::toString)<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.joining(",")))<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;.requestSubFlow((subFlow)&nbsp;-&gt;<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;subFlow.handle(<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Http.outboundGateway("/attributes?id={ids}",&nbsp;restTemplate)<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.httpMethod(HttpMethod.GET)<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.expectedResponseType(Map.<span style="color: #0000FF; ">class</span>)<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.uriVariable("ids",&nbsp;"payload")))<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;.propertyExpression("attributes",&nbsp;"payload.attributes"))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&lt;Map&lt;String,&nbsp;?&gt;,&nbsp;Map&lt;String,&nbsp;?&gt;&gt;transform(<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;(payload)&nbsp;-&gt;&nbsp;{<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;payload.remove("attributeIds");<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;<span style="color: #0000FF; ">return</span>&nbsp;payload;<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;})<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.transform(Transformers.toJson())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br /><a href="https://stackoverflow.com/questions/58205432/spring-integration-enrich-transform-message-using-rest-call" target="_blank">https://stackoverflow.com/questions/58205432/spring-integration-enrich-transform-message-using-rest-call</a><br /><br /><a href="https://www.tabnine.com/web/assistant/code/rs/5c781b6ae70f87000197ab9f#L312" target="_blank">https://www.tabnine.com/web/assistant/code/rs/5c781b6ae70f87000197ab9f#L312</a><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435976.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-09-21 13:40 <a href="http://www.blogjava.net/paulwong/archive/2021/09/21/435976.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING INTEGRATION RETRY</title><link>http://www.blogjava.net/paulwong/archive/2021/08/23/435950.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 23 Aug 2021 05:01:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/08/23/435950.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435950.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/08/23/435950.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435950.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435950.html</trackback:ping><description><![CDATA[当使用httpOutBoundGateway时，有时会碰到网络抖动问题而出现连接异常，这时应该有个重试机制，如隔多少秒重试，重试多少次后放弃等。<br />
默认是重试3次，每次重试间隔是20秒。<br />
<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 />
-->@SpringBootApplication<br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;SpringIntegrationDslHttpRetryApplication&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@SuppressWarnings("unchecked")<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConfigurableApplicationContext&nbsp;applicationContext&nbsp;=<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SpringApplication.run(SpringIntegrationDslHttpRetryApplication.<span style="color: #0000FF; ">class</span>,&nbsp;args);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Function&lt;Object,&nbsp;Object&gt;&nbsp;function&nbsp;=&nbsp;applicationContext.getBean(Function.<span style="color: #0000FF; ">class</span>);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;function.apply("foo");<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;httpRetryFlow()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IntegrationFlows.from(Function.<span style="color: #0000FF; ">class</span>)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.handle(Http.outboundGateway("http://localhost:11111")<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;.httpMethod(HttpMethod.GET)<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;.expectedResponseType(String.<span style="color: #0000FF; ">class</span>),<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;e&nbsp;-&gt;&nbsp;e.advice(retryAdvice()))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;RequestHandlerRetryAdvice&nbsp;retryAdvice()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;RequestHandlerRetryAdvice();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</div>
<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 />
-->#打印日志<br />
logging.level.org.springframework.retry=debug</div>
<br />
Reference:<br />
<a href="https://docs.spring.io/spring-integration/reference/html/handler-advice.html#retry-advice" target="_blank">https://docs.spring.io/spring-integration/reference/html/handler-advice.html#retry-advice</a><br />
<a href="https://stackoverflow.com/questions/49784360/configure-error-handling-and-retry-for-http-outboundgateway-spring-dsl" target="_blank">https://stackoverflow.com/questions/49784360/configure-error-handling-and-retry-for-http-outboundgateway-spring-dsl<br />
</a><a href="https://stackoverflow.com/questions/50262862/requesthandlerretryadvice-with-httprequestexecutingmessagehandler-not-working" target="_blank">https://stackoverflow.com/questions/50262862/requesthandlerretryadvice-with-httprequestexecutingmessagehandler-not-working<br />
</a><a href="https://stackoverflow.com/questions/63689856/spring-integration-http-outbound-gateway-retry-based-on-reply-content" target="_blank">https://stackoverflow.com/questions/63689856/spring-integration-http-outbound-gateway-retry-based-on-reply-content<br /></a><a href="https://blog.csdn.net/cunfen8879/article/details/112552420" target="_blank">https://blog.csdn.net/cunfen8879/article/details/112552420</a><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435950.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-08-23 13:01 <a href="http://www.blogjava.net/paulwong/archive/2021/08/23/435950.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSR-303 Bean Validation</title><link>http://www.blogjava.net/paulwong/archive/2021/01/28/435786.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 28 Jan 2021 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/01/28/435786.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435786.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/01/28/435786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435786.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435786.html</trackback:ping><description><![CDATA[接收数据的JAVA BEAN通常需要验证其中字段的正确性，如不准为空，符合EMAIL格式等。<br /><div>JSR-303 Bean Validation则提供了这样的便捷。<br /><br />只要在JAVA BEAN中需要验证的字段加@NotNull这种标签，然后在SERVISE中的输入参数中加@Valid标签，则就激活验证流程。<br />也可以编程的方式自己验证：<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 />-->@MessageEndpoint<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">@Validated</span><span style="color: #008000; "><br /></span><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;MqMessageCcdValidator&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<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;Logger&nbsp;LOGGER&nbsp;=&nbsp;LoggerFactory.getLogger(MqMessageCcdValidator.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Validator&nbsp;validator;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@ServiceActivator<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;MqMessage&lt;CcdRequest&gt;&nbsp;validate(<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;@Valid&nbsp;</span><span style="color: #008000; ">*/</span>&nbsp;Message&lt;MqMessage&lt;CcdRequest&gt;&gt;&nbsp;requestMessage)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Set&lt;ConstraintViolation&lt;MqMessage&lt;CcdRequest&gt;&gt;&gt;&nbsp;set&nbsp;=&nbsp;validator.validate(requestMessage.getPayload());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(CollectionUtils.isNotEmpty(set))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CompositeException&nbsp;compositeException&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CompositeException();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set.forEach(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;constraintViolation&nbsp;-&gt;&nbsp;{<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.info("{}",&nbsp;constraintViolation);<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReqInfoValidationException&nbsp;exception&nbsp;=<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ReqInfoValidationException(constraintViolation.getMessage());<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;compositeException.addException(exception);<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;MessageHandlingException(requestMessage,&nbsp;compositeException);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<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;requestMessage.getPayload();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br />自定义验证规则<br />可用标签来做，以下为验证手机号的规则：<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;<span style="color: #0000FF; ">static</span>&nbsp;java.lang.annotation.RetentionPolicy.RUNTIME;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.lang.annotation.ElementType;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.lang.annotation.Retention;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.lang.annotation.Target;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;javax.validation.Constraint;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.validation.Payload;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.validation.ReportAsSingleViolation;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.validation.constraints.Pattern;<br /><br />@Retention(RUNTIME)<br />@Target(value&nbsp;=&nbsp;{&nbsp;ElementType.FIELD,&nbsp;ElementType.PARAMETER,&nbsp;ElementType.ANNOTATION_TYPE&nbsp;})<br />@Constraint(validatedBy&nbsp;=&nbsp;{})<br />@ReportAsSingleViolation<br />@Pattern(regexp&nbsp;=&nbsp;"^1[3-9]\\d{9}$")<br /><span style="color: #0000FF; ">public</span>&nbsp;@<span style="color: #0000FF; ">interface</span>&nbsp;ChinaPhone&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;message()&nbsp;<span style="color: #0000FF; ">default</span>&nbsp;"Invalid&nbsp;Chinese&nbsp;mobile&nbsp;No.";<br />&nbsp;&nbsp;&nbsp;&nbsp;Class&lt;?&gt;[]&nbsp;groups()&nbsp;<span style="color: #0000FF; ">default</span>&nbsp;{};<br />&nbsp;&nbsp;&nbsp;&nbsp;Class&lt;?&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;Payload&gt;[]&nbsp;payload()&nbsp;<span style="color: #0000FF; ">default</span>&nbsp;{};<br />}</div><br />如果比较复杂的验证规则，则参见：<br /><a href="https://reflectoring.io/bean-validation-with-spring-boot/#implementing-a-custom-validator" target="_blank">https://reflectoring.io/bean-validation-with-spring-boot/#implementing-a-custom-validator</a><br /><br />How to use Java Bean Validation in Spring Boot<br /><a href="https://nullbeans.com/how-to-use-java-bean-validation-in-spring-boot/" target="_blank">https://nullbeans.com/how-to-use-java-bean-validation-in-spring-boot/</a><br /><br />Complete Guide to Validation With Spring Boot<br /><a href="https://reflectoring.io/bean-validation-with-spring-boot/" target="_blank">https://reflectoring.io/bean-validation-with-spring-boot/</a><br /><br />Spring JMS Validate Messages using JSR-303 Bean Validation<br /><a href="https://memorynotfound.com/spring-jms-validate-messages-jsr-303-bean-validation/" target="_blank">https://memorynotfound.com/spring-jms-validate-messages-jsr-303-bean-validation/</a><br /><br />Spring REST Validation Example<br /><a href="https://mkyong.com/spring-boot/spring-rest-validation-example/" target="_blank">https://mkyong.com/spring-boot/spring-rest-validation-example/<br /><br /></a>Spring Boot 整合 Bean Validation 校验数据<br /><br /><a href="https://blog.csdn.net/wangzhihao1994/article/details/108403732" target="_blank">https://blog.csdn.net/wangzhihao1994/article/details/108403732</a></div><img src ="http://www.blogjava.net/paulwong/aggbug/435786.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-01-28 10:35 <a href="http://www.blogjava.net/paulwong/archive/2021/01/28/435786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING INTEGRATION SCATTERGATHER</title><link>http://www.blogjava.net/paulwong/archive/2021/01/28/435785.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 28 Jan 2021 02:11:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/01/28/435785.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435785.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/01/28/435785.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435785.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435785.html</trackback:ping><description><![CDATA[场景，餐厅：<br />
<ol>
     <li>食客下单，有饮品、食物、甜点<br />
     </li>
     <li>侍应接单，传送给厨房
     </li>
     <li>厨房分三个子流程处理，即饮品、食物、甜点子流程</li>
     <li>等待三个子流程处理完，合并成一份交付
     </li>
<li>如果厨房发现某食物欠缺，会通知侍应，展开错误处理，即通知食客更改食物，再交给厨房</li>
     <li>侍应将交付品传送给食客</li>
</ol>
有一个主流程、三个子流程和一个聚合流程，聚合流程会聚合三个子流程的产物，通知主流程，再往下走。<br />并且主流程会感知子流程的错误，并会交给相应错误处理流程处理，且将结果再交给聚合流程。<br /><br />对应SPRING INTEGRATION&nbsp;的SCATTERGATHER模式：<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 />-->@Bean<br /><span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;scatterGatherAndExecutorChannelSubFlow(TaskExecutor&nbsp;taskExecutor)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;f&nbsp;-&gt;&nbsp;f<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.scatterGather(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scatterer&nbsp;-&gt;&nbsp;scatterer<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;.applySequence(<span style="color: #0000FF; ">true</span>)<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;.recipientFlow(f1&nbsp;-&gt;&nbsp;f1.transform(p&nbsp;-&gt;&nbsp;"Sub-flow#1"))<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;.recipientFlow(f2&nbsp;-&gt;&nbsp;f2<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;&nbsp;&nbsp;&nbsp;&nbsp;.channel(c&nbsp;-&gt;&nbsp;c.executor(taskExecutor))<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;&nbsp;&nbsp;&nbsp;&nbsp;.transform(p&nbsp;-&gt;&nbsp;{<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;RuntimeException("Sub-flow#2");<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;&nbsp;&nbsp;&nbsp;&nbsp;})),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">null</span>,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;-&gt;&nbsp;s.errorChannel("scatterGatherErrorChannel"));<br />}<br /><br />@ServiceActivator(inputChannel&nbsp;=&nbsp;"scatterGatherErrorChannel")<br /><span style="color: #0000FF; ">public</span>&nbsp;Message&lt;?&gt;&nbsp;processAsyncScatterError(MessagingException&nbsp;payload)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;MessageBuilder.withPayload(payload.getCause().getCause())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.copyHeaders(payload.getFailedMessage().getHeaders())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.build();<br />}</div>
<br /><a href="https://github.com/adnanmamajiwala/spring-integration-sample/tree/master/dsl-scatter-gather/src/main/java/com/si/dsl/scattergather" target="_blank">https://github.com/adnanmamajiwala/spring-integration-sample/tree/master/dsl-scatter-gather/src/main/java/com/si/dsl/scattergather</a><br /><br /><a href="https://docs.spring.io/spring-integration/docs/5.1.x/reference/html/#scatter-gather" target="_blank">https://docs.spring.io/spring-integration/docs/5.1.x/reference/html/#scatter-gather</a><img src ="http://www.blogjava.net/paulwong/aggbug/435785.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-01-28 10:11 <a href="http://www.blogjava.net/paulwong/archive/2021/01/28/435785.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING INTEGRATION HEADER问题</title><link>http://www.blogjava.net/paulwong/archive/2020/10/20/435696.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 20 Oct 2020 06:56:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/10/20/435696.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435696.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/10/20/435696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435696.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435696.html</trackback:ping><description><![CDATA[当SPRING INTEGRATION的流程中从HTTP outboundGateway转成JmsGateway时，会报header的错误，这时就要把相关多余的header移除。<br />
<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 />
-->.headerFilter("Api-Key",&nbsp;"Content-Type",&nbsp;"X-Powered-By",&nbsp;"Content-Language",&nbsp;"Transfer-Encoding",&nbsp;"Cache-Control",&nbsp;"Keep-Alive",&nbsp;"Set-Cookie")</div>
<br /><a href="https://stackoverflow.com/questions/50608415/cwsia0112e-the-property-name-keep-alive-is-not-a-valid-java-identifier" target="_blank">https://stackoverflow.com/questions/50608415/cwsia0112e-the-property-name-keep-alive-is-not-a-valid-java-identifier</a><img src ="http://www.blogjava.net/paulwong/aggbug/435696.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-10-20 14:56 <a href="http://www.blogjava.net/paulwong/archive/2020/10/20/435696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Error handling in spring integration - How to get all the errors thrown in multiple threads and send them to the error-channel</title><link>http://www.blogjava.net/paulwong/archive/2020/10/15/435693.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 15 Oct 2020 11:21:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/10/15/435693.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435693.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/10/15/435693.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435693.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435693.html</trackback:ping><description><![CDATA[在SPRING INTEGRATION中，如果exception发生在各种thread里时，如何将exception返回到指定的channel，之后再绕回到aggrator-channel中。<br /><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 />-->@Bean<br /><span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;provisionUserFlow()&nbsp;{<br /><span style="color: #0000FF; ">return</span><br />&nbsp;&nbsp;&nbsp;&nbsp;IntegrationFlows.from("input.channel")<br />&nbsp;&nbsp;&nbsp;&nbsp;.publishSubscribeChannel(Executors.newCachedThreadPool(),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;-&gt;&nbsp;s.applySequence(<span style="color: #0000FF; ">true</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(f&nbsp;-&gt;&nbsp;f.enrichHeaders(e&nbsp;-&gt;&nbsp;e.header(MessageHeaders.ERROR_CHANNEL,&nbsp;"errorChannel",&nbsp;<span style="color: #0000FF; ">true</span>))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.handle(provisionerA,&nbsp;"provision")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.channel("aggregatorChannel")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subscribe(f&nbsp;-&gt;&nbsp;f.enrichHeaders(e&nbsp;-&gt;&nbsp;e.header(MessageHeaders.ERROR_CHANNEL,&nbsp;"errorChannel",&nbsp;<span style="color: #0000FF; ">true</span>))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.handle(provisionerB,&nbsp;"provision")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.channel("aggregatorChannel"))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />}<br /><br />@Bean<br /><span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;aggregateFlow()&nbsp;{<br />&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IntegrationFlows.from("aggregatorChannel")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.channel(&nbsp;aggregatorChannel)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.aggregate(&nbsp;a&nbsp;-&gt;&nbsp;a.processor(&nbsp;collect,&nbsp;"aggregatingMethod"))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />}<br /><br />@Transformer(&nbsp;inputChannel&nbsp;=&nbsp;"errorChannel",&nbsp;outputChannel&nbsp;=&nbsp;"aggregatorChannel")<br /><span style="color: #0000FF; ">public</span>&nbsp;Message&lt;?&gt;&nbsp;errorChannelHandler(ErrorMessage&nbsp;errorMessage)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;RuntimeException&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Message&lt;?&gt;&nbsp;failedMessage&nbsp;=&nbsp;&nbsp;((MessagingException)&nbsp;errorMessage.getPayload()).getFailedMessage();<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;Exception&nbsp;exception&nbsp;=&nbsp;(Exception)&nbsp;errorMessage.getPayload();<br /><br />&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;&nbsp;MessageBuilder.withPayload(&nbsp;exception.getMessage())<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.copyHeadersIfAbsent(&nbsp;failedMessage.getHeaders()&nbsp;)<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.build();<br />}</div><br /><br /><a href="https://stackoverflow.com/q/46495127/11790720" target="_blank">https://stackoverflow.com/q/46495127/11790720</a><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435693.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-10-15 19:21 <a href="http://www.blogjava.net/paulwong/archive/2020/10/15/435693.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING INTEGRATION子FLOW</title><link>http://www.blogjava.net/paulwong/archive/2020/10/15/435692.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 15 Oct 2020 03:29:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/10/15/435692.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435692.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/10/15/435692.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435692.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435692.html</trackback:ping><description><![CDATA[split-route-aggregate flow&nbsp;<br />
split之后，可以将message分给不同的子flow处理，配置如下：<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 />
-->@Bean<br />
<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;parallelSplitRouteAggregateFlow()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IntegrationFlows<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.from(Http.inboundGateway("/trigger"))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.handle((p,&nbsp;h)&nbsp;-&gt;&nbsp;Arrays.asList(1,&nbsp;2,&nbsp;3))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.split()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.channel(MessageChannels.executor(Executors.newCachedThreadPool()))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&lt;Integer,&nbsp;Boolean&gt;route(o&nbsp;-&gt;&nbsp;o&nbsp;%&nbsp;2&nbsp;==&nbsp;0,&nbsp;m&nbsp;-&gt;&nbsp;m<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subFlowMapping(<span style="color: #0000FF; ">true</span>,&nbsp;sf&nbsp;-&gt;&nbsp;sf.<span style="background-color: yellow;">gateway</span>(oddFlow()))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.subFlowMapping(<span style="color: #0000FF; ">false</span>,&nbsp;sf&nbsp;-&gt;&nbsp;sf.<span style="background-color: yellow;">gateway</span>(evenFlow())))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.aggregate()<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />
}<br />
<br />
@Bean<br />
<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;oddFlow()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;flow&nbsp;-&gt;&nbsp;flow.&lt;Integer&gt;handle((payload,&nbsp;headers)&nbsp;-&gt;&nbsp;"odd");<br />
}<br />
<br />
@Bean<br />
<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;evenFlow()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;flow&nbsp;-&gt;&nbsp;flow.&lt;Integer&gt;handle((payload,&nbsp;headers)&nbsp;-&gt;&nbsp;"even");<br />
}</div><br /><br /><a href="https://stackoverflow.com/questions/50121384/spring-integration-parallel-split-route-aggregate-flow-fails-due-to-one-way-mess" target="_blank">https://stackoverflow.com/questions/50121384/spring-integration-parallel-split-route-aggregate-flow-fails-due-to-one-way-mess</a><img src ="http://www.blogjava.net/paulwong/aggbug/435692.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-10-15 11:29 <a href="http://www.blogjava.net/paulwong/archive/2020/10/15/435692.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING INTEGRATION ERROR HANDLING</title><link>http://www.blogjava.net/paulwong/archive/2020/01/10/435027.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 10 Jan 2020 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/01/10/435027.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435027.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/01/10/435027.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435027.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435027.html</trackback:ping><description><![CDATA[<a href="https://github.com/zakyalvan/spring-integration-java-dsl-learn" target="_blank">https://github.com/zakyalvan/spring-integration-java-dsl-learn</a><br /><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; ">package</span>&nbsp;com.jwebs.learn.errorhandling;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Random;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;javax.jms.ConnectionFactory;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.annotation.Autowired;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.beans.factory.annotation.Qualifier;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.autoconfigure.SpringBootApplication;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.builder.SpringApplicationBuilder;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.ConfigurableApplicationContext;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Bean;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.annotation.IntegrationComponentScan;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.channel.PublishSubscribeChannel;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.core.MessageSource;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.IntegrationFlow;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.IntegrationFlows;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.core.Pollers;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.dsl.jms.Jms;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.integration.support.MessageBuilder;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.messaging.MessagingException;<br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;Show&nbsp;how&nbsp;to&nbsp;handle&nbsp;error&nbsp;in&nbsp;spring&nbsp;integration&nbsp;flow.<br />&nbsp;*&nbsp;Please&nbsp;note,&nbsp;errorChannel&nbsp;in&nbsp;spring&nbsp;integration&nbsp;only&nbsp;applicable&nbsp;to<br />&nbsp;*&nbsp;error&nbsp;thrown&nbsp;in&nbsp;asynch&nbsp;component.<br />&nbsp;*&nbsp;<br />&nbsp;*&nbsp;</span><span style="color: #808080; ">@author</span><span style="color: #008000; ">&nbsp;zakyalvan<br />&nbsp;</span><span style="color: #008000; ">*/</span><br />@SpringBootApplication<br />@IntegrationComponentScan<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ErrorHandlingApplication&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ConfigurableApplicationContext&nbsp;applicationContext&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SpringApplicationBuilder(ErrorHandlingApplication.<span style="color: #0000FF; ">class</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.web(<span style="color: #0000FF; ">false</span>)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.run(args);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Runtime.getRuntime().addShutdownHook(<span style="color: #0000FF; ">new</span>&nbsp;Thread(()&nbsp;-&gt;&nbsp;applicationContext.close()));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("Pres&nbsp;enter&nbsp;key&nbsp;to&nbsp;exit<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.in.read();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.exit(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;ConnectionFactory&nbsp;connectionFactory;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;MessageSource&lt;Integer&gt;&nbsp;randomIntegerMessageSource()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;()&nbsp;-&gt;&nbsp;MessageBuilder.withPayload(<span style="color: #0000FF; ">new</span>&nbsp;Random().nextInt()).build();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;withErrorFlow()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IntegrationFlows.from(randomIntegerMessageSource(),&nbsp;spec&nbsp;-&gt;&nbsp;spec.poller(Pollers.fixedDelay(1000)))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.handle(Jms.outboundGateway(connectionFactory)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.requestDestination("processor.input")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.replyContainer(spec&nbsp;-&gt;&nbsp;spec.sessionTransacted(<span style="color: #0000FF; ">true</span>)))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;@Qualifier("errorChannel")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;PublishSubscribeChannel&nbsp;errorChannel;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;errorHandlingFlow()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IntegrationFlows.from(errorChannel)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.handle(message&nbsp;-&gt;&nbsp;System.out.println("@@@@@@@@@@@@@@@@@@@@@"&nbsp;+&nbsp;((MessagingException)&nbsp;message.getPayload()).getFailedMessage().getPayload()))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><img src ="http://www.blogjava.net/paulwong/aggbug/435027.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-01-10 15:32 <a href="http://www.blogjava.net/paulwong/archive/2020/01/10/435027.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EIP in SPRING INTEGRATION</title><link>http://www.blogjava.net/paulwong/archive/2019/10/25/434882.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 25 Oct 2019 03:03:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/10/25/434882.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434882.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/10/25/434882.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434882.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434882.html</trackback:ping><description><![CDATA[<div>
<ul>
     <li>idempotent receiver</li>
</ul>
幂等型，同一个MESSAGE，如MESSAGE ID都一样，在MESSAGING系统中不管运行多少次，结果都一样，为啥？因为重复的MESSAGE，都被忽略了。<br />
方案：<br />
消息被处理后，从消息中取出ID，放入META-DATA-STORE中，后续处理消息时，要从META-DATA-STORE中检查是否有值。<br />
<br />
下面这个方案，ID的存储和判断是否重复消息都在一个INTERCEPTOR中搞定。<br />
<a href="https://stackoverflow.com/questions/50401460/spring-integration-dsl-configure-idempotent-receiver-to-identify-duplicates" target="_blank">https://stackoverflow.com/questions/50401460/spring-integration-dsl-configure-idempotent-receiver-to-identify-duplicates</a><br />
<a href="https://www.javacodegeeks.com/2015/09/monitoring-and-management.html" target="_blank">https://www.javacodegeeks.com/2015/09/monitoring-and-management.html<br />
<br />
<br />
</a></div>claim-check<br />将MESSAGE的PAYLOAD存在STORE中，返回一个ID，这个ID即claim-check，如果需要取MESSAGE的DETAIl时，可从STORE中取出MESSAGE。<br /><a href="https://github.com/spring-projects/spring-integration/blob/master/src/reference/asciidoc/claim-check.adoc" target="_blank">https://github.com/spring-projects/spring-integration/blob/master/src/reference/asciidoc/claim-check.adoc</a><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/434882.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-25 11:03 <a href="http://www.blogjava.net/paulwong/archive/2019/10/25/434882.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING INTEGRATION LESSONS</title><link>http://www.blogjava.net/paulwong/archive/2019/10/25/434881.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 25 Oct 2019 01:45:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/10/25/434881.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434881.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/10/25/434881.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434881.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434881.html</trackback:ping><description><![CDATA[<h2>Lessons</h2><h3><a href="https://www.javacodegeeks.com/2015/09/introduction-to-enterprise-application-integration.html" style="padding: 0px; margin: 0px; outline: none; list-style: none; border: 0px none; color: #326693; text-decoration-line: none; transition: all 0.2s ease-in-out 0s; vertical-align: baseline;">Introduction to Enterprise Application Integration</a></h3><p style="padding: 0px 0px 1em; margin: 0px; outline: none; list-style: none; border: 0px none; vertical-align: baseline; color: #333333; font-family: Tahoma, Arial, Verdana, sans-serif; font-size: 15px; background-color: #ffffff;">In our first lesson, you will get introduced to the concepts of Enterprise Application Integration. You will learn about the and Enterprise integration patterns that can be applied to simplify integration between different platforms and the Integration strategies that can be followed for this purpose. Finally, we will discuss how and why to implement a Message driven architecture and how to achieve both Synchronous and asynchronous communication among nodes.</p><h3><a href="https://www.javacodegeeks.com/2015/09/spring-integration-fundamentals.html" style="padding: 0px; margin: 0px; outline: none; list-style: none; border: 0px none; color: #326693; text-decoration-line: none; transition: all 0.2s ease-in-out 0s; vertical-align: baseline;">Spring Integration Fundamentals</a></h3><p style="padding: 0px 0px 1em; margin: 0px; outline: none; list-style: none; border: 0px none; vertical-align: baseline; color: #333333; font-family: Tahoma, Arial, Verdana, sans-serif; font-size: 15px; background-color: #ffffff;">In this lesson, you will get to understand how Spring Integration works under the hood. The core concepts of Spring Integration messaging system (like message channels and endpoints) will be introduced. Additionally, the components that build the framework will be discussed, including the channel adapters, transformers, filters, routers etc. Finally, the two distinct methods of communication (synchronous and asynchronous) are explained and the lesson ends with a discussion on error handling.</p><h3><a href="https://www.javacodegeeks.com/2015/09/spring-integration-and-web-services.html" style="padding: 0px; margin: 0px; outline: none; list-style: none; border: 0px none; color: #326693; text-decoration-line: none; transition: all 0.2s ease-in-out 0s; vertical-align: baseline;">Spring Integration and Web Services</a></h3><p style="padding: 0px 0px 1em; margin: 0px; outline: none; list-style: none; border: 0px none; vertical-align: baseline; color: #333333; font-family: Tahoma, Arial, Verdana, sans-serif; font-size: 15px; background-color: #ffffff;">In this lesson, we will focus on the integration with external web services. Spring Integration comes with the necessary functionality (adapters, channels etc.) to support web services out of the box. A full example is built from scratch in order to better understand the topic.</p><h3><a href="https://www.javacodegeeks.com/2015/09/enterprise-messaging.html" style="padding: 0px; margin: 0px; outline: none; list-style: none; border: 0px none; color: #326693; text-decoration-line: none; transition: all 0.2s ease-in-out 0s; vertical-align: baseline;">Enterprise Messaging</a></h3><p style="padding: 0px 0px 1em; margin: 0px; outline: none; list-style: none; border: 0px none; vertical-align: baseline; color: #333333; font-family: Tahoma, Arial, Verdana, sans-serif; font-size: 15px; background-color: #ffffff;">In this lesson, we will focus on integrating our application with JMS messaging. For this purpose, we will use Active MQ, which will be our broker. We will show examples of sending and receiving JMS messages by using the Spring Integration JMS channel adapters. Following these examples, we will see some ways of customizing these invocations by configuring message conversion and destination resolution.</p><h3><a href="https://www.javacodegeeks.com/2015/09/spring-integration-full-example.html" style="padding: 0px; margin: 0px; outline: none; list-style: none; border: 0px none; color: #326693; text-decoration-line: none; transition: all 0.2s ease-in-out 0s; vertical-align: baseline;">Spring Integration Full Example</a></h3><p style="padding: 0px 0px 1em; margin: 0px; outline: none; list-style: none; border: 0px none; vertical-align: baseline; color: #333333; font-family: Tahoma, Arial, Verdana, sans-serif; font-size: 15px; background-color: #ffffff;">In this lesson, we will wrap everything up by providing a complete application that uses several of the components provided by Spring Integration in order to provide a service to its users. We will discuss the system architecture, the actual implementation and the relevant error handling.</p><h3><a href="https://www.javacodegeeks.com/2015/09/monitoring-and-management.html" style="padding: 0px; margin: 0px; outline: none; list-style: none; border: 0px none; color: #326693; text-decoration-line: none; transition: all 0.2s ease-in-out 0s; vertical-align: baseline;">Monitoring and Management</a></h3><p style="padding: 0px 0px 1em; margin: 0px; outline: none; list-style: none; border: 0px none; vertical-align: baseline; color: #333333; font-family: Tahoma, Arial, Verdana, sans-serif; font-size: 15px; background-color: #ffffff;">In this lesson, we will examine different mechanisms of monitoring or gathering more information about what is going on within the messaging system. Some of these mechanisms consist of managing or monitoring the application through MBeans, which are part of the JMX specification. Another mechanism discussed in this chapter is how we will implement the EIP idempotent receiver pattern using a metadata store. Finally, the last mechanism described is the control bus. This will let us send messages that will invoke operations on components in the application context.</p><img src ="http://www.blogjava.net/paulwong/aggbug/434881.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-25 09:45 <a href="http://www.blogjava.net/paulwong/archive/2019/10/25/434881.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING INTEGRATION DSL DEMO</title><link>http://www.blogjava.net/paulwong/archive/2019/10/23/434878.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 23 Oct 2019 03:55:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/10/23/434878.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434878.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/10/23/434878.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434878.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434878.html</trackback:ping><description><![CDATA[<a href="https://github.com/spring-projects/spring-integration/tree/master/src/reference/asciidoc" target="_blank">https://github.com/spring-projects/spring-integration/tree/master/src/reference/asciidoc</a><img src ="http://www.blogjava.net/paulwong/aggbug/434878.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-23 11:55 <a href="http://www.blogjava.net/paulwong/archive/2019/10/23/434878.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Integration 中文手册 - GOOD</title><link>http://www.blogjava.net/paulwong/archive/2019/10/11/434799.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 11 Oct 2019 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/10/11/434799.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434799.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/10/11/434799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434799.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434799.html</trackback:ping><description><![CDATA[<a href="https://my.oschina.net/yumg/blog/387701" target="_blank" style="box-sizing: inherit; background-color: #ffffff; color: rgba(0, 0, 0, 0.85); text-decoration-line: none; cursor: pointer; line-height: 1.5em; display: inline-block; margin: -0.21425em 0px 0px; font-family: &quot;PingFang SC&quot;, &quot;Helvetica Neue&quot;, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, &quot;Noto Sans CJK SC&quot;, Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif; font-weight: 700; transition: color 0.1s ease 0s; font-size: 1.28571em;">Spring Integration 中文手册 (1)</a><br />
<br />
<br /><a href="https://my.oschina.net/yumg/blog/390486" target="_blank" style="box-sizing: inherit; background-color: #ffffff; color: rgba(0, 0, 0, 0.85); text-decoration-line: none; cursor: pointer; line-height: 1.5em; display: inline-block; margin: -0.21425em 0px 0px; font-family: &quot;PingFang SC&quot;, &quot;Helvetica Neue&quot;, &quot;Microsoft YaHei UI&quot;, &quot;Microsoft YaHei&quot;, &quot;Noto Sans CJK SC&quot;, Sathu, EucrosiaUPC, Arial, Helvetica, sans-serif; font-weight: 700; transition: color 0.1s ease 0s; font-size: 1.28571em;">Spring Integration 中文手册 (2)</a><img src ="http://www.blogjava.net/paulwong/aggbug/434799.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-11 10:28 <a href="http://www.blogjava.net/paulwong/archive/2019/10/11/434799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在SPRING INTEGRATION中手动开始和停止JMS LISTENER</title><link>http://www.blogjava.net/paulwong/archive/2019/10/09/434781.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 09 Oct 2019 09:16:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/10/09/434781.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434781.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/10/09/434781.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434781.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434781.html</trackback:ping><description><![CDATA[如果要对JMS BROKER生产和消费MESSAGE，一种方式是用JmsTemplate发送和消费消息，另一种方式是SPRING INTEGRATION。<br /><br />SPRING INTEGRATION是实现了EIP模式的一种框架，即使用CHANNEL和JMS-INBOUND-ADAPTER、JMS-OUTBOUND-ADAPTER，完全脱离了JmsTemplate的API。<br /><br />如果需要实现这种场景：从BROKER取一条消息，处理消息，且处理途中不要再从BROKER再取消息，处理完后再取消息，再处理。<br /><br />这样要求手动开始和停止JMS LISTENER，即手动开始和停止JMS-INBOUND-ADAPTER、JMS-OUTBOUND-ADAPTER。<br /><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 />-->@Bean<br />@InboundChannelAdapter(value&nbsp;=&nbsp;"loaderResponseChannel")<br /><span style="color: #0000FF; ">public</span>&nbsp;MessageSource&nbsp;loaderResponseSource()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Jms<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.inboundAdapter(oracleConnectionFactory())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.configureJmsTemplate(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;-&gt;&nbsp;t.deliveryPersistent(<span style="color: #0000FF; ">true</span>)<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;.jmsMessageConverter(jacksonJmsMessageConverter())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;).destination(jmsInbound).get();<br />}</div><br />当使用@InboundChannelAdapter时，会自动注册一个SourcePollingChannelAdapter ，但这个名字比较长：configrationName.loaderResponseSource.inboundChannelAdapter。<br /><br />呼叫这个实例的start()和stop()方法即可。<br /><br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Bean<br /><span style="color: #0000FF; ">public</span>&nbsp;IntegrationFlow&nbsp;controlBusFlow()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;IntegrationFlows.from("controlBus")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.controlBus()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get();<br />}<br /><br />Message&nbsp;operation&nbsp;=&nbsp;MessageBuilder.withPayload("@configrationName.loaderResponseSource.inboundChannelAdapter.start()").build();<br />operationChannel.send(operation)</div><br /><a href="https://stackoverflow.com/questions/45632469/shutdown-spring-integration-with-jms-inboundadapter" target="_blank">https://stackoverflow.com/questions/45632469/shutdown-spring-integration-with-jms-inboundadapter</a><br /><br /><a href="https://docs.spring.io/spring-integration/docs/5.0.7.RELEASE/reference/html/system-management-chapter.html#control-bus" target="_blank">https://docs.spring.io/spring-integration/docs/5.0.7.RELEASE/reference/html/system-management-chapter.html#control-bus</a><br /><br /><a href="https://github.com/spring-projects/spring-integration-java-dsl/blob/master/src/test/java/org/springframework/integration/dsl/test/jms/JmsTests.java" target="_blank">https://github.com/spring-projects/spring-integration-java-dsl/blob/master/src/test/java/org/springframework/integration/dsl/test/jms/JmsTests.java</a><br /><br /><a href="https://stackoverflow.com/questions/50428552/how-to-stop-or-suspend-polling-after-batch-job-fail" target="_blank">https://stackoverflow.com/questions/50428552/how-to-stop-or-suspend-polling-after-batch-job-fail</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/434781.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-09 17:16 <a href="http://www.blogjava.net/paulwong/archive/2019/10/09/434781.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Enterprise Integration Patterns</title><link>http://www.blogjava.net/paulwong/archive/2019/07/18/434231.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 18 Jul 2019 06:11:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/07/18/434231.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434231.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/07/18/434231.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434231.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434231.html</trackback:ping><description><![CDATA[<h2>Why Enterprise Integration Patterns?</h2>
<p style="font-family: &quot;Times New Roman&quot;, Times, serif; font-size: medium; color: #333333; background-color: #ffffff;"><iframe src="http://rcm-na.amazon-adsystem.com/e/cm?t=enterpriseint-20&amp;o=1&amp;p=8&amp;l=as1&amp;asins=0321200683&amp;fc1=000000&amp;IS2=1&amp;lt1=_blank&amp;lc1=0000FF&amp;bc1=000000&amp;bg1=FFFFFF&amp;f=ifr" align="left" scrolling="no" marginwidth="0" marginheight="0" frameborder="0" style="width: 120px; height: 260px; padding-right: 11px;"></iframe>Enterprise integration is too complex to be solved with a simple 'cookbook' approach. Instead, patterns can provide guidance by documenting the kind of experience that usually lives only in architects' heads: they are accepted solutions to recurring problems within a given context. Patterns are abstract enough to apply to most integration technologies, but specific enough to provide hands-on guidance to designers and architects. Patterns also provide a vocabulary for developers to efficiently describe their solution.</p>
<p style="font-family: &quot;Times New Roman&quot;, Times, serif; font-size: medium; color: #333333; background-color: #ffffff;">Patterns are not 'invented'; they are harvested from repeated use in practice. If you have built integration solutions, it is likely that you have used some of these patterns, maybe in slight variations and maybe calling them by a different name. The purpose of this site is not to "invent" new approaches, but to present a coherent collection of relevant and proven patterns, which in total form an integration pattern language.</p>
<p style="font-family: &quot;Times New Roman&quot;, Times, serif; font-size: medium; color: #333333; background-color: #ffffff;">Despite the 700+ pages, our book covers only a fraction of patterns (and the problems to be solved) in the integration space. The current patterns focus on&nbsp;<a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/Messaging.html"><em>Messaging</em></a>, which forms the basis of most other integration patterns. We have started to&nbsp;<a href="https://www.enterpriseintegrationpatterns.com/ramblings/72_eipvolumes.html">harvest more patterns</a>&nbsp;but are realizing (once again) how much work documenting these patterns really is. So please stay tuned.</p>
<h2>Messaging Patterns</h2>
<p style="font-family: &quot;Times New Roman&quot;, Times, serif; font-size: medium; color: #333333; background-color: #ffffff;">We have documented&nbsp;<a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/toc.html">65 messaging patterns</a>, organized as follows:</p>
<div style="font-family: &quot;Microsoft YaHei&quot;; font-size: medium; background-color: #ffffff; position: relative; clear: left;">
<div style="position: absolute; background-color: #cccccc; font-family: Arial; font-size: 12px; font-weight: bold; padding-top: 1px; padding-bottom: 1px; left: 94px; top: 1px; width: 132px; height: 17px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageConstructionIntro.html" style="display: block; width: 132px; height: 17px; text-decoration-line: none; padding-left: 3px; padding-right: 3px; padding-top: 3px; box-sizing: border-box; text-align: center; line-height: 11.4px; color: black;">Message Construct.</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 95px; top: 23px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/Message.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Message</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 95px; top: 36px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/CommandMessage.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Command Message</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 95px; top: 49px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/DocumentMessage.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Document Message</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 95px; top: 62px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/EventMessage.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Event Message</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 95px; top: 75px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/RequestReply.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Request-Reply</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 95px; top: 87px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/ReturnAddress.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Return Address</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 95px; top: 100px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/CorrelationIdentifier.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Correlation Identifier</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 95px; top: 114px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageSequence.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Message Sequence</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 95px; top: 128px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageExpiration.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Message Expiration</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 95px; top: 142px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/FormatIndicator.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Format Indicator</a></div>
<div style="position: absolute; background-color: #cccccc; font-family: Arial; font-size: 12px; font-weight: bold; padding-top: 1px; padding-bottom: 1px; left: 259px; top: 43px; width: 280px; height: 17px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageRoutingIntro.html" style="display: block; width: 280px; height: 17px; text-decoration-line: none; padding-left: 3px; padding-right: 3px; padding-top: 3px; box-sizing: border-box; text-align: center; line-height: 11.4px; color: black;">Message Routing</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 260px; top: 65px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/PipesAndFilters.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Pipes-and-Filters</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 260px; top: 78px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageRouter.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Message Router</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 260px; top: 91px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/ContentBasedRouter.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Content-based Router</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 260px; top: 104px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/Filter.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Message Filter</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 260px; top: 117px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/DynamicRouter.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Dynamic Router</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 260px; top: 131px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/RecipientList.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Recipient List</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 260px; top: 144px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/Sequencer.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Splitter</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 393px; top: 65px; width: 138px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/Aggregator.html" style="display: block; height: 12px; width: 138px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Aggregator</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 393px; top: 78px; width: 138px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/Resequencer.html" style="display: block; height: 12px; width: 138px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Resequencer</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 393px; top: 91px; width: 138px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/DistributionAggregate.html" style="display: block; height: 12px; width: 138px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Composed Msg. Processor</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 393px; top: 104px; width: 138px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/BroadcastAggregate.html" style="display: block; height: 12px; width: 138px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Scatter-Gather</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 393px; top: 117px; width: 138px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/RoutingTable.html" style="display: block; height: 12px; width: 138px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Routing Slip</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 393px; top: 131px; width: 138px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/ProcessManager.html" style="display: block; height: 12px; width: 138px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Process Manager</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 393px; top: 144px; width: 138px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageBroker.html" style="display: block; height: 12px; width: 138px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Message Broker</a></div>
<div style="position: absolute; background-color: #cccccc; font-family: Arial; font-size: 12px; font-weight: bold; padding-top: 1px; padding-bottom: 1px; left: 573px; top: 32px; width: 132px; height: 29px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageTransformationIntro.html" style="display: block; width: 132px; height: 29px; text-decoration-line: none; padding-left: 3px; padding-right: 3px; padding-top: 3px; box-sizing: border-box; text-align: center; line-height: 11.4px; color: black;">Message<br />
Transformation</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 574px; top: 66px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageTranslator.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Message Translator</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 574px; top: 79px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/EnvelopeWrapper.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Envelope Wrapper</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 574px; top: 92px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/DataEnricher.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Content Enricher</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 574px; top: 105px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/ContentFilter.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Content Filter</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 574px; top: 118px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/StoreInLibrary.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Claim Check</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 574px; top: 131px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/Normalizer.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Normalizer</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 574px; top: 144px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/CanonicalDataModel.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Canonical Data Model</a></div>
<div style="position: absolute; background-color: #cccccc; font-family: Arial; font-size: 12px; font-weight: bold; padding-top: 1px; padding-bottom: 1px; left: 3px; top: 292px; width: 262px; height: 16px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessagingEndpointsIntro.html" style="display: block; width: 262px; height: 16px; text-decoration-line: none; padding-left: 3px; padding-right: 3px; padding-top: 3px; box-sizing: border-box; text-align: center; line-height: 11.4px; color: black;">Messaging Endpoints</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 4px; top: 313px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageEndpoint.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Message Endpoint</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 4px; top: 326px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessagingGateway.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Messaging Gateway</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 4px; top: 339px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessagingMapper.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Messaging Mapper</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 4px; top: 353px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/TransactionalClient.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Transactional Client</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 4px; top: 367px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/PollingConsumer.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Polling Consumer</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 4px; top: 380px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/EventDrivenConsumer.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Event-driven Consumer</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 137px; top: 313px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/CompetingConsumers.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Competing Consumers</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 137px; top: 326px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageDispatcher.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Message Dispatcher</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 137px; top: 339px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageSelector.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Selective Consumer</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 137px; top: 353px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/DurableSubscription.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Durable Subscriber</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 137px; top: 367px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/IdempotentReceiver.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Idempotent Receiver</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 137px; top: 380px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessagingAdapter.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Service Activator</a></div>
<div style="position: absolute; background-color: #cccccc; font-family: Arial; font-size: 12px; font-weight: bold; padding-top: 1px; padding-bottom: 1px; left: 290px; top: 292px; width: 132px; height: 17px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessagingChannelsIntro.html" style="display: block; width: 132px; height: 17px; text-decoration-line: none; padding-left: 3px; padding-right: 3px; padding-top: 3px; box-sizing: border-box; text-align: center; line-height: 11.4px; color: black;">Messaging Channels</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 291px; top: 312px; width: 127px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageChannel.html" style="display: block; height: 12px; width: 127px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Message Channel</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 291px; top: 325px; width: 127px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/PointToPointChannel.html" style="display: block; height: 12px; width: 127px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Point-to-Point Channel</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 291px; top: 338px; width: 127px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/PublishSubscribeChannel.html" style="display: block; height: 12px; width: 127px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Publish-Subscr. Channel</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 291px; top: 351px; width: 127px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/DatatypeChannel.html" style="display: block; height: 12px; width: 127px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Datatype Channel</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 291px; top: 364px; width: 127px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/InvalidMessageChannel.html" style="display: block; height: 12px; width: 127px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Invalid Message Channel</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 291px; top: 377px; width: 127px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/DeadLetterChannel.html" style="display: block; height: 12px; width: 127px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Dead Letter Channel</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 291px; top: 390px; width: 127px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/GuaranteedMessaging.html" style="display: block; height: 12px; width: 127px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Guaranteed Delivery</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 291px; top: 403px; width: 127px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/ChannelAdapter.html" style="display: block; height: 12px; width: 127px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Channel Adapter</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 291px; top: 416px; width: 127px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessagingBridge.html" style="display: block; height: 12px; width: 127px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Messaging Bridge</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 291px; top: 429px; width: 127px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageBus.html" style="display: block; height: 12px; width: 127px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Message Bus</a></div>
<div style="position: absolute; background-color: #cccccc; font-family: Arial; font-size: 12px; font-weight: bold; padding-top: 1px; padding-bottom: 1px; left: 546px; top: 292px; width: 132px; height: 17px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/SystemManagementIntro.html" style="display: block; width: 132px; height: 17px; text-decoration-line: none; padding-left: 3px; padding-right: 3px; padding-top: 3px; box-sizing: border-box; text-align: center; line-height: 11.4px; color: black;">Systems Mgmt.</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 547px; top: 312px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/ControlBus.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Control Bus</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 547px; top: 325px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/Detour.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Detour</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 547px; top: 338px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/WireTap.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Wire Tap</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 547px; top: 351px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageHistory.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Message History</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 547px; top: 364px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/MessageStore.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Message Store</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 547px; top: 377px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/SmartProxy.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Smart Proxy</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 547px; top: 390px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/TestMessage.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Test Message</a></div>
<div style="position: absolute; font-family: Arial; font-size: 11px; padding-bottom: 2px; padding-left: 1px; left: 547px; top: 404px; width: 125px;"><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/ChannelPurger.html" style="display: block; height: 12px; width: 125px; text-decoration-line: none; padding-left: 1px; box-sizing: border-box; color: blue;">Channel Purger</a></div>
<img src="https://www.enterpriseintegrationpatterns.com/img/inside_back_cover.png" width="750" height="450" border="0" alt="" /></div><br /><br /><a href="https://www.enterpriseintegrationpatterns.com/patterns/messaging/index.html" target="_blank">https://www.enterpriseintegrationpatterns.com/patterns/messaging/index.html</a><img src ="http://www.blogjava.net/paulwong/aggbug/434231.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-18 14:11 <a href="http://www.blogjava.net/paulwong/archive/2019/07/18/434231.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING BATCH &amp; SPRING INTEGRATION TUTORIAL</title><link>http://www.blogjava.net/paulwong/archive/2019/07/18/434230.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 18 Jul 2019 05:21:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/07/18/434230.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434230.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/07/18/434230.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434230.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434230.html</trackback:ping><description><![CDATA[<div style="box-sizing: border-box; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, Arial, sans-serif; font-size: 22px; background-color: #ffffff;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;">
<h2><a href="https://codenotfound.com/spring-jms-integration-gateway-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS Integration Gateway Example</a>&nbsp;12 minute read</h2>
<p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to connect to a JMS broker using a Spring Integration Gateway and Spring Boot.</p>
</article></div>
<div style="box-sizing: border-box; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, Arial, sans-serif; font-size: 22px; background-color: #ffffff;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;">
<h2><a href="https://codenotfound.com/spring-jms-artemis-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS Artemis Example</a>&nbsp;6 minute read</h2>
<p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to connect to Apache ActiveMQ Artemis using Spring JMS and Spring Boot.</p>
</article></div>
<div style="box-sizing: border-box; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, Arial, sans-serif; font-size: 22px; background-color: #ffffff;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;">
<h2><a href="https://codenotfound.com/spring-jms-topic-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS Topic Example</a>&nbsp;5 minute read</h2>
<p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to publish/subscribe to a JMS topic using Spring JMS and Spring Boot.</p>
</article></div>
<div style="box-sizing: border-box; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, Arial, sans-serif; font-size: 22px; background-color: #ffffff;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;">
<h2><a href="https://codenotfound.com/spring-jms-integration-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS Integration Example</a>12 minute read</h2>
<p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to connect to an ActiveMQ JMS broker using Spring Integration and Spring Boot.</p>
</article></div>
<div style="box-sizing: border-box; color: #333333; font-family: -apple-system, BlinkMacSystemFont, Roboto, &quot;Segoe UI&quot;, &quot;Helvetica Neue&quot;, &quot;Lucida Grande&quot;, Arial, sans-serif; font-size: 22px; background-color: #ffffff;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;">
<h2><a href="https://codenotfound.com/spring-jms-listener-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS Listener Example</a>&nbsp;7 minute read</h2>
<p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how a Spring JMS listener works in combination with Spring Boot.<br /><br /></p><div class="list__item" style="box-sizing: border-box;"><article class="archive__item" itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;"><h2 class="archive__item-title" itemprop="headline" style="box-sizing: border-box; color: #222222; margin: 0.5em 0px 0.25em; line-height: initial; font-size: 1.25em; transition: all 0.2s ease-in-out 0s; overflow: hidden; text-overflow: ellipsis;"><a href="https://codenotfound.com/spring-jms-jmstemplate-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS JmsTemplate Example</a>&nbsp;<span style="color: #7a7a7a; font-size: 0.6em; orphans: 3; widows: 3;">7 minute read</span></h2><p class="archive__item-excerpt" itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to use JmsTemplate in combination with Spring JMS and Spring Boot.</p></article></div><p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;"></p><div style="box-sizing: border-box;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;"><h2><a href="https://codenotfound.com/spring-jms-message-selector-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS Message Selector Example</a>&nbsp;5 minute read</h2><p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to implement a message selector using Spring JMS and Spring Boot.</p></article></div><div style="box-sizing: border-box;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;"><h2><a href="https://codenotfound.com/spring-jms-message-converter-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring JMS Message Converter Example</a>5 minute read</h2><p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to implement a message converter using Spring JMS and Spring Boot.</p><div><h2><a href="https://codenotfound.com/spring-batch-admin-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring Batch Admin Example</a>&nbsp;11 minute read</h2><p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to use a Spring Boot admin UI to manage Spring Batch jobs.<br /><br /></p><div class="list__item" style="box-sizing: border-box;"><article class="archive__item" itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;"><h2 class="archive__item-title" itemprop="headline" style="box-sizing: border-box; color: #222222; margin: 0.5em 0px 0.25em; line-height: initial; font-size: 1.25em; transition: all 0.2s ease-in-out 0s; overflow: hidden; text-overflow: ellipsis;"><a href="https://codenotfound.com/spring-batch-tasklet-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s;" target="_blank">Spring Batch Tasklet Example</a>&nbsp;<span style="color: #7a7a7a; font-size: 0.6em; orphans: 3; widows: 3;">7 minute read</span></h2><p class="archive__item-excerpt" itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to implement a Spring Batch Tasklet using Spring Boot.</p></article></div><p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;"></p><div style="box-sizing: border-box;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;"><h2><a href="https://codenotfound.com/spring-batch-example.html" rel="permalink" style="box-sizing: border-box; color: #1976d2; transition: all 0.2s ease-in-out 0s; outline: 0px;" target="_blank">Spring Batch Example</a>&nbsp;11 minute read</h2><p itemprop="description" style="box-sizing: border-box; margin-bottom: 1.3em; orphans: 3; widows: 3; transition: all 0.2s ease-in-out 0s; margin-top: 0px; font-size: 0.75em;">A detailed step-by-step tutorial on how to implement a Hello World Spring Batch job using Spring Boot.</p><div></div></article></div><div style="box-sizing: border-box;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;"></article></div></div></article></div><div style="box-sizing: border-box;"><article itemscope="" itemtype="https://schema.org/CreativeWork" style="box-sizing: border-box; position: relative;"></article></div></article></div><img src ="http://www.blogjava.net/paulwong/aggbug/434230.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-18 13:21 <a href="http://www.blogjava.net/paulwong/archive/2019/07/18/434230.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Integration Java DSL</title><link>http://www.blogjava.net/paulwong/archive/2019/07/18/434229.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 18 Jul 2019 05:16:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/07/18/434229.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434229.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/07/18/434229.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434229.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434229.html</trackback:ping><description><![CDATA[<p style="margin: 12px 0px 0px; padding: 0px; overflow-wrap: break-word; color: #172b4d; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; background-color: #ffffff;">This time I decided to play a little bit with&nbsp;<a data-is-external-link="true" href="https://docs.spring.io/spring-integration/reference/html/java-dsl.html" rel="nofollow" style="color: #0052cc; text-decoration-line: none;">Spring Integration Java DSL</a>. Which has been merged directly into&nbsp;<a data-is-external-link="true" href="https://docs.spring.io/spring-integration/reference/html/whats-new.html" rel="nofollow" style="color: #0052cc; text-decoration-line: none;">Spring Integration Core 5.0</a>, which is smart and obvious move because:</p><ul style="margin: 12px 0px 0px; padding: 0px 0px 0px 40px; color: #172b4d; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; background-color: #ffffff;"><li style="overflow-wrap: break-word;">Everyone starting the new Spring projects based on Java Config uses that</li><li style="margin-top: 4px; overflow-wrap: break-word;">SI Java DSL enables you to use new powerfull Java 8 features like Lambdas</li><li style="margin-top: 4px; overflow-wrap: break-word;">You can build your flow using the&nbsp;<a data-is-external-link="true" href="https://en.wikipedia.org/wiki/Builder_pattern" rel="nofollow" style="color: #0052cc; text-decoration-line: none;">Builder pattern</a>&nbsp;based on&nbsp;<a data-is-external-link="true" href="https://docs.spring.io/autorepo/docs/spring-integration-java-dsl/1.1.0.M2/api/org/springframework/integration/dsl/IntegrationFlowBuilder.html" rel="nofollow" style="color: #0052cc; text-decoration-line: none;">IntegrationFlowBuilder</a></li></ul><p style="margin: 12px 0px 0px; padding: 0px; overflow-wrap: break-word; color: #172b4d; font-family: -apple-system, BlinkMacSystemFont, &quot;Segoe UI&quot;, Roboto, Oxygen, Ubuntu, &quot;Fira Sans&quot;, &quot;Droid Sans&quot;, &quot;Helvetica Neue&quot;, sans-serif; background-color: #ffffff;">Let's take a look on the samples howto use that based on ActiveMQ JMS.<br /><br /><br /><a href="https://bitbucket.org/tomask79/spring-integration-java-dsl/src/master/" target="_blank">https://bitbucket.org/tomask79/spring-integration-java-dsl/src/master/</a></p><img src ="http://www.blogjava.net/paulwong/aggbug/434229.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-18 13:16 <a href="http://www.blogjava.net/paulwong/archive/2019/07/18/434229.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Message Processing With Spring Integration</title><link>http://www.blogjava.net/paulwong/archive/2019/06/05/433840.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 05 Jun 2019 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/06/05/433840.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/433840.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/06/05/433840.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/433840.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/433840.html</trackback:ping><description><![CDATA[Full demo<a href="https://dzone.com/articles/message-processing-spring" target="_blank"><br />https://dzone.com/articles/message-processing-spring<br /><br /></a><img src ="http://www.blogjava.net/paulwong/aggbug/433840.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-05 11:08 <a href="http://www.blogjava.net/paulwong/archive/2019/06/05/433840.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring integration 基本概念</title><link>http://www.blogjava.net/paulwong/archive/2019/06/05/433839.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 05 Jun 2019 02:36:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/06/05/433839.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/433839.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/06/05/433839.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/433839.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/433839.html</trackback:ping><description><![CDATA[<div>
<div>
<p>1.spring integration 's architecture</p>
<p>主要提供两个功能：</p>
<p>在系统内提供实现轻量级、事件驱动交互行为的框架</p>
<p>在系统间提供一种基于适配器的平台，以支持灵活的系统间交互</p>
<div>
<div style="max-width: 700px; max-height: 405px;">
<div style="padding-bottom: 53.78%;"><img src="http://upload-images.jianshu.io/upload_images/5891170-a8da58eebd72a239.png" alt="" /></div>
<div image-view-maintain"="" data-width="753" data-height="405"><img data-original-src="//upload-images.jianshu.io/upload_images/5891170-a8da58eebd72a239.png" data-original-width="753" data-original-height="405" data-original-format="image/png" data-original-filesize="49286" style="cursor: zoom-in;" alt="" /></div>
</div>
<div></div>
</div>
<p>2.spring integration对于企业集成模式的支持</p>
<p>2.1Message：一个信息的单元，通常有消息头（header）和消息内容（payload）组成</p>
<p>2.2Message channel：消息处理节点之间的连接，负责将Message从生产者传输到消费者。</p>
<p>&nbsp; &nbsp; 根据消费者的多少，可分为point to point和publish-subscribe两种</p>
<p><br />
</p>
<div>
<div style="max-width: 292px; max-height: 150px;">
<div style="padding-bottom: 51.370000000000005%;"></div>
<div image-view-maintain"="" data-width="292" data-height="150"><img data-original-src="//upload-images.jianshu.io/upload_images/5891170-607d0c2793809c34.png" data-original-width="292" data-original-height="150" data-original-format="image/png" data-original-filesize="13423" style="cursor: zoom-in;" alt="" /></div>
</div>
<div></div>
</div>
<div>
<div style="max-width: 344px; max-height: 176px;">
<div style="padding-bottom: 51.160000000000004%;"></div>
<div image-view-maintain"="" data-width="344" data-height="176"><img data-original-src="//upload-images.jianshu.io/upload_images/5891170-f2195ab401051398.png" data-original-width="344" data-original-height="176" data-original-format="image/png" data-original-filesize="19049" style="cursor: zoom-in;" alt="" /></div>
</div>
<div></div>
</div>
<p>&nbsp; &nbsp; 根据消息传输方式的不同，分为同步和异步两种</p>
<p>2.3Message Endpoint：消息处理节点，消息从节点进入通道，也是从节点离开通道</p>
<p>几个常见的Message EndPoint：</p>
<p>CHANNEL ADAPTER，用于连接该适配器的特点是单向消息流的，要么是消息通过该适配器进入通道，要么是消息通过该适配器离开通道<br />
</p>
<p><br />
</p>
<div>
<div style="max-width: 700px; max-height: 172px;">
<div style="padding-bottom: 22.45%;"></div>
<div image-view-maintain"="" data-width="766" data-height="172"><img data-original-src="//upload-images.jianshu.io/upload_images/5891170-b79a1b981aae1950.png" data-original-width="766" data-original-height="172" data-original-format="image/png" data-original-filesize="27106" style="cursor: zoom-in;" alt="" /></div>
</div>
<div></div>
</div>
<p>MESSAGING GATEWAY，处理的消息流和Channel Adapter不同，不是单向的，即有进入该节点的消息，也会从该节点发出消息。<br />
</p>
<p><br />
</p>
<div>
<div style="max-width: 700px; max-height: 154px;">
<div style="padding-bottom: 19.82%;"></div>
<div image-view-maintain"="" data-width="777" data-height="154"><img data-original-src="//upload-images.jianshu.io/upload_images/5891170-af9a87c4a3449f42.png" data-original-width="777" data-original-height="154" data-original-format="image/png" data-original-filesize="30318" style="cursor: zoom-in;" alt="" /></div>
</div>
<div></div>
</div>
<p><br />
</p>
<div>
<div style="max-width: 700px; max-height: 202px;">
<div style="padding-bottom: 26.900000000000002%;"></div>
<div image-view-maintain"="" data-width="751" data-height="202"><img data-original-src="//upload-images.jianshu.io/upload_images/5891170-017d10305b0c84bd.png" data-original-width="751" data-original-height="202" data-original-format="image/png" data-original-filesize="40194" style="cursor: zoom-in;" alt="" /></div>
</div>
<div></div>
</div>
<p>SERVICE ACTIVATOR，该节点调用服务来处理输入的消息，并将服务返回的数据发送到输出通道。在spring integration中，调用的方法被限定为本地方法调用。<br />
</p>
<p><br />
</p>
<div>
<div style="max-width: 657px; max-height: 214px;">
<div style="padding-bottom: 32.57%;"></div>
<div image-view-maintain"="" data-width="657" data-height="214"><img data-original-src="//upload-images.jianshu.io/upload_images/5891170-ed27794f62a0ac01.png" data-original-width="657" data-original-height="214" data-original-format="image/png" data-original-filesize="23786" style="cursor: zoom-in;" alt="" /></div>
</div>
<div></div>
</div>
<p>ROUTER，路由器，将输入的消息路由到某个输出通道中</p>
<p><br />
</p>
<div>
<div style="max-width: 383px; max-height: 171px;">
<div style="padding-bottom: 44.65%;"></div>
<div image-view-maintain"="" data-width="383" data-height="171"><img data-original-src="//upload-images.jianshu.io/upload_images/5891170-4ce407d4637b1d34.png" data-original-width="383" data-original-height="171" data-original-format="image/png" data-original-filesize="16068" style="cursor: zoom-in;" alt="" /></div>
</div>
<div></div>
</div>
<p>SPLITTER，将输入的消息拆分成子消息<br />
</p>
<p><br />
</p>
<div>
<div style="max-width: 351px; max-height: 173px;">
<div style="padding-bottom: 49.29%;"></div>
<div image-view-maintain"="" data-width="351" data-height="173"><img data-original-src="//upload-images.jianshu.io/upload_images/5891170-2fdf0b84ce29806c.png" data-original-width="351" data-original-height="173" data-original-format="image/png" data-original-filesize="22464" style="cursor: zoom-in;" alt="" /></div>
</div>
<div></div>
</div>
<p>AGGREGATOR，将输入的多个消息合并为一个消息<br />
</p>
<p><br />
</p>
<div>
<div style="max-width: 374px; max-height: 158px;">
<div style="padding-bottom: 42.25%;"></div>
<div image-view-maintain"="" data-width="374" data-height="158"><img data-original-src="//upload-images.jianshu.io/upload_images/5891170-0565e1605859f390.png" data-original-width="374" data-original-height="158" data-original-format="image/png" data-original-filesize="24493" style="cursor: zoom-in;" alt="" /></div>
</div>
<div></div>
</div>
<p>3.观看书中例子hello-world思考</p>
<p>测试gateway时，下面代码向通道names内放入消息world？</p>
<p><br />
</p>
<div>
<div style="max-width: 612px; max-height: 198px;">
<div style="padding-bottom: 32.35%;"></div>
<div image-view-maintain"="" data-width="612" data-height="198"><img data-original-src="//upload-images.jianshu.io/upload_images/5891170-a19edabc3830557b.png" data-original-width="612" data-original-height="198" data-original-format="image/png" data-original-filesize="18667" style="cursor: zoom-in;" alt="" /></div>
</div>
<div></div>
</div>
<div>
<div style="max-width: 471px; max-height: 59px;">
<div style="padding-bottom: 12.53%;"></div>
<div image-view-maintain"="" data-width="471" data-height="59"><img data-original-src="//upload-images.jianshu.io/upload_images/5891170-0cdb740224551ad1.png" data-original-width="471" data-original-height="59" data-original-format="image/png" data-original-filesize="7568" style="cursor: zoom-in;" alt="" /></div>
</div>
<div></div>
</div>
<p>然后service-activator从names通道中获得消息world，调用方法sayHello返回值到给gateway？</p>
<p>解释：gateway有一个service－interface的属性，这个属性指向一个interface。当我们用一个接口声明一个gateway时，spring integration会自动帮我们生成该接口的代理类，这样当我们往gateway发送消息时，spring integration会通过代理类把消息转发到default－request－channel中去</p>
</div>
<br />
<br />
作者：马国标<br />
链接：https://www.jianshu.com/p/bf1643539f99<br />
来源：简书<br />
简书著作权归作者所有，任何形式的转载都请联系作者获得授权并注明出处。</div><img src ="http://www.blogjava.net/paulwong/aggbug/433839.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-05 10:36 <a href="http://www.blogjava.net/paulwong/archive/2019/06/05/433839.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何在SPRING INTEGRATION中使用事务</title><link>http://www.blogjava.net/paulwong/archive/2019/06/04/433836.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 04 Jun 2019 06:19:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/06/04/433836.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/433836.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/06/04/433836.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/433836.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/433836.html</trackback:ping><description><![CDATA[<div>File Polling using the Spring Integration DSL</div>
<a href="http://porterhead.blogspot.com/2016/07/file-polling-using-spring-integration.html" target="_blank">http://porterhead.blogspot.com/2016/07/file-polling-using-spring-integration.html</a>
<br /><a href="https://github.com/iainporter/spring-file-poller" target="_blank"><br />https://github.com/iainporter/spring-file-poller</a><br /><br /><br />Transaction Support in Spring Integration<br /><a href="https://www.baeldung.com/spring-integration-transaction" target="_blank">https://www.baeldung.com/spring-integration-transaction</a><img src ="http://www.blogjava.net/paulwong/aggbug/433836.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-04 14:19 <a href="http://www.blogjava.net/paulwong/archive/2019/06/04/433836.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用JAMES实现自己的邮件服务器</title><link>http://www.blogjava.net/paulwong/archive/2012/12/16/393057.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 16 Dec 2012 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/12/16/393057.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/393057.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/12/16/393057.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/393057.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/393057.html</trackback:ping><description><![CDATA[应用服务器Apache企业应用XMLC <br />
简介<br />
James 是一个企业级的邮件服务器，它完全实现了smtp 和 pops 以及nntp 协议。同时，james服务器又是一个邮件应用程序平台。James的核心是Mailet API,而james 服务齐是一个mailet的容器。它可以让你非常容易的实现出很强大的邮件应用程序。James开源项目被广泛的应用于与邮件有关的项目中。你可以通过它来搭建自己的邮件服务器。我们可以利用Mailet API,编程接口来实现自己所需的业务。James集成了Avalon 应用程序框架以及Phoenix Avalon 框架容器。Phoenix为james 服务器提供了强大的支持。需要说明的是Avalon开源项目目前已经关闭。<br />
快速上手<br />
安装james<br />
我这次使用的安装包是james 2.3.1。大家可以从这里下载到http://james.apache.org/download.cgi<br />
现在让我们开始我们激动人心的james之旅。首先我们将james-binary-2.3.1.zip解压缩下载到你的安装目录。我们可以把这个过程理解为安装的过程。我在这里将它解压到c:\.并且把它改名为james.这样我们的james就安装好了。目录为C:\james。很简单吧！<br />
<br />
准备知识 － 学习一些必要的知识<br />
在我使用james的时候让我感觉首先理解james的应用程序结构是很重要的。否则你会在使用中感到很困惑。<br />
它的应用程序结构是这样的：<br />
James<br />
|_ _apps<br />
|_ _bin<br />
|_ _conf<br />
|_ _ext<br />
|_ _lib<br />
|_ _logs<br />
|_ _tools<br />
我们重点介绍一下两个文件夹bin 和 apps.<br />
bin目录中的run.bat和run.sh是James的启动程序。只要记住这个重要文件就可以。<br />
启动之后控制台显示如下：<br />
Using PHOENIX_HOME:   C:\james<br />
Using PHOENIX_TMPDIR: C:\james\temp<br />
Using JAVA_HOME:      C:\j2sdk1.4.2_02<br />
Phoenix 4.2<br />
James Mail Server 2.3.1<br />
Remote Manager Service started plain:4555<br />
POP3 Service started plain:110<br />
SMTP Service started plain:25<br />
NNTP Service started plain:119<br />
FetchMail Disabled<br />
Apps 目录下有个james的子目录这个目录是它的核心。<br />
james<br />
|_ _SAR-INF<br />
|_ _conf<br />
|_ _logs<br />
|_ _var<br />
|_mail<br />
|_address-error<br />
|_error<br />
|_indexes<br />
|_outgoing<br />
|_relay-denied<br />
|_spam<br />
|_spool<br />
|_nntp<br />
|_....<br />
&#8230;<br />
|_users<br />
SAR-INF 下有一个config.xml是james中的核心配置文件。<br />
Logs 包含了与james有关的Log。调试全靠它了。<br />
Var 包含了一些文件夹通过它们的名字我们大概也能猜测出它们的用途。Mail主要用于存储邮件。nntp主要用于新闻服务器。Users用于存储所有邮件服务器的用户。也就是邮件地址前面的东东。如：pig@sina.com的pig就是所谓用用户。<br />
<br />
创建用户：<br />
我们在James上建若干用户，用来测试收发邮件。当然如果你不用james本身的用户也可以。James以telnet 的方式提供了接口用来添加用户。下面我来演示一下。<br />
首先使用telnet来连接james的remote manager .<br />
1.telnet localhost 4555 回车<br />
2.然后输入管理员用户名和密码（user/pwd ： root/root 是默认设置这个可以在config.xml中修改）<br />
JAMES Remote Administration Tool 2.3.1<br />
Please enter your login and password<br />
Login id:<br />
root<br />
Password:<br />
root<br />
Welcome root. HELP for a list of commands<br />
<br />
3.添加用户<br />
adduser kakaxi kakaxi<br />
User kakaxi added<br />
<br />
Adduser mingren mingren<br />
User mingren added<br />
<br />
4.查看添加情况<br />
listusers<br />
Existing accounts 2<br />
user: mingren<br />
user: kakaxi<br />
得到上面的信息说明我们已经添加成功。<br />
<br />
<br />
发送器<br />
这个类主要用来测试我们的邮件服务器，可以不用将其打入包中。<br />
java 代码&nbsp;<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; ">package</span>&nbsp;com.paul.jamesstudy;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Date;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Properties;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.mail.Authenticator;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.mail.Message;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.mail.PasswordAuthentication;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.mail.Session;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.mail.Transport;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.mail.internet.InternetAddress;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.mail.internet.MimeMessage;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Mail&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;mailServer,&nbsp;From,&nbsp;To,&nbsp;mailSubject,&nbsp;MailContent;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;username,&nbsp;password;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Session&nbsp;mailSession;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Properties&nbsp;prop;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Message&nbsp;message;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Authenticator&nbsp;auth;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">认证&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Mail()&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置邮件相关&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;username&nbsp;=&nbsp;"kakaxi";&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password&nbsp;=&nbsp;"kakaxi";&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailServer&nbsp;=&nbsp;"localhost";&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;From&nbsp;=&nbsp;"kakaxi@localhost";&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;To&nbsp;=&nbsp;"mingren@localhost";&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailSubject&nbsp;=&nbsp;"Hello&nbsp;Scientist";&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MailContent&nbsp;=&nbsp;"How&nbsp;are&nbsp;you&nbsp;today!";&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;send(){&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EmailAuthenticator&nbsp;mailauth&nbsp;=&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">new</span>&nbsp;EmailAuthenticator(username,&nbsp;password);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置邮件服务器&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prop&nbsp;=&nbsp;System.getProperties();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prop.put("mail.smtp.auth",&nbsp;"true");&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;prop.put("mail.smtp.host",&nbsp;mailServer);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;产生新的Session服务&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mailSession&nbsp;=&nbsp;mailSession.getDefaultInstance(prop,&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Authenticator)&nbsp;mailauth);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;MimeMessage(mailSession);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setFrom(<span style="color: #0000FF; ">new</span>&nbsp;InternetAddress(From));&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置发件人&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setRecipient(Message.RecipientType.TO,&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">new</span>&nbsp;InternetAddress(To));<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置收件人&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setSubject(mailSubject);<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置主题&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setContent(MailContent,&nbsp;"text/plain");<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置内容&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;message.setSentDate(<span style="color: #0000FF; ">new</span>&nbsp;Date());<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;设置日期&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Transport&nbsp;tran&nbsp;=&nbsp;mailSession.getTransport("smtp");&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tran.connect(mailServer,&nbsp;username,&nbsp;password);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tran.send(message,&nbsp;message.getAllRecipients());&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tran.close();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mail&nbsp;mail;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mail&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Mail();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("sending");&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mail.send();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("finished!");&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br /><span style="color: #0000FF; ">class</span>&nbsp;EmailAuthenticator&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;Authenticator&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;m_username&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;m_userpass&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setUsername(String&nbsp;username)&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_username&nbsp;=&nbsp;username;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setUserpass(String&nbsp;userpass)&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_userpass&nbsp;=&nbsp;userpass;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;EmailAuthenticator(String&nbsp;username,&nbsp;String&nbsp;userpass)&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">super</span>();&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setUsername(username);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setUserpass(userpass);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;PasswordAuthentication&nbsp;getPasswordAuthentication()&nbsp;{&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;PasswordAuthentication(m_username,&nbsp;m_userpass);&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;<br />} &nbsp;&nbsp;</div>
<div><br /><br />
</div><img src ="http://www.blogjava.net/paulwong/aggbug/393057.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-12-16 13:14 <a href="http://www.blogjava.net/paulwong/archive/2012/12/16/393057.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SRING INTEGRATION + BATCH</title><link>http://www.blogjava.net/paulwong/archive/2012/10/21/389968.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 21 Oct 2012 09:23:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/10/21/389968.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/389968.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/10/21/389968.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/389968.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/389968.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 场景：由SPRING INTEGRATION每10秒监控数据库中的POLL表，如果有符合条件的记录，则启动JDBC JOB，此JOB要做的也是和数据库交互的动作，如用JDBCITEMREADER读取数据库记录，用JDBCITEMWRITER写记录进数据库 。SPRING INTEGRATION与SPRING BATCH JOB交互的点是JOBPARAMETERS，即以KEY-V...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2012/10/21/389968.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/389968.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-10-21 17:23 <a href="http://www.blogjava.net/paulwong/archive/2012/10/21/389968.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>spring integration同步数据库数据</title><link>http://www.blogjava.net/paulwong/archive/2012/10/17/389716.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 17 Oct 2012 03:50:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/10/17/389716.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/389716.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/10/17/389716.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/389716.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/389716.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 需求为：当客户已有系统的数据被同步到我方数据库后，若再有新数据，只同步新数据到我方数据库。解决：因为客户的业务表是不能变动的，我方在客户数据库中新建一状态表，记录哪些数据被更新过。当客户业务表有新数据插入时，用触发器将新数据id插入到状态表。为方便实例：业务表pp，状态表status结构为：pp： Code highlighting produced by Actipro CodeHighli...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2012/10/17/389716.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/389716.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-10-17 11:50 <a href="http://www.blogjava.net/paulwong/archive/2012/10/17/389716.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING INTEGRATION + SPRING BATCH</title><link>http://www.blogjava.net/paulwong/archive/2012/10/16/389625.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 15 Oct 2012 16:11:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/10/16/389625.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/389625.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/10/16/389625.html#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/389625.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/389625.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: SPRING INTEGRATION的强项是事件驱动，但捕获之后，要做的事是触发一个类的方法，对于要处理大数据量的文件，就没有办法了，如读取1w条记录，然后插入数据库。而这个正是SPRING BATCH的强项所在，因此有必要将此两个框架整合起来用。场景：盯着一个文件夹，如果一有文件，此文件可能非常大的，则启动一个BATCH JOB来处理。文件拉取器，监控文件夹一有新...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2012/10/16/389625.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/389625.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-10-16 00:11 <a href="http://www.blogjava.net/paulwong/archive/2012/10/16/389625.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING INTERGRATION资源</title><link>http://www.blogjava.net/paulwong/archive/2012/06/11/380483.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 11 Jun 2012 02:07:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/06/11/380483.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/380483.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/06/11/380483.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/380483.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/380483.html</trackback:ping><description><![CDATA[<a target="_blank" href="http://wangleifire.iteye.com/blog/351749"> http://wangleifire.iteye.com/blog/351749</a>
<div><br />
</div>
<div><a href="https://src.springframework.org/svn/spring-integration/trunk " target="_blank">https://src.springframework.org/svn/spring-integration/trunk </a><br />
</div>
<img src ="http://www.blogjava.net/paulwong/aggbug/380483.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-11 10:07 <a href="http://www.blogjava.net/paulwong/archive/2012/06/11/380483.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING INTERGRATION</title><link>http://www.blogjava.net/paulwong/archive/2012/06/11/380482.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 11 Jun 2012 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2012/06/11/380482.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/380482.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2012/06/11/380482.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/380482.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/380482.html</trackback:ping><description><![CDATA[<div>将处理业务的流程拆分成一个一个链，前面处理完，再派给下一个，类似HTTP中的FILTER<br />不用安装服务器，内嵌在SPRING容器中，对外支持多种格式的数据，外部系统如要和SPRING INTERGRATION整合，不需要再进行开发<br />处理流程一般就是，ADAPTER去读取外部数据，转换后放到CHANNEL中，ENDPOINT处理CHANNEL中的数据，委派给下一个CHANNEL，下一个ENDPOINT处理，通过ADAPTER写到外部接口中。<br /><br /><ol><li>ADAPTER<br />外部系统与CHANNEL之间的桥梁，获取外部数据将其放到CHANNEL去，有FTP，JMS，文件系统的<br /><br /></li><li><div>CHANNEL</div>里面放MESSAGE对象，MESSAGE里面可以放自定义对象，以提供消费者使用<br /><br /></li><li><div>ENDPOINT</div>CHANNEL的消费者，CHANNEL与ENDPOINT是一对一的关系，所以如果想在一个CHANNE下对应多个ENDPOINT，是做不到的，只能增加CHANNEL<br /><br />Service Activators：从INPUT CHANNEL中取出一个对象作为参数，调用设置的POJO的方法，将结果放到OUTPUT CHANNEL中<br />Transformers：对CHANNEL中的对象进行类型转换<br />决定流向的ENDPOINT：Routers，SPLITER<br /><br /></li><li>例子<br /></li></ol><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: #FF00FF; ">xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"</span><span style="color: #0000FF; ">?&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">beans:beans&nbsp;</span><span style="color: #FF0000; ">xmlns</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/integration"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:xsi</span><span style="color: #0000FF; ">="http://www.w3.org/2001/XMLSchema-instance"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:beans</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xmlns:stream</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/integration/stream"</span><span style="color: #FF0000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;xsi:schemaLocation</span><span style="color: #0000FF; ">="http://www.springframework.org/schema/beans<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/beans/spring-beans.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/integration<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/integration/spring-integration.xsd<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/integration/stream<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http://www.springframework.org/schema/integration/stream/spring-integration-stream.xsd"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">gateway&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="cafe"</span><span style="color: #FF0000; ">&nbsp;service-interface</span><span style="color: #0000FF; ">="org.springframework.integration.samples.cafe.Cafe"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">channel&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="orders"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;此处orders里面的对象是一个一个Message，调用payload则取到Order<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;调用items则得到OrderItem&nbsp;List，拆分成OrderItem以一个为单位放到<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drinks中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">--&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">splitter&nbsp;</span><span style="color: #FF0000; ">input-channel</span><span style="color: #0000FF; ">="orders"</span><span style="color: #FF0000; ">&nbsp;expression</span><span style="color: #0000FF; ">="payload.items"</span><span style="color: #FF0000; ">&nbsp;output-channel</span><span style="color: #0000FF; ">="drinks"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">channel&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="drinks"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;此处drinks里面的对象是一个一个OrderItem，调用iced则取到布尔值<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;如果是true则放到coldDrinks中，如是false则放到hotDrinks中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">--&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">router&nbsp;</span><span style="color: #FF0000; ">input-channel</span><span style="color: #0000FF; ">="drinks"</span><span style="color: #FF0000; ">&nbsp;&nbsp;expression</span><span style="color: #0000FF; ">="payload.iced&nbsp;?&nbsp;'coldDrinks'&nbsp;:&nbsp;'hotDrinks'"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">channel&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="coldDrinks"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">queue&nbsp;</span><span style="color: #FF0000; ">capacity</span><span style="color: #0000FF; ">="10"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">channel</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">service-activator&nbsp;</span><span style="color: #FF0000; ">input-channel</span><span style="color: #0000FF; ">="coldDrinks"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="barista"</span><span style="color: #FF0000; ">&nbsp;method</span><span style="color: #0000FF; ">="prepareColdDrink"</span><span style="color: #FF0000; ">&nbsp;output-channel</span><span style="color: #0000FF; ">="preparedDrinks"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">channel&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="hotDrinks"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">queue&nbsp;</span><span style="color: #FF0000; ">capacity</span><span style="color: #0000FF; ">="10"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">channel</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;将输入通道中的OrderItem转成Drink&nbsp;</span><span style="color: #008000; ">--&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">service-activator&nbsp;</span><span style="color: #FF0000; ">input-channel</span><span style="color: #0000FF; ">="hotDrinks"</span><span style="color: #FF0000; ">&nbsp;ref</span><span style="color: #0000FF; ">="barista"</span><span style="color: #FF0000; ">&nbsp;method</span><span style="color: #0000FF; ">="prepareHotDrink"</span><span style="color: #FF0000; ">&nbsp;output-channel</span><span style="color: #0000FF; ">="preparedDrinks"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">channel&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="preparedDrinks"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">&nbsp;将通道中的Drink按一个Order进行合并成一个List&lt;Order&gt;</span><span style="color: #008000; ">--&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">aggregator&nbsp;</span><span style="color: #FF0000; ">input-channel</span><span style="color: #0000FF; ">="preparedDrinks"</span><span style="color: #FF0000; ">&nbsp;&nbsp;method</span><span style="color: #0000FF; ">="prepareDelivery"</span><span style="color: #FF0000; ">&nbsp;output-channel</span><span style="color: #0000FF; ">="deliveries"</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">beans:bean&nbsp;</span><span style="color: #FF0000; ">class</span><span style="color: #0000FF; ">="org.springframework.integration.samples.cafe.xml.Waiter"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">aggregator</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">stream:stdout-channel-adapter&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="deliveries"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">beans:bean&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="barista"</span><span style="color: #FF0000; ">&nbsp;class</span><span style="color: #0000FF; ">="org.springframework.integration.samples.cafe.xml.Barista"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">poller&nbsp;</span><span style="color: #FF0000; ">id</span><span style="color: #0000FF; ">="poller"</span><span style="color: #FF0000; ">&nbsp;default</span><span style="color: #0000FF; ">="true"</span><span style="color: #FF0000; ">&nbsp;fixed-delay</span><span style="color: #0000FF; ">="1000"</span><span style="color: #0000FF; ">/&gt;</span><span style="color: #000000; "><br /><br /></span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">beans:beans</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span></div></div><img src ="http://www.blogjava.net/paulwong/aggbug/380482.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-11 10:04 <a href="http://www.blogjava.net/paulwong/archive/2012/06/11/380482.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>