﻿<?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 BOOT</title><link>http://www.blogjava.net/paulwong/category/55117.html</link><description /><language>zh-cn</language><lastBuildDate>Tue, 18 Oct 2022 10:16:40 GMT</lastBuildDate><pubDate>Tue, 18 Oct 2022 10:16:40 GMT</pubDate><ttl>60</ttl><item><title>MONGODB SPRING DISTINCT</title><link>http://www.blogjava.net/paulwong/archive/2022/10/18/450835.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 18 Oct 2022 02:22:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2022/10/18/450835.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/450835.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2022/10/18/450835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/450835.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/450835.html</trackback:ping><description><![CDATA[SPRING 框架下 如果要做去重，在数据量大的时候会爆ERROR，可改用如下 写法：<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 />-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;needReorderCheck(String&nbsp;requestId)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;result&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try(MongoCursor&lt;String&gt;&nbsp;mongoCursor&nbsp;=&nbsp;<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;mongoTemplate.getCollection(mongoTemplate.getCollectionName(AccountNumProductLineIndex.class))<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;.distinct(KEY,&nbsp;Filters.eq(REQUEST_ID,&nbsp;requestId),&nbsp;String.class)<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;.iterator()<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;)</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>(MongoCursor&lt;Document&gt;&nbsp;mongoCursor&nbsp;=&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mongoTemplate.getCollection(mongoTemplate.getCollectionName(AccountNumProductLineIndex.<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;.aggregate(<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;Arrays.asList(<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;Aggregates.project(<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;Projections.fields(<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Projections.excludeId(),<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Projections.include(KEY),<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Projections.include(REQUEST_ID)<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;&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;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Aggregates.match(Filters.eq(REQUEST_ID,&nbsp;requestId)),<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;Aggregates.group("$"&nbsp;+&nbsp;KEY)<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;)<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;)<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;.allowDiskUse(<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;&nbsp;.iterator();<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;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">boolean</span>&nbsp;breakMe&nbsp;=&nbsp;<span style="color: #0000FF; ">false</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.info("needReorderCheck.key&nbsp;--&gt;&nbsp;start");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>(mongoCursor.hasNext())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(breakMe)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mongoCursor.close();<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; ">break</span>;<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;&nbsp;&nbsp;&nbsp;Document&nbsp;keyDocument&nbsp;=&nbsp;mongoCursor.next();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;key&nbsp;=&nbsp;keyDocument.getString("_id");<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;key&nbsp;=&nbsp;mongoCursor.next().getString(KEY);<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;LOGGER.info("needReorderCheck.keyDocument&nbsp;--&gt;&nbsp;{},&nbsp;key&nbsp;--&gt;&nbsp;{}",&nbsp;keyDocument,&nbsp;key);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>(MongoCursor&lt;Document&gt;&nbsp;indexMongoCursor&nbsp;=&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;mongoTemplate.getCollection(AccountNumProductLineIndex.COLLECTION_NAME)<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;.find(Filters.and(Filters.eq(REQUEST_ID,&nbsp;requestId),&nbsp;Filters.eq(KEY,&nbsp;key)))<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;.iterator()<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;&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; ">int</span>&nbsp;preIndex&nbsp;=&nbsp;-1,&nbsp;currentIndex&nbsp;=&nbsp;-1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;preIndexDocument&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>,&nbsp;currentIndexDocument;<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; ">while</span>(indexMongoCursor.hasNext())&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;currentIndexDocument&nbsp;=&nbsp;indexMongoCursor.next();<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;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(currentIndexDocument.toJson());</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;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(preIndexDocument&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&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;currentIndex&nbsp;=&nbsp;currentIndexDocument.getInteger(INDEX);<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;preIndex&nbsp;=&nbsp;preIndexDocument.getInteger(INDEX);<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;<span style="color: #0000FF; ">if</span>(currentIndex&nbsp;-&nbsp;preIndex&nbsp;&gt;&nbsp;1)&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;indexMongoCursor.close();<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;breakMe&nbsp;=&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;=&nbsp;<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;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">break</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;}<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;preIndexDocument&nbsp;=&nbsp;currentIndexDocument;<br />&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;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&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;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><br /><img src ="http://www.blogjava.net/paulwong/aggbug/450835.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-10-18 10:22 <a href="http://www.blogjava.net/paulwong/archive/2022/10/18/450835.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING JSON TIMEZONE问题大汇总</title><link>http://www.blogjava.net/paulwong/archive/2022/09/22/450823.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 22 Sep 2022 05:18:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2022/09/22/450823.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/450823.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2022/09/22/450823.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/450823.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/450823.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@JsonFormat(shape=JsonFormat.Shape.STRING,&nbsp;pattern="yyyy-MM-dd'T'HH:mm:ss.SSSZ",&nbsp;timezone="America/Phoenix")<br /><span style="color: #0000FF; ">private</span>&nbsp;Date&nbsp;date;</div><br /><img src ="http://www.blogjava.net/paulwong/aggbug/450823.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-09-22 13:18 <a href="http://www.blogjava.net/paulwong/archive/2022/09/22/450823.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Downloading Large Files using Spring WebClient</title><link>http://www.blogjava.net/paulwong/archive/2022/09/22/450822.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 22 Sep 2022 05:14:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2022/09/22/450822.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/450822.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2022/09/22/450822.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/450822.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/450822.html</trackback:ping><description><![CDATA[<a href="https://www.amitph.com/spring-webclient-large-file-download/" target="_blank">https://www.amitph.com/spring-webclient-large-file-download/</a><br /><br /><a href="https://github.com/amitrp/spring-examples/blob/main/spring-webflux-webclient/src/main/java/com/amitph/spring/webclients/service/FileDownloaderWebClientService.java" target="_blank">https://github.com/amitrp/spring-examples/blob/main/spring-webflux-webclient/src/main/java/com/amitph/spring/webclients/service/FileDownloaderWebClientService.java</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; ">import</span>&nbsp;lombok.RequiredArgsConstructor;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.core.io.buffer.DataBuffer;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.core.io.buffer.DataBufferUtils;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.stereotype.Service;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.web.reactive.function.client.WebClient;<br /><span style="color: #0000FF; ">import</span>&nbsp;reactor.core.publisher.Flux;<br /><span style="color: #0000FF; ">import</span>&nbsp;reactor.core.publisher.Mono;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.nio.file.Files;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.nio.file.Path;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.nio.file.StandardOpenOption;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Objects;<br /><br />@Service<br />@RequiredArgsConstructor<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;FileDownloaderWebClientService&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;WebClient&nbsp;webClient;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Reads&nbsp;the&nbsp;complete&nbsp;file&nbsp;in-memory.&nbsp;Thus,&nbsp;only&nbsp;useful&nbsp;for&nbsp;very&nbsp;large&nbsp;file<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;downloadUsingByteArray(Path&nbsp;destination)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mono&lt;<span style="color: #0000FF; ">byte</span>[]&gt;&nbsp;monoContents&nbsp;=&nbsp;webClient<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.uri("/largefiles/1")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.retrieve()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.bodyToMono(<span style="color: #0000FF; ">byte</span>[].<span style="color: #0000FF; ">class</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Files.write(destination,&nbsp;Objects.requireNonNull(monoContents.share().block()),<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StandardOpenOption.CREATE);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Reading&nbsp;file&nbsp;using&nbsp;Mono&nbsp;will&nbsp;try&nbsp;to&nbsp;fit&nbsp;the&nbsp;entire&nbsp;file&nbsp;into&nbsp;the&nbsp;DataBuffer.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Results&nbsp;in&nbsp;exception&nbsp;when&nbsp;the&nbsp;file&nbsp;is&nbsp;larger&nbsp;than&nbsp;the&nbsp;DataBuffer&nbsp;capacity.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;downloadUsingMono(Path&nbsp;destination)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mono&lt;DataBuffer&gt;&nbsp;dataBuffer&nbsp;=&nbsp;webClient<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.uri("/largefiles/1")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.retrieve()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.bodyToMono(DataBuffer.<span style="color: #0000FF; ">class</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataBufferUtils.write(dataBuffer,&nbsp;destination,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StandardOpenOption.CREATE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.share().block();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Having&nbsp;using&nbsp;Flux&nbsp;we&nbsp;can&nbsp;download&nbsp;files&nbsp;of&nbsp;any&nbsp;size&nbsp;safely.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Optionally,&nbsp;we&nbsp;can&nbsp;configure&nbsp;DataBuffer&nbsp;capacity&nbsp;for&nbsp;better&nbsp;memory&nbsp;utilization.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;downloadUsingFlux(Path&nbsp;destination)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Flux&lt;DataBuffer&gt;&nbsp;dataBuffer&nbsp;=&nbsp;webClient<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.get()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.uri("/largefiles/1")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.retrieve()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.bodyToFlux(DataBuffer.<span style="color: #0000FF; ">class</span>);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataBufferUtils.write(dataBuffer,&nbsp;destination,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StandardOpenOption.CREATE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.share().block();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><img src ="http://www.blogjava.net/paulwong/aggbug/450822.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-09-22 13:14 <a href="http://www.blogjava.net/paulwong/archive/2022/09/22/450822.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 Boot 2.x基础教程：使用LDAP来管理用户与组织数据</title><link>http://www.blogjava.net/paulwong/archive/2021/06/21/435902.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 21 Jun 2021 01:21:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/06/21/435902.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435902.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/06/21/435902.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435902.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435902.html</trackback:ping><description><![CDATA[<a href="http://blog.didispace.com/spring-boot-learning-24-6-2/" target="_blank">http://blog.didispace.com/spring-boot-learning-24-6-2/</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435902.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-06-21 09:21 <a href="http://www.blogjava.net/paulwong/archive/2021/06/21/435902.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SRPING自带的事件监听机制</title><link>http://www.blogjava.net/paulwong/archive/2021/04/09/435851.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 09 Apr 2021 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/04/09/435851.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435851.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/04/09/435851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435851.html</trackback:ping><description><![CDATA[定义一个事件，因SPRING中可以有不同的事件，需要定义一个类以作区分：<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 />--><span style="color: #0000FF; ">import</span>&nbsp;lombok.Getter;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.ApplicationEvent;<br /><br /><br />@Getter<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;JavaStackEvent&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;ApplicationEvent&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Create&nbsp;a&nbsp;new&nbsp;{</span><span style="color: #808080; ">@code</span><span style="color: #008000; ">&nbsp;ApplicationEvent}.<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;source&nbsp;the&nbsp;object&nbsp;on&nbsp;which&nbsp;the&nbsp;event&nbsp;initially&nbsp;occurred&nbsp;or&nbsp;with<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;which&nbsp;the&nbsp;event&nbsp;is&nbsp;associated&nbsp;(never&nbsp;{</span><span style="color: #808080; ">@code</span><span style="color: #008000; ">&nbsp;null})<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;JavaStackEvent(Object&nbsp;source)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">super</span>(source);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />}</div><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;lombok.NonNull;<br /><span style="color: #0000FF; ">import</span>&nbsp;lombok.RequiredArgsConstructor;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.ApplicationListener;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.scheduling.annotation.Async;<br /><br /><span style="color: #008000; ">/**</span><span style="color: #008000; "><br />&nbsp;*&nbsp;观察者：读者粉丝<br />&nbsp;</span><span style="color: #008000; ">*/</span><br />@RequiredArgsConstructor<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ReaderListener&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;ApplicationListener&lt;JavaStackEvent&gt;&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@NonNull<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;name;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;article;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Async<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;onApplicationEvent(JavaStackEvent&nbsp;event)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;更新文章</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;updateArticle(event);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;updateArticle(JavaStackEvent&nbsp;event)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.article&nbsp;=&nbsp;(String)&nbsp;event.getSource();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.printf("我是读者：%s，文章已更新为：%s\n",&nbsp;<span style="color: #0000FF; ">this</span>.name,&nbsp;<span style="color: #0000FF; ">this</span>.article);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br />注册感兴趣者（将自身注入SPRING容器则完成注册），并制定发布机制（通过CONTEXT发布事件）：<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;lombok.extern.slf4j.Slf4j;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.boot.CommandLineRunner;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.ApplicationContext;<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 /><br />@Slf4j<br />@Configuration<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ObserverConfiguration&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;CommandLineRunner&nbsp;commandLineRunner(ApplicationContext&nbsp;context)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;(args)&nbsp;-&gt;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("发布事件：什么是观察者模式？");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.publishEvent(<span style="color: #0000FF; ">new</span>&nbsp;JavaStackEvent("什么是观察者模式？"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ReaderListener&nbsp;readerListener1(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ReaderListener("小明");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ReaderListener&nbsp;readerListener2(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ReaderListener("小张");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;ReaderListener&nbsp;readerListener3(){<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ReaderListener("小爱");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><img src ="http://www.blogjava.net/paulwong/aggbug/435851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-04-09 14:55 <a href="http://www.blogjava.net/paulwong/archive/2021/04/09/435851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSR-303 Bean Validation - Date String Validation </title><link>http://www.blogjava.net/paulwong/archive/2021/02/25/435810.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 25 Feb 2021 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/02/25/435810.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435810.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/02/25/435810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435810.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435810.html</trackback:ping><description><![CDATA[@Past @Future只针对Date类型的验证，如果是String类型的验证，则不适用。<br />其实可以新加一个方法返回Date类型，再配合@Future@Past&nbsp;进行验证。<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 />-->@Future(message&nbsp;=&nbsp;"Invalid&nbsp;CN_ID_INFO.EXPIRE_DATE.")<br /><span style="color: #0000FF; ">private</span>&nbsp;LocalDate&nbsp;getValidExpireDate()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;LocalDate.parse(this.dateString,&nbsp;DateTimeFormatter.ofPattern("yyyy-MM-dd"));<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br />此方法对dateString进行解释，返回LocalDate，如果dateString为空或格式错误，则返回空，再配合@Future&nbsp;进行是否未来日期的验证。<br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435810.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-02-25 09:44 <a href="http://www.blogjava.net/paulwong/archive/2021/02/25/435810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSR-303 Bean Validation - Conditional Validation</title><link>http://www.blogjava.net/paulwong/archive/2021/02/25/435809.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 25 Feb 2021 01:24:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/02/25/435809.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435809.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/02/25/435809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435809.html</trackback:ping><description><![CDATA[bean validation的注释是针对单个变量的，如果要针对多个变量的联动，则不行，需要用到这个注释。<br />这种方法避免了自定义校验器而增加类。<br /><a href="https://www.chkui.com/article/java/java_bean_validation" target="_blank">https://www.chkui.com/article/java/java_bean_validation</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 />
-->@AssertTrue(message&nbsp;=&nbsp;"Missing&nbsp;BANK_CARD_IMG_INFO.IMG")<br />
<span style="color: #0000FF; ">private</span>&nbsp;Boolean&nbsp;getValidImg()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(YNEnum.Y.code.equals(<span style="color: #0000FF; ">super</span>.getNeedChecked()))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;StringUtils.hasText(<span style="color: #0000FF; ">this</span>.img);<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;<span style="color: #0000FF; ">null</span>;<span style="color: #008000; ">//</span><span style="color: #008000; ">igore&nbsp;checking.</span><span style="color: #008000; "><br />
</span>}</div><br />这个是当needChecked为Y的时候才执行检查img变量是否为空。<br />有几点注意：<br /><ol><li>方法名称要以get开头<br /></li><li>返回类型用Boolean，而不用boolean<br /></li><li>返回值有三种：true,false,null如果是null则当成通过，与true的结果一样</li></ol><img src ="http://www.blogjava.net/paulwong/aggbug/435809.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-02-25 09:24 <a href="http://www.blogjava.net/paulwong/archive/2021/02/25/435809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING BOOT单元测试之@ActiveProfiles</title><link>http://www.blogjava.net/paulwong/archive/2021/02/04/435792.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 04 Feb 2021 07:31:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/02/04/435792.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435792.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/02/04/435792.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435792.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435792.html</trackback:ping><description><![CDATA[SPRING BOOT单元测试中，因为测试时可能对应的服务器地址不同于SIT等别的环境，通常会将这些地址放于application-sit.yaml中。<br />在单元测试的代码中用这个标签指定用哪个profile，如<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 />-->@ActiveProfiles({"embedded-mongodb","test"})</div><br />但这样做法，由于@ActiveProfiles这个标签是final的，如果要测试别的profile，只能复制另一份单元测试代码，再改此标签。<br /><br />比较灵活的做法是用default profile，default profile是如果没指定任何profile，则会默认用这个。在application-default.yaml中再指定需激活的profile。<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: #800000; ">spring:<br />&nbsp;&nbsp;&nbsp;profiles:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;active:&nbsp;test,embedded-mongodb</span></div><br />如果要测试别的profile，可以指定环境变量的方式覆盖：<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: #800000; ">-Dspring.profiles.active=error,embedded-mongodb</span></div><br />为了安全起见，将application-default.yaml放在测试目录中：src\test\resources。<br /><br />Setting default Spring profile for tests with override option<br /><a href="https://blog.inspeerity.com/spring/setting-default-spring-profile-for-tests-with-override-option/" target="_blank">https://blog.inspeerity.com/spring/setting-default-spring-profile-for-tests-with-override-option/</a><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435792.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-02-04 15:31 <a href="http://www.blogjava.net/paulwong/archive/2021/02/04/435792.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子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 Retry框架——看这篇就够了</title><link>http://www.blogjava.net/paulwong/archive/2020/09/15/435662.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 15 Sep 2020 05:39:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/09/15/435662.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435662.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/09/15/435662.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435662.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435662.html</trackback:ping><description><![CDATA[<a href="https://my.oschina.net/marvelcode/blog/4563352" target="_blank">https://my.oschina.net/marvelcode/blog/4563352</a><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435662.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-09-15 13:39 <a href="http://www.blogjava.net/paulwong/archive/2020/09/15/435662.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Springboot+proguard+maven 混淆</title><link>http://www.blogjava.net/paulwong/archive/2020/08/13/435639.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 13 Aug 2020 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/08/13/435639.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435639.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/08/13/435639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435639.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435639.html</trackback:ping><description><![CDATA[<a href="https://blog.csdn.net/qq_35981283/article/details/78529929" target="_blank">https://blog.csdn.net/qq_35981283/article/details/78529929</a><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435639.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-08-13 10:53 <a href="http://www.blogjava.net/paulwong/archive/2020/08/13/435639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>如何优雅地停止SPRING BATCH中的REMOTE CHUNKING JOB</title><link>http://www.blogjava.net/paulwong/archive/2020/06/23/435547.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 23 Jun 2020 03:00:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/06/23/435547.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435547.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/06/23/435547.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435547.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435547.html</trackback:ping><description><![CDATA[SPRING BATCH中的REMOTE CHUNKING JOB，由于是基于MASTER/SLAVE的架构，其中某个STEP是会在远程机器中执行，如果要停止这个JOB，需要考虑两个问题：<br />
1、什么时候发出停止指令<br />
2、如何等待远程STEP的完成<br />
<br />
一般停止JOB，可用JobOperator.stop(long executionId)来停止，但这个无法确定什么时候发出停止指令，如果是在CHUNK的处理中途发出，则会出现回滚的现象。<br />

  
    <title>BATCH_STEP_EXECUTION</title>
    <meta name="GENERATOR" content="HeidiSQL 10.1.0.5464" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    
      thead tr {background-color: ActiveCaption; color: CaptionText;}
      th, td {vertical-align: top; font-family: "Tahoma", Arial, Helvetica, sans-serif; font-size: 8pt; padding: 4px; }
      table, td {border: 1px solid silver;}
      table {border-collapse: collapse;}
      thead .col0 {width: 173px;}
      .col0 {text-align: right;}
      thead .col1 {width: 82px;}
      .col1 {text-align: right;}
      thead .col2 {width: 282px;}
      thead .col3 {width: 164px;}
      .col3 {text-align: right;}
      thead .col4 {width: 161px;}
      thead .col5 {width: 161px;}
      thead .col6 {width: 109px;}
      thead .col7 {width: 127px;}
      .col7 {text-align: right;}
      thead .col8 {width: 109px;}
      .col8 {text-align: right;}
      thead .col9 {width: 118px;}
      .col9 {text-align: right;}
      thead .col10 {width: 117px;}
      .col10 {text-align: right;}
      thead .col11 {width: 142px;}
      .col11 {text-align: right;}
      thead .col12 {width: 150px;}
      .col12 {text-align: right;}
      thead .col13 {width: 166px;}
      .col13 {text-align: right;}
      thead .col14 {width: 137px;}
      .col14 {text-align: right;}
      thead .col15 {width: 109px;}
      thead .col16 {width: 156px;}
      thead .col17 {width: 161px;}
    
  
  
    <table caption="BATCH_STEP_EXECUTION (1 rows)">
      <thead>
        <tr>
          <th class="col0">STEP_EXECUTION_ID</th>
          <th class="col1">VERSION</th>
          <th class="col2">STEP_NAME</th>
          <th class="col3">JOB_EXECUTION_ID</th>
          <th class="col4">START_TIME</th>
          <th class="col5">END_TIME</th>
          <th class="col6">STATUS</th>
          <th class="col7">COMMIT_COUNT</th>
          <th class="col8">READ_COUNT</th>
          <th class="col9">FILTER_COUNT</th>
          <th class="col10">WRITE_COUNT</th>
          <th class="col11">READ_SKIP_COUNT</th>
          <th class="col12">WRITE_SKIP_COUNT</th>
          <th class="col13">PROCESS_SKIP_COUNT</th>
          <th class="col14">ROLLBACK_COUNT</th>
          <th class="col15">EXIT_CODE</th>
          <th class="col16">EXIT_MESSAGE</th>
          <th class="col17">LAST_UPDATED</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td class="col0">2304</td>
          <td class="col1">169</td>
          <td class="col2">step2HandleXXX</td>
          <td class="col3">434</td>
          <td class="col4">2020-06-22 16:27:54</td>
          <td class="col5">2020-06-22 16:32:46</td>
          <td class="col6">STOPPED</td>
          <td class="col7">167</td>
          <td class="col8">5010</td>
          <td class="col9">0</td>
          <td class="col10">4831</td>
          <td class="col11">0</td>
          <td class="col12">155</td>
          <td class="col13">0</td>
          <td class="col14">161</td>
          <td class="col15">STOPPED</td>
          <td class="col16">org.springframework.batch.core.JobInterruptedException</td>
          <td class="col17">2020-06-22 16:32:46</td>
        </tr>
      </tbody>
    </table>
    <p><br />另外SPRING BATCH也不会等远程STEP执行完成，就将JOB的状态设为Complete。<br /><br />发出停止的指令应通过ChunkListener达成：<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ItemMasterChunkListener&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;ChunkListenerSupport{<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(ItemMasterChunkListener.<span style="color: #0000FF; ">class</span>);<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;beforeChunk(ChunkContext&nbsp;context)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("ItemMasterProcessor.beforeChunk");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><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;afterChunk(ChunkContext&nbsp;context)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("ItemMasterProcessor.afterChunk");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(XXXX.isStoppingOrPausing())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("context.getStepContext().getStepExecution().setTerminateOnly()");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;context.getStepContext().getStepExecution().setTerminateOnly();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><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;afterChunkError(ChunkContext&nbsp;context)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.info("ItemMasterProcessor.afterChunkError");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />}</div><p><br />配置BEAN：<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Bean<br />@StepScope<br /><span style="color: #0000FF; ">public</span>&nbsp;ItemMasterChunkListener&nbsp;novaXItemMasterChunkListener()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ItemMasterChunkListener();<br />}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #0000FF; ">this</span>.masterStepBuilderFactory<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&lt;X,&nbsp;X&gt;get("step2Handle")<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.listener(itemMasterChunkListener())<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.build();</div><p><br />由于是在CHUNK完成的时候发出停止指令，就不会出现ROLLBACK的情况。<br /><br />等待远程STEP完成，通过读取MQ上的MESSAGE是否被消费完成，PENDDING的MESSAGE为0的条件即可。<br /><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;JobExecutionListenerSupport&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;JobExecutionListener&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;(non-Javadoc)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.springframework.batch.core.domain.JobListener#afterJob()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><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;afterJob(JobExecution&nbsp;jobExecution)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Integer&nbsp;totalPendingMessages&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;queueName&nbsp;=&nbsp;"";<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;String&nbsp;messageSelector&nbsp;=&nbsp;"JOB_EXECUTION_ID="&nbsp;+&nbsp;jobExecution.getJobInstance().getInstanceId();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">do</span>{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;totalPendingMessages&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; ">this</span>.jmsTemplate.browseSelected(queueName,&nbsp;messageSelector,&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;(session,&nbsp;browser)&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;Collections.list(browser.getEnumeration()).size()<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;);<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;String&nbsp;brokerURL&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(jmsTemplate.getConnectionFactory()&nbsp;<span style="color: #0000FF; ">instanceof</span>&nbsp;JmsPoolConnectionFactory)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JmsPoolConnectionFactory&nbsp;connectionFactory&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;(JmsPoolConnectionFactory)jmsTemplate.getConnectionFactory();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActiveMQConnectionFactory&nbsp;activeMQConnectionFactory&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;(ActiveMQConnectionFactory)connectionFactory.getConnectionFactory();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;brokerURL&nbsp;=&nbsp;activeMQConnectionFactory.getBrokerURL();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>(jmsTemplate.getConnectionFactory()&nbsp;<span style="color: #0000FF; ">instanceof</span>&nbsp;CachingConnectionFactory)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CachingConnectionFactory&nbsp;connectionFactory&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;(CachingConnectionFactory)jmsTemplate.getConnectionFactory();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ActiveMQConnectionFactory&nbsp;activeMQConnectionFactory&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;(ActiveMQConnectionFactory)connectionFactory.getTargetConnectionFactory();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;brokerURL&nbsp;=&nbsp;activeMQConnectionFactory.getBrokerURL();<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;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.info("queueName&nbsp;=&nbsp;{},&nbsp;{},&nbsp;totalPendingMessages&nbsp;=&nbsp;{},&nbsp;url={}",&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queueName,&nbsp;messageSelector,&nbsp;totalPendingMessages,&nbsp;brokerURL);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Assert.notNull(totalPendingMessages,&nbsp;"totalPendingMessages&nbsp;must&nbsp;not&nbsp;be&nbsp;null.");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(5_000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LOGGER.error(e.getMessage(),&nbsp;e);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">while</span>(totalPendingMessages.intValue()&nbsp;&gt;&nbsp;0);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">&nbsp;(non-Javadoc)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;@see&nbsp;org.springframework.batch.core.domain.JobListener#beforeJob(org.springframework.batch.core.domain.JobExecution)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><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;beforeJob(JobExecution&nbsp;jobExecution)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><p><br />这样整个JOB就能无异常地停止，且会等待远程STEP完成。<br /><br />Reference:<br /><a href="https://docs.spring.io/spring-batch/docs/4.1.3.RELEASE/reference/html/common-patterns.html#stoppingAJobManuallyForBusinessReasons" target="_blank">https://docs.spring.io/spring-batch/docs/4.1.3.RELEASE/reference/html/common-patterns.html#stoppingAJobManuallyForBusinessReasons</a><br /><br /><a href="https://stackoverflow.com/questions/13603949/count-number-of-messages-in-a-jms-queue" target="_blank">https://stackoverflow.com/questions/13603949/count-number-of-messages-in-a-jms-queue</a><br /><br /><a href="https://stackoverflow.com/questions/55499965/spring-batch-stop-job-execution-from-external-class" target="_blank">https://stackoverflow.com/questions/55499965/spring-batch-stop-job-execution-from-external-class</a><br /><br /><a href="https://stackoverflow.com/questions/34621885/spring-batch-pollable-channel-with-replies-contains-chunkresponses-even-if-job" target="_blank">https://stackoverflow.com/questions/34621885/spring-batch-pollable-channel-with-replies-contains-chunkresponses-even-if-job</a><br /><br /><br /></p><img src ="http://www.blogjava.net/paulwong/aggbug/435547.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-06-23 11:00 <a href="http://www.blogjava.net/paulwong/archive/2020/06/23/435547.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Boot Data Mongodb Starter自动配置那些坑</title><link>http://www.blogjava.net/paulwong/archive/2020/03/17/435271.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 17 Mar 2020 01:39:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/03/17/435271.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435271.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/03/17/435271.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435271.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435271.html</trackback:ping><description><![CDATA[<div style="font-size: medium;"><div><p>正好做Mongodb主从复制尝试使用Spring Boot Data Mongodb Starter插件链接访问Mongodb数据库集群。</p><p>遇到的坑：</p><ul><li>spring.data.mongodb.host和spring.data.mongodb.port形式不适合集群配置，会报host无法识别异常</li><li>spring.data.mongodb.uri中经常抛出authentication failed异常</li></ul><p><br /></p><p>解决办法：</p><ol><li>&nbsp;对于第一个坑，请使用spring.data.mongodb.uri。<span style="background-color: yellow;">如果使用了uri，则其余的host/username/password/db/auth-db这些全部无效。</span></li><li>&nbsp;对于第二个坑，请在spring.data.mongodb.uri中指定replicaSet和authsource，另外记得把所有集群节点服务器地址都列全。<br /><span style="background-color: yellow;">如果auth-db和db是同一个，则无需加authsource，如果不同，则加authsource=admin</span></li></ol><p><br /></p><p>我没有把authsource指定，所以一直报authentication failed异常。然后只好一点点去发掘问题点，最后查到在com.mongodb.ConnectionString类中的createCredentials中<br /><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">private</span>&nbsp;MongoCredential&nbsp;createCredentials(<span style="color: #0000FF; ">final</span>&nbsp;Map&lt;String,&nbsp;List&lt;String&gt;&gt;&nbsp;optionsMap,&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;userName,<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;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">char</span>[]&nbsp;password)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AuthenticationMechanism&nbsp;mechanism&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;authSource&nbsp;=&nbsp;(database&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;?&nbsp;"admin"&nbsp;:&nbsp;database;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;gssapiServiceName&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;authMechanismProperties&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;key&nbsp;:&nbsp;AUTH_KEYS)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;getLastValue(optionsMap,&nbsp;key);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(value&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">continue</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(key.equals("authmechanism"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mechanism&nbsp;=&nbsp;AuthenticationMechanism.fromMechanismName(value);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(key.equals("authsource"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;authSource&nbsp;=&nbsp;value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(key.equals("gssapiservicename"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gssapiServiceName&nbsp;=&nbsp;value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(key.equals("authmechanismproperties"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;authMechanismProperties&nbsp;=&nbsp;value;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MongoCredential&nbsp;credential&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(mechanism&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">switch</span>&nbsp;(mechanism)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;GSSAPI:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;MongoCredential.createGSSAPICredential(userName);<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; ">if</span>&nbsp;(gssapiServiceName&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&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;credential&nbsp;=&nbsp;credential.withMechanismProperty("SERVICE_NAME",&nbsp;gssapiServiceName);<br />&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; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;PLAIN:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;MongoCredential.createPlainCredential(userName,&nbsp;authSource,&nbsp;password);<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; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;MONGODB_CR:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;MongoCredential.createMongoCRCredential(userName,&nbsp;authSource,&nbsp;password);<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; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;MONGODB_X509:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;MongoCredential.createMongoX509Credential(userName);<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; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">case</span>&nbsp;SCRAM_SHA_1:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;MongoCredential.createScramSha1Credential(userName,&nbsp;authSource,&nbsp;password);<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; ">break</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">default</span>:<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; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;UnsupportedOperationException(format("The&nbsp;connection&nbsp;string&nbsp;contains&nbsp;an&nbsp;invalid&nbsp;authentication&nbsp;mechanism'.&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;"'%s'&nbsp;is&nbsp;not&nbsp;a&nbsp;supported&nbsp;authentication&nbsp;mechanism",<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;mechanism));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(userName&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;MongoCredential.createCredential(userName,&nbsp;authSource,&nbsp;password);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(credential&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;&amp;&amp;&nbsp;authMechanismProperties&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(String&nbsp;part&nbsp;:&nbsp;authMechanismProperties.split(","))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String[]&nbsp;mechanismPropertyKeyValue&nbsp;=&nbsp;part.split(":");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(mechanismPropertyKeyValue.length&nbsp;!=&nbsp;2)&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; ">throw</span>&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;IllegalArgumentException(format("The&nbsp;connection&nbsp;string&nbsp;contains&nbsp;invalid&nbsp;authentication&nbsp;properties.&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;"'%s'&nbsp;is&nbsp;not&nbsp;a&nbsp;key&nbsp;value&nbsp;pair",&nbsp;part));<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;&nbsp;&nbsp;&nbsp;String&nbsp;key&nbsp;=&nbsp;mechanismPropertyKeyValue[0].trim().toLowerCase();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;=&nbsp;mechanismPropertyKeyValue[1].trim();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(key.equals("canonicalize_host_name"))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;credential.withMechanismProperty(key,&nbsp;Boolean.valueOf(value));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;credential&nbsp;=&nbsp;credential.withMechanismProperty(key,&nbsp;value);<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;}<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;credential;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><p><br /></p><p>authSource默认会指向我们目标数据的数据库。然而在身份验证机制中我们通常需要指向admin。（非常想报粗口，代码作者在这里脑袋被men挤了么）。所以需要强制指定authSource中指定。具体指定方式如下：</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p><pre bash"=""><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 />-->mongodb://{用户名}:{密码}@{host1}:27017,{host2}:27017,{host3}:27017/{目标数据库}?replicaSet={复制集名称}&amp;write=1&amp;readPreference=primary&amp;authsource={授权数据库}</div></pre></div></div><img src ="http://www.blogjava.net/paulwong/aggbug/435271.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-03-17 09:39 <a href="http://www.blogjava.net/paulwong/archive/2020/03/17/435271.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>5 ways to customize Spring MVC JSON/XML output</title><link>http://www.blogjava.net/paulwong/archive/2020/03/08/435236.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 08 Mar 2020 07:55:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/03/08/435236.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435236.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/03/08/435236.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435236.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435236.html</trackback:ping><description><![CDATA[<a href="https://mostafa-asg.github.io/post/customize-json-xml-spring-mvc-output/" target="_blank">https://mostafa-asg.github.io/post/customize-json-xml-spring-mvc-output/</a><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435236.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-03-08 15:55 <a href="http://www.blogjava.net/paulwong/archive/2020/03/08/435236.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING BOOT 环境下减少中间件依赖的UNIT测试</title><link>http://www.blogjava.net/paulwong/archive/2020/02/07/435067.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 07 Feb 2020 02:28:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/02/07/435067.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435067.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/02/07/435067.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435067.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435067.html</trackback:ping><description><![CDATA[<div>SPRING BOOT 环境下，测试有时会依赖于外部的中间件，如Mysql，Activemq，Mongodb等，那如何能减少这种依赖呢？<br />
SPRING BOOT其实已经实现了自动化配置。<br />
<br />
<h2>Mongodb</h2>
SPRING BOOT的自动化配置文件：org.springframework.boot.autoconfigure.mongo.embeddedEmbedded.MongoAutoConfiguration.java<br /><br />在pom.xml中新增一test profile，并添加相应jar包，这样可防止对其他profile的影响，如果是在Eclipse跑测试，需在Project的属性中指定Active Profile为test，以覆盖pom.xml的定义。<br />
这种方式即使是使用SPRING DATA MONGODB的REPOSITORY也是适用的。<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 />
-->&nbsp; &nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">profile</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; ">id</span><span style="color: #0000FF; ">&gt;</span>test<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">id</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; ">dependencies</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; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&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>de.flapdoodle.embed<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;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>de.flapdoodle.embed.mongo<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span>test<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">scope</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; ">dependency</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; ">dependencies</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; ">activation</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; ">activeByDefault</span><span style="color: #0000FF; ">&gt;</span>false<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">activeByDefault</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; ">activation</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">profile</span><span style="color: #0000FF; ">&gt;</span></div>
</div>
在application-test.yaml中添加端口，其他如IP那些信息都不需要<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 />
-->spring:<br />
&nbsp;&nbsp;&nbsp;data:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mongodb:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;port:&nbsp;27017</div>
<br />
unit test config<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;java.io.FileNotFoundException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.InputStreamReader;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.Reader;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.UncheckedIOException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.nio.charset.StandardCharsets;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.List;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;javax.annotation.PostConstruct;<br /><span style="color: #0000FF; ">import</span>&nbsp;javax.sql.DataSource;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.bson.Document;<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.Value;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Configuration;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.context.annotation.Profile;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.core.io.Resource;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.core.io.ResourceLoader;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.mongodb.core.MongoTemplate;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.data.mongodb.repository.config.EnableMongoRepositories;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.jdbc.datasource.init.DatabasePopulatorUtils;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.jdbc.datasource.init.ResourceDatabasePopulator;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.springframework.util.FileCopyUtils;<br /><br />@Configuration<br />@Profile({"test",&nbsp;"integrationTest"})<br />@EnableMongoRepositories(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;basePackages&nbsp;=&nbsp;{"paul.com.repository"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />)<br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;EmbeddedDataSourceConfiguration&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Value("classpath:/initdata/USER.json")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Resource&nbsp;userResource;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;@Value("classpath:/initdata/MEMBERS.json")<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Resource&nbsp;membersResource;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;ResourceLoader&nbsp;resourceLoader;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;DataSource&nbsp;dataSource;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Autowired<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;MongoTemplate&nbsp;&nbsp;mongoTemplate;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@PostConstruct<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">protected</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;initialize()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;FileNotFoundException,&nbsp;IOException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.initializeHsqldb();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.initializeMongodb();<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;initializeHsqldb()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ResourceDatabasePopulator&nbsp;populator&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ResourceDatabasePopulator();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;populator.addScript(resourceLoader.getResource("classpath:/org/springframework/batch/core/schema-hsqldb.sql"));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;populator.setContinueOnError(<span style="color: #0000FF; ">true</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DatabasePopulatorUtils.execute(populator&nbsp;,&nbsp;dataSource);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;initializeMongodb()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;FileNotFoundException,&nbsp;IOException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.saveResource(userResource,&nbsp;"USER");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.saveDocumentList(membersResource,&nbsp;"MEMBER");<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;saveResource(Resource&nbsp;resource,&nbsp;String&nbsp;collectionName)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;resourceJson&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.asString(resource);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;resourceDocument&nbsp;=&nbsp;Document.parse(resourceJson);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.mongoTemplate.save(resourceDocument,&nbsp;collectionName);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;saveDocumentList(Resource&nbsp;resource,&nbsp;String&nbsp;collectionName)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;resourceJson&nbsp;=&nbsp;<span style="color: #0000FF; ">this</span>.asString(resource);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Document&nbsp;resourceDocument&nbsp;=&nbsp;Document.parse("{&nbsp;\"list\":"&nbsp;+&nbsp;resourceJson&nbsp;+&nbsp;"}");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;Document&gt;&nbsp;documentList&nbsp;=&nbsp;resourceDocument.get("list",&nbsp;List.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;documentList.forEach(document&nbsp;-&gt;&nbsp;<span style="color: #0000FF; ">this</span>.mongoTemplate.save(document,&nbsp;collectionName));<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;asString(Resource&nbsp;resource)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;(Reader&nbsp;reader&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;InputStreamReader(resource.getInputStream(),&nbsp;StandardCharsets.UTF_8))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;FileCopyUtils.copyToString(reader);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e)&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;UncheckedIOException(e);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Bean(destroyMethod="close")<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;DataSource&nbsp;dataSource()&nbsp;{<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BasicDataSource&nbsp;dataSource&nbsp;=&nbsp;new&nbsp;BasicDataSource();<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSource.setDriverClassName(environment.getProperty("batch.jdbc.driver"));<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSource.setUrl(environment.getProperty("batch.jdbc.url"));<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSource.setUsername(environment.getProperty("batch.jdbc.user"));<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSource.setPassword(environment.getProperty("batch.jdbc.password"));<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dataSource;<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;}</span><span style="color: #008000; "><br /></span>}</div><br />
<h2>ActiveMQ</h2>
只需更改application-test.yml中的brokerUrl为vm://embedded即可<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 />
-->spring:<br />
&nbsp;&nbsp;&nbsp;activemq:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;broker-url:&nbsp;vm://embedded?broker.persistent=false,useShutdownHook=false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in-memory:&nbsp;true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;non-blocking-redelivery:&nbsp;true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#packages:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#trust-all:&nbsp;false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#trusted:&nbsp;com.memorynotfound<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pool:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block-if-full:&nbsp;true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;block-if-full-timeout:&nbsp;-1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;create-connection-on-startup:&nbsp;true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;enabled:&nbsp;false<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;expiry-timeout:&nbsp;0<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;idle-timeout:&nbsp;30000<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;max-connections:&nbsp;1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;maximum-active-session-per-connection:&nbsp;500<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reconnect-on-exception:&nbsp;true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time-between-expiration-check:&nbsp;-1<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;use-anonymous-producers:&nbsp;true<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user:&nbsp;admin<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#password:&nbsp;ENC(hWJHuMyhydTqyF32neasTw==)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;password:&nbsp;admin</div>
<br />
<h2>关系型数据库</h2>
将在application-test.yml中的数据库信息删除，同时在pom.xml中添加jar包依赖，这边是采用HSQL数据库<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;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">profile</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; ">id</span><span style="color: #0000FF; ">&gt;</span>test<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">id</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; ">dependencies</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; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&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.hsqldb<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;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>hsqldb<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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">scope</span><span style="color: #0000FF; ">&gt;</span>test<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">scope</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; ">dependency</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; ">dependencies</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; ">activation</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; ">activeByDefault</span><span style="color: #0000FF; ">&gt;</span>false<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">activeByDefault</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; ">activation</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">profile</span><span style="color: #0000FF; ">&gt;</span></div>
<br />
非SPRING BOOT/SPRING的纯JDK环境可参考<br />
<a href="https://github.com/yandex-qatools/embedded-services" target="_blank">https://github.com/yandex-qatools/embedded-services</a><br />
<br />
<a href="https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo" target="_blank">https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo</a><br />
<br />
<a href="https://github.com/jonyfs/spring-boot-data-embedded-mongodb/blob/master/src/main/java/br/com/jonyfs/spring/boot/data/embedded/mongodb/config/MongoConfig.java" target="_blank">https://github.com/jonyfs/spring-boot-data-embedded-mongodb/blob/master/src/main/java/br/com/jonyfs/spring/boot/data/embedded/mongodb/config/MongoConfig.java<br />
<br /></a>ActiveMQ:<br /><a href="https://memorynotfound.com/spring-boot-embedded-activemq-configuration-example/" target="_blank">https://memorynotfound.com/spring-boot-embedded-activemq-configuration-example/</a><img src ="http://www.blogjava.net/paulwong/aggbug/435067.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-02-07 10:28 <a href="http://www.blogjava.net/paulwong/archive/2020/02/07/435067.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>How to provide a Spring Boot "fat JAR" with external dependencies</title><link>http://www.blogjava.net/paulwong/archive/2019/12/27/434997.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 27 Dec 2019 07:47:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/12/27/434997.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434997.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/12/27/434997.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434997.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434997.html</trackback:ping><description><![CDATA[发现loader.path放在properties文件中时，不起作用，要以-Dloader.path=lib/的方式才行。<br /><a href="http://www.codevomit.xyz/bootlog/blog/how-to-provide-spring-boot-fat-jar" target="_blank"><br />http://www.codevomit.xyz/bootlog/blog/how-to-provide-spring-boot-fat-jar</a><br /><br /><a href="https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-executable-jar-format.html" target="_blank">https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-executable-jar-format.html</a><img src ="http://www.blogjava.net/paulwong/aggbug/434997.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-12-27 15:47 <a href="http://www.blogjava.net/paulwong/archive/2019/12/27/434997.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>防止在SPRING BOOT的配置文件中使用明文存储密码</title><link>http://www.blogjava.net/paulwong/archive/2019/11/26/434931.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 26 Nov 2019 07:13:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/11/26/434931.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434931.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/11/26/434931.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434931.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434931.html</trackback:ping><description><![CDATA[Spring Boot how to hide passwords in properties file<br /><a href="https://stackoverflow.com/questions/37404703/spring-boot-how-to-hide-passwords-in-properties-file" target="_blank">https://stackoverflow.com/questions/37404703/spring-boot-how-to-hide-passwords-in-properties-file</a><br /><br />工作随笔&#8212;&#8212;jasypt-spring-boot使用<br /><a href="https://www.cnblogs.com/zz0412/p/jasypt-001.html" target="_blank">https://www.cnblogs.com/zz0412/p/jasypt-001.html</a><br /><br />Get史上最优雅加密方式！没有之一！<br /><a href="https://www.jianshu.com/p/64ceda636e81" target="_blank">https://www.jianshu.com/p/64ceda636e81</a><br /><br />使用Jasypt对SpringBoot配置文件加密<br /><a href="https://www.jianshu.com/p/323ec96c46d2" target="_blank">https://www.jianshu.com/p/323ec96c46d2</a><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/434931.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-11-26 15:13 <a href="http://www.blogjava.net/paulwong/archive/2019/11/26/434931.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MAVEN打多环境包</title><link>http://www.blogjava.net/paulwong/archive/2019/11/21/434920.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 21 Nov 2019 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/11/21/434920.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434920.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/11/21/434920.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434920.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434920.html</trackback:ping><description><![CDATA[通常配置文件是放在src/main/resources下，build完之后会放在classes文件夹下，最终会打进jar包中。<br />
<br />
如果是SPRING BOOT工程，部署时，要求配置文件不打进jar包中，要有sh启动命令文件，最终产生一个ZIP包，包含所有需要的东西。这时就需要善用MAVEN的resource插件、assembly插件和jar插件了。<br />
<br />
resource插件能重定义配置文件在output时的文件夹路径，用profile的变量值替换配置文件中的占位符。<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 />-->&lt;properties&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;resource.delimiter&gt;${}&lt;/resource.delimiter&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;&lt;/properties&gt;</div><br /><br />
jar插件能排除生成在classes文件夹中不要的文件被打进jar包中。<br />
<br />
assembly插件能定义ZIP包中需要包含哪些文件。<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; ">&lt;</span><span style="color: #800000; ">resources</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">resource</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">directory</span><span style="color: #0000FF; ">&gt;</span>src/main/bin<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">directory</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">表明此文件夹中如有占位符，则会取pom中的profile中的值代替</span><span style="color: #008000; ">--&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; ">filtering</span><span style="color: #0000FF; ">&gt;</span>true<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">filtering</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; ">includes</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">include</span><span style="color: #0000FF; ">&gt;</span>*.sh<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">include</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; ">includes</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; ">resource</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;<br />
<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">resources</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;</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 />
--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">plugin</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;<br />
&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>maven-jar-plugin<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">configuration</span><span style="color: #0000FF; ">&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">bin/文件夹不会被打进jar包</span><span style="color: #008000; ">--&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; ">excludes</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">exclude</span><span style="color: #0000FF; ">&gt;</span>bin/<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">exclude</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; ">excludes</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; ">configuration</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;<br />
<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">plugin</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;</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 />
--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">fileSet</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">&lt;!--</span><span style="color: #008000; ">定义bin/文件夹被打进zip包</span><span style="color: #008000; ">--&gt;</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">directory</span><span style="color: #0000FF; ">&gt;</span>${build.outputDirectory}/bin<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">directory</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">outputDirectory</span><span style="color: #0000FF; ">&gt;</span>bin<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">outputDirectory</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; ">fileMode</span><span style="color: #0000FF; ">&gt;</span>0755<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">fileMode</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;<br />
<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">fileSet</span><span style="color: #0000FF; ">&gt;</span>&nbsp;&nbsp;</div>
<br /><br />maven打包加时间戳<br /><a href="https://blog.csdn.net/z410970953/article/details/50680603" target="_blank">https://blog.csdn.net/z410970953/article/details/50680603</a><img src ="http://www.blogjava.net/paulwong/aggbug/434920.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-11-21 16:40 <a href="http://www.blogjava.net/paulwong/archive/2019/11/21/434920.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SPRING BOOT 打包部署指南</title><link>http://www.blogjava.net/paulwong/archive/2019/06/13/433857.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 13 Jun 2019 07:22:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/06/13/433857.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/433857.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/06/13/433857.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/433857.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/433857.html</trackback:ping><description><![CDATA[<br /><a href="https://segmentfault.com/a/1190000017386408" target="_blank">https://segmentfault.com/a/1190000017386408</a><img src ="http://www.blogjava.net/paulwong/aggbug/433857.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-13 15:22 <a href="http://www.blogjava.net/paulwong/archive/2019/06/13/433857.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Boot Admin资源</title><link>http://www.blogjava.net/paulwong/archive/2017/03/21/432394.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 21 Mar 2017 14:10:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2017/03/21/432394.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/432394.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2017/03/21/432394.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/432394.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/432394.html</trackback:ping><description><![CDATA[Spring Boot Admin 的使用<br /><a href="http://blog.csdn.net/kinginblue/article/details/52132113" target="_blank">http://blog.csdn.net/kinginblue/article/details/52132113</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/432394.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> 2017-03-21 22:10 <a href="http://www.blogjava.net/paulwong/archive/2017/03/21/432394.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>微服务框架Spring Cloud</title><link>http://www.blogjava.net/paulwong/archive/2016/09/11/431788.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 11 Sep 2016 12:49:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2016/09/11/431788.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/431788.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2016/09/11/431788.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/431788.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/431788.html</trackback:ping><description><![CDATA[<h2>2016</h2><article style="margin: 0px 0px 0px 5em; padding: 1em 0px 0.7em 4.5em; border: 0px; font-variant-numeric: inherit; font-stretch: inherit; line-height: 27.6px; font-family: &quot;PT Serif&quot;, Georgia, Times, &quot;Times New Roman&quot;, serif; font-size: 18.4px; vertical-align: baseline; position: relative; color: #aaaaaa; background: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAAFUlEQVR4AWNIS0sr/v//PwMUDzo+ADqMahmdZfljAAAAAElFTkSuQmCC&quot;) left bottom repeat-x #f8f8f8;"><h1><a href="http://skaka.me/blog/2016/09/04/springcloud5/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: normal; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 27.6px; vertical-align: baseline; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word; text-decoration: none; display: inline-block;" target="_blank">微服务框架Spring Cloud介绍 Part5: 在微服务系统中使用Hystrix, Hystrix Dashboard与Turbine</a></h1><time datetime="2016-09-04T21:03:22+08:00" pubdate="" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.2em; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 0.9em; vertical-align: baseline; position: absolute; text-align: right; left: 0em; top: 1.8em;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block; text-transform: uppercase;">SEP</span>&nbsp;<span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block;">04</span></time><footer style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 18.4px; vertical-align: baseline;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 18.4px; vertical-align: baseline;">posted in&nbsp;<a href="http://skaka.me/blog/categories/spring-cloud/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">spring cloud</a>,&nbsp;<a href="http://skaka.me/blog/categories/wei-fu-wu/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">微服务</a></span></footer></article><article style="margin: 0px 0px 0px 5em; padding: 1em 0px 0.7em 4.5em; border: 0px; font-variant-numeric: inherit; font-stretch: inherit; line-height: 27.6px; font-family: &quot;PT Serif&quot;, Georgia, Times, &quot;Times New Roman&quot;, serif; font-size: 18.4px; vertical-align: baseline; position: relative; color: #aaaaaa; background: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAAFUlEQVR4AWNIS0sr/v//PwMUDzo+ADqMahmdZfljAAAAAElFTkSuQmCC&quot;) left bottom repeat-x #f8f8f8;"><h1><a href="http://skaka.me/blog/2016/08/25/springcloud4/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: normal; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 27.6px; vertical-align: baseline; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word; text-decoration: none; display: inline-block;" target="_blank">微服务框架Spring Cloud介绍 Part4: 使用Eureka, Ribbon, Feign实现REST服务客户端</a></h1><time datetime="2016-08-25T19:52:31+08:00" pubdate="" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.2em; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 0.9em; vertical-align: baseline; position: absolute; text-align: right; left: 0em; top: 1.8em;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block; text-transform: uppercase;">AUG</span>&nbsp;<span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block;">25</span></time><footer style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 18.4px; vertical-align: baseline;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 18.4px; vertical-align: baseline;">posted in&nbsp;<a href="http://skaka.me/blog/categories/spring-cloud/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">spring cloud</a>,&nbsp;<a href="http://skaka.me/blog/categories/wei-fu-wu/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">微服务</a></span></footer></article><article style="margin: 0px 0px 0px 5em; padding: 1em 0px 0.7em 4.5em; border: 0px; font-variant-numeric: inherit; font-stretch: inherit; line-height: 27.6px; font-family: &quot;PT Serif&quot;, Georgia, Times, &quot;Times New Roman&quot;, serif; font-size: 18.4px; vertical-align: baseline; position: relative; color: #aaaaaa; background: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAAFUlEQVR4AWNIS0sr/v//PwMUDzo+ADqMahmdZfljAAAAAElFTkSuQmCC&quot;) left bottom repeat-x #f8f8f8;"><h1><a href="http://skaka.me/blog/2016/08/10/springcloud3/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: normal; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 27.6px; vertical-align: baseline; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word; text-decoration: none; display: inline-block;" target="_blank">微服务框架Spring Cloud介绍 Part3: Mysteam项目结构与开发用户注册服务</a></h1><time datetime="2016-08-10T10:06:10+08:00" pubdate="" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.2em; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 0.9em; vertical-align: baseline; position: absolute; text-align: right; left: 0em; top: 1.8em;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block; text-transform: uppercase;">AUG</span>&nbsp;<span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block;">10</span></time><footer style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 18.4px; vertical-align: baseline;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 18.4px; vertical-align: baseline;">posted in&nbsp;<a href="http://skaka.me/blog/categories/spring-cloud/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">spring cloud</a>,&nbsp;<a href="http://skaka.me/blog/categories/wei-fu-wu/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">微服务</a></span></footer></article><article style="margin: 0px 0px 0px 5em; padding: 1em 0px 0.7em 4.5em; border: 0px; font-variant-numeric: inherit; font-stretch: inherit; line-height: 27.6px; font-family: &quot;PT Serif&quot;, Georgia, Times, &quot;Times New Roman&quot;, serif; font-size: 18.4px; vertical-align: baseline; position: relative; color: #aaaaaa; background: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAAFUlEQVR4AWNIS0sr/v//PwMUDzo+ADqMahmdZfljAAAAAElFTkSuQmCC&quot;) left bottom repeat-x #f8f8f8;"><h1><a href="http://skaka.me/blog/2016/08/03/springcloud2/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: normal; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 27.6px; vertical-align: baseline; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word; text-decoration: none; display: inline-block;">微服务框架Spring Cloud介绍 Part2: Spring Cloud与微服务</a></h1><time datetime="2016-08-03T22:09:25+08:00" pubdate="" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.2em; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 0.9em; vertical-align: baseline; position: absolute; text-align: right; left: 0em; top: 1.8em;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block; text-transform: uppercase;">AUG</span>&nbsp;<span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block;">03</span></time><footer style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 18.4px; vertical-align: baseline;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 18.4px; vertical-align: baseline;">posted in&nbsp;<a href="http://skaka.me/blog/categories/spring-cloud/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">spring cloud</a>,&nbsp;<a href="http://skaka.me/blog/categories/wei-fu-wu/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">微服务</a></span></footer></article><article style="margin: 0px 0px 0px 5em; padding: 1em 0px 0.7em 4.5em; border: 0px; font-variant-numeric: inherit; font-stretch: inherit; line-height: 27.6px; font-family: &quot;PT Serif&quot;, Georgia, Times, &quot;Times New Roman&quot;, serif; font-size: 18.4px; vertical-align: baseline; position: relative; color: #aaaaaa; background: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAAFUlEQVR4AWNIS0sr/v//PwMUDzo+ADqMahmdZfljAAAAAElFTkSuQmCC&quot;) left bottom repeat-x #f8f8f8;"><h1><a href="http://skaka.me/blog/2016/05/02/finagle3/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: normal; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 27.6px; vertical-align: baseline; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word; text-decoration: none; display: inline-block;">微服务框架Finagle介绍 Part3: 在Finagle中开发基于Thrift协议的应用</a></h1><time datetime="2016-05-02T21:32:55+08:00" pubdate="" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.2em; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 0.9em; vertical-align: baseline; position: absolute; text-align: right; left: 0em; top: 1.8em;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block; text-transform: uppercase;">MAY</span>&nbsp;<span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block;">02</span></time><footer style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 18.4px; vertical-align: baseline;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 18.4px; vertical-align: baseline;">posted in&nbsp;<a href="http://skaka.me/blog/categories/finagle/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">finagle</a>,&nbsp;<a href="http://skaka.me/blog/categories/wei-fu-wu/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">微服务</a></span></footer></article><article style="margin: 0px 0px 0px 5em; padding: 1em 0px 0.7em 4.5em; border: 0px; font-variant-numeric: inherit; font-stretch: inherit; line-height: 27.6px; font-family: &quot;PT Serif&quot;, Georgia, Times, &quot;Times New Roman&quot;, serif; font-size: 18.4px; vertical-align: baseline; position: relative; color: #aaaaaa; background: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAAFUlEQVR4AWNIS0sr/v//PwMUDzo+ADqMahmdZfljAAAAAElFTkSuQmCC&quot;) left bottom repeat-x #f8f8f8;"><h1><a href="http://skaka.me/blog/2016/05/01/finagle2/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: normal; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 27.6px; vertical-align: baseline; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word; text-decoration: none; display: inline-block;">微服务框架Finagle介绍 Part2: 在Finagle中开发基于Http协议的应用</a></h1><time datetime="2016-05-01T10:17:35+08:00" pubdate="" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.2em; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 0.9em; vertical-align: baseline; position: absolute; text-align: right; left: 0em; top: 1.8em;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block; text-transform: uppercase;">MAY</span>&nbsp;<span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block;">01</span></time><footer style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 18.4px; vertical-align: baseline;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 18.4px; vertical-align: baseline;">posted in&nbsp;<a href="http://skaka.me/blog/categories/finagle/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">finagle</a>,&nbsp;<a href="http://skaka.me/blog/categories/wei-fu-wu/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">微服务</a></span></footer></article><article style="margin: 0px 0px 0px 5em; padding: 1em 0px 0.7em 4.5em; border: 0px; font-variant-numeric: inherit; font-stretch: inherit; line-height: 27.6px; font-family: &quot;PT Serif&quot;, Georgia, Times, &quot;Times New Roman&quot;, serif; font-size: 18.4px; vertical-align: baseline; position: relative; color: #aaaaaa; background: url(&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAABCAYAAACsXeyTAAAAFUlEQVR4AWNIS0sr/v//PwMUDzo+ADqMahmdZfljAAAAAElFTkSuQmCC&quot;) left bottom repeat-x #f8f8f8;"><h1><a href="http://skaka.me/blog/2016/04/21/springcloud1/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: normal; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 27.6px; vertical-align: baseline; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word; text-decoration: none; display: inline-block;" target="_blank">微服务框架Spring Cloud介绍 Part1: 使用事件和消息队列实现分布式事务</a></h1><time datetime="2016-04-21T11:21:45+08:00" pubdate="" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.2em; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 0.9em; vertical-align: baseline; position: absolute; text-align: right; left: 0em; top: 1.8em;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block; text-transform: uppercase;">APR</span>&nbsp;<span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block;">21</span></time><footer style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 18.4px; vertical-align: baseline;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 18.4px; vertical-align: baseline;">posted in&nbsp;<a href="http://skaka.me/blog/categories/spring-cloud/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">spring cloud</a>,&nbsp;<a href="http://skaka.me/blog/categories/fen-bu-shi-shi-wu/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">分布式事务</a>,&nbsp;<a href="http://skaka.me/blog/categories/wei-fu-wu/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">微服务</a></span></footer></article><article style="margin: 0px 0px 0px 5em; padding: 1em 0px 0.7em 4.5em; border: 0px; font-variant-numeric: inherit; font-stretch: inherit; line-height: 27.6px; font-family: &quot;PT Serif&quot;, Georgia, Times, &quot;Times New Roman&quot;, serif; font-size: 18.4px; vertical-align: baseline; position: relative; color: #aaaaaa; background: none #f8f8f8;"><h1><a href="http://skaka.me/blog/2016/03/19/finagle1/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: normal; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 27.6px; vertical-align: baseline; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word; text-decoration: none; display: inline-block;">微服务框架Finagle介绍 Part1: Future, Service, Filter</a></h1><time datetime="2016-03-19T21:33:12+08:00" pubdate="" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.2em; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 0.9em; vertical-align: baseline; position: absolute; text-align: right; left: 0em; top: 1.8em;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block; text-transform: uppercase;">MAR</span>&nbsp;<span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 16.56px; vertical-align: baseline; display: inline-block;">19</span></time><footer style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: &quot;PT Sans&quot;, &quot;Helvetica Neue&quot;, Arial, sans-serif; font-size: 18.4px; vertical-align: baseline;"><span style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; font-size: 18.4px; vertical-align: baseline;">posted in&nbsp;<a href="http://skaka.me/blog/categories/finagle/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">finagle</a>,&nbsp;<a href="http://skaka.me/blog/categories/wei-fu-wu/" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: 1.1em; font-size: 18.4px; vertical-align: baseline; color: #aaaaaa; transition: color 0.3s; white-space: pre-wrap; word-wrap: break-word;">微服务</a></span></footer></article><img src ="http://www.blogjava.net/paulwong/aggbug/431788.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> 2016-09-11 20:49 <a href="http://www.blogjava.net/paulwong/archive/2016/09/11/431788.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JHipster</title><link>http://www.blogjava.net/paulwong/archive/2016/09/11/431787.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 11 Sep 2016 08:40:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2016/09/11/431787.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/431787.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2016/09/11/431787.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/431787.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/431787.html</trackback:ping><description><![CDATA[基于SPRING CLOUD的微服务框架<br /><a href="http://jhipster.cn/" target="_blank">http://jhipster.cn/</a><img src ="http://www.blogjava.net/paulwong/aggbug/431787.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> 2016-09-11 16:40 <a href="http://www.blogjava.net/paulwong/archive/2016/09/11/431787.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring Boot 性能优化</title><link>http://www.blogjava.net/paulwong/archive/2016/09/11/431786.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 11 Sep 2016 08:37:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2016/09/11/431786.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/431786.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2016/09/11/431786.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/431786.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/431786.html</trackback:ping><description><![CDATA[<div style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; padding: 10px 20px; margin: 15px 0px; line-height: 1.8; word-break: break-all; color: #333333; font-family: &quot;Pingfang SC&quot;, STHeiti, &quot;Lantinghei SC&quot;, &quot;Open Sans&quot;, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei&quot;, &quot;WenQuanYi Micro Hei&quot;, SimSun, sans-serif; background: #f8f8f8;"><strong style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; font-size: 1.6rem;">摘要</strong><div style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; font-size: 1.4rem; color: #666666;">Spring 框架给企业软件开发者提供了常见问题的通用解决方案，包括那些在未来开发中没有意识到的问题。但是，它构建的 J2EE 项目变得越来越臃肿，逐渐被 Spring Boot 所替代。Spring Boot 让我们创建和运行项目变得更为迅速，现在已经有越来越多的人使用它。我们已经在几个项目中使用了 Spring Boot ，今天我们就来一起讨论一下如何改进 Spring Boot 应用的性能。</div></div><div style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; font-size: 1.6rem; font-family: &quot;Pingfang SC&quot;, STHeiti, &quot;Lantinghei SC&quot;, &quot;Open Sans&quot;, Arial, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei&quot;, &quot;WenQuanYi Micro Hei&quot;, SimSun, sans-serif; word-wrap: break-word; color: #3d464d; line-height: 30px; margin-top: 30px;"><val data-name="blog_content_type" data-value="markdown" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"></val><val data-name="markedJs" data-value="/dist/www/vendor/think-md/0.1.0/javascripts/marked.js?t=1471280768000" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"></val><div style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;"><strong style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">Spring 框架给企业软件开发者提供了常见问题的通用解决方案，包括那些在未来开发中没有意识到的问题。但是，它构建的 J2EE 项目变得越来越臃肿，逐渐被 Spring Boot 所替代。Spring Boot 让我们创建和运行项目变得更为迅速，现在已经有越来越多的人使用它。我们已经在几个项目中使用了 Spring Boot ，今天我们就来一起讨论一下如何改进 Spring Boot 应用的性能。</strong></p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">首先，从之前我在开发中遇到的一个问题说起。在一次查看项目运行日志的时候，我偶然发现了一个问题，日志里显示这个项目总是加载 Velocity 模板引擎，但实际上这个项目是一个没有 web 页面的 REST Service 项目。于是我花了一点时间去寻找产生这个问题的原因，以及如何改进 Spring Boot 应用的性能。在查找了相关的资料后，我得出的结论如下：</p><h2>组件自动扫描带来的问题</h2><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">默认情况下，我们会使用&nbsp;<a href="http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/SpringBootApplication.html" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; outline: 0px; border: none; text-decoration: none; color: #4466bb; transition: color 0.3s;">@SpringBootApplication</a>&nbsp;注解来自动获取的应用的配置信息，但这样也会给应用带来一些副作用。使用这个注解后，会触发自动配置（&nbsp;<a href="http://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/EnableAutoConfiguration.html" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; outline: 0px; border: none; text-decoration: none; color: #4466bb; transition: color 0.3s;">auto-configuration</a>&nbsp;）和 组件扫描 （&nbsp;<a href="http://docs.spring.io/spring-framework/docs/4.2.4.RELEASE/javadoc-api/org/springframework/context/annotation/ComponentScan.html?is-external=true" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; outline: 0px; border: none; text-decoration: none; color: #4466bb; transition: color 0.3s;">component scanning</a>），这跟使用 @Configuration、@EnableAutoConfiguration 和 @ComponentScan 三个注解的作用是一样的。这样做给开发带来方便的同时，也会有两方面的影响：</p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">1、会导致项目启动时间变长。当启动一个大的应用程序,或将做大量的集成测试启动应用程序时，影响会特别明显。</p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">2、会加载一些不需要的多余的实例（beans）。</p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">3、会增加 CPU 消耗。</p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">针对以上两个情况，我们可以移除 @SpringBootApplication 和 @ComponentScan 两个注解来禁用组件自动扫描，然后在我们需要的 bean 上进行显式配置：<br /><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;移除&nbsp;@SpringBootApplication&nbsp;and&nbsp;@ComponentScan,&nbsp;用&nbsp;@EnableAutoConfiguration&nbsp;来替代</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">@Configuration<br />@EnableAutoConfiguration<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;SampleWebUiApplication&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;<img src="http://www.blogjava.net/Images/dot.gif"  alt="" /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;用&nbsp;@Bean&nbsp;注解明确显式配置，以便被&nbsp;Spring&nbsp;扫描到</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;&nbsp;@Bean<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;MessageController&nbsp;messageController(MessageRepository&nbsp;messageRepository)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">return</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;MessageController(messageRepository);<br />&nbsp;&nbsp;&nbsp;&nbsp;}</span></div><h2>如何避免组件自动扫描带来的问题</h2><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">我们在上面提到，@SpringBootApplication 注解的作用跟 @EnableAutoConfiguration 注解的作用是相当的，那就意味着它也能带来上述的三个问题。要避免这些问题，我们就要知道我们需要的组件列表是哪些，可以用 -Ddebug 的方式来帮助我们明确地定位：</p><pre haml"="" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; overflow-x: auto; padding: 2px; color: #777777; border-radius: 3px; line-height: 1.4; word-wrap: normal; background: #fdf6e3;"><code haml"="" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; display: block; overflow-x: auto; padding: 10px; border-radius: 4px; line-height: 1.4; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;">mvn spring-boot:run -Ddebug &#8230; =<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">======================== </span>AUTO-CONFIGURATION REPORT =<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">======================== </span>  Positive matches: -<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">---------------- </span>    DispatcherServletAutoConfiguration       -<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"> @ConditionalOnClass classes </span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #cb4b16;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;">found:</span></span></span><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"> org.springframework.web.servlet.DispatcherServlet (OnClassCondition) </span></span>      -<span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent;"> found web application StandardServletEnvironment (OnWebApplicationCondition) </span> ... </code></pre><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">接着拷贝&nbsp;<code style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; border-radius: 3px; padding: 2px; color: #777777; background: #fdf6e3;">Positive matches</code>&nbsp;中列出的信息：</p><pre nginx"="" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; overflow-x: auto; padding: 2px; color: #777777; border-radius: 3px; line-height: 1.4; word-wrap: normal; background: #fdf6e3;"><code nginx"="" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; display: block; overflow-x: auto; padding: 10px; border-radius: 4px; line-height: 1.4; word-wrap: normal; background-image: initial; background-attachment: initial; background-size: initial; background-origin: initial; background-clip: initial; background-position: initial; background-repeat: initial;"><span style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; color: #b58900;">DispatcherServletAutoConfiguration</span> <br />EmbeddedServletContainerAutoConfiguration <br />ErrorMvcAutoConfiguration <br />HttpEncodingAutoConfiguration <br />HttpMessageConvertersAutoConfiguration <br />JacksonAutoConfiguration <br />JmxAutoConfiguration <br />MultipartAutoConfiguration <br />ServerPropertiesAutoConfiguration <br />PropertyPlaceholderAutoConfiguration <br />ThymeleafAutoConfiguration <br />WebMvcAutoConfiguration <br />WebSocketAutoConfiguration </code></pre><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">然后来更新项目配置，显式地引入这些组件，引入之后，再运行一下应用确保没有错误发生：<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">@Configuration<br />@Import({<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DispatcherServletAutoConfiguration.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EmbeddedServletContainerAutoConfiguration.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ErrorMvcAutoConfiguration.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpEncodingAutoConfiguration.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;HttpMessageConvertersAutoConfiguration.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JacksonAutoConfiguration.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JmxAutoConfiguration.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MultipartAutoConfiguration.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ServerPropertiesAutoConfiguration.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PropertyPlaceholderAutoConfiguration.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ThymeleafAutoConfiguration.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebMvcAutoConfiguration.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WebSocketAutoConfiguration.</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">,<br />})<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;SampleWebUiApplication&nbsp;{}</span></div><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;"><br />在上面的代码中，我们可以删掉我们不需要的组件信息，来提高应用的性能，比如在我的项目中，不需要 JMX 和 WebSocket 功能，我就删掉了它们。删掉之后，再次运行项目，确保一切正常。</p><h2>将Servlet容器变成Undertow</h2><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">默认情况下，Spring Boot 使用 Tomcat 来作为内嵌的 Servlet 容器。我们可以启动项目，然后用 VisualVM 或者 JConsole 来查看应用所占的内存情况：</p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;"><img src="http://news.oneapm.com/content/images/2016/01/14518776514212.jpg" alt="Spring Boot 性能优化" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; border: none; margin: auto; max-width: 80%; height: auto;" /></p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">以上是我使用 Spring Boot 的默认方式启动应用后，用 VisualVM 监控到的内存的占用情况：堆内存占用 110M，16 个线程被开启。</p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">可以将&nbsp;<a href="http://docs.spring.io/spring-boot/docs/current/reference/html/howto-embedded-servlet-containers.html#howto-use-undertow-instead-of-tomcat" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; outline: 0px; border: none; text-decoration: none; color: #4466bb; transition: color 0.3s;">Web 服务器切换到 Undertow 来提高应用性能</a>。Undertow 是一个采用 Java 开发的灵活的高性能 Web 服务器，提供包括阻塞和基于 NIO 的非堵塞机制。Undertow 是红帽公司的开源产品，是 Wildfly 默认的 Web 服务器。首先，从依赖信息里移除 Tomcat 配置：<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">exclusions</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; ">exclusion</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">org.springframework.boot</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">spring-boot-starter-tomcat</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">exclusion</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">exclusions</span><span style="color: #0000FF; ">&gt;</span></div><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;"><br />然后添加 Undertow：<br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">org.springframework.boot</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; ">spring-boot-starter-undertow</span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><span style="color: #000000; "><br /></span><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span></div><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;"><br /></p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">启动项目后，用 VisualVM 监控到的信息显示：堆内存占用 90M，13个线程被开启。</p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;"><img src="http://news.oneapm.com/content/images/2016/01/14518783035912.jpg" alt="Spring Boot 性能优化" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; border: none; margin: auto; max-width: 80%; height: auto;" /></p><h2>总结</h2><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">这些都是我们在项目开发中使用到的一些优化 Spring Boot 应用的小技巧，对于大的应用性能的提高还是很明显的。大家可以尝试一下，然后告诉<a href="http://club.oneapm.com/c/Ai/java" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; outline: 0px; border: none; text-decoration: none; color: #4466bb; transition: color 0.3s;">我们</a>你的测试结果。</p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">最后，附上代码，大家可以去这里下载：<a href="https://github.com/alexec/spring-boot-performance" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; outline: 0px; border: none; text-decoration: none; color: #4466bb; transition: color 0.3s;">spring-boot-performance</a>。</p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">文中大部分内容参考英国一个架构师的<a href="http://www.alexecollins.com/" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; outline: 0px; border: none; text-decoration: none; color: #4466bb; transition: color 0.3s;">博客</a>&nbsp;和&nbsp;<a href="https://dzone.com/java-jdk-development-tutorials-tools-news" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; outline: 0px; border: none; text-decoration: none; color: #4466bb; transition: color 0.3s;">DZone</a>&nbsp;近期发布的文章，在此感谢两位大牛。参考文章及链接：</p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">（1）Spring Boot 性能优化：<a href="http://www.alexecollins.com/spring-boot-performance/" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; outline: 0px; border: none; text-decoration: none; color: #4466bb; transition: color 0.3s;">Spring Boot Performance</a>；</p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">（2）Spring Boot 内存优化：<a href="https://dzone.com/articles/spring-boot-memory-performance" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; outline: 0px; border: none; text-decoration: none; color: #4466bb; transition: color 0.3s;">Spring Boot Memory Performance</a>。</p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">（3）<a href="https://www.techempower.com/benchmarks/" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; outline: 0px; border: none; text-decoration: none; color: #4466bb; transition: color 0.3s;">https://www.techempower.com/benchmarks/</a>；</p><p style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; margin-bottom: 16px;">（4）Spring 应用程序优化：<a href="https://cloud.google.com/appengine/articles/spring_optimization" style="box-sizing: inherit; -webkit-tap-highlight-color: transparent; outline: 0px; border: none; text-decoration: none; color: #4466bb; transition: color 0.3s;">Optimizing Spring Framework for App Engine Applications</a>。</p></div></div><img src ="http://www.blogjava.net/paulwong/aggbug/431786.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> 2016-09-11 16:37 <a href="http://www.blogjava.net/paulwong/archive/2016/09/11/431786.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>