http://git-wip-us.apache.org/repos/asf/incubator-rocketmq-site/blob/af2718af/content/feed.xml
----------------------------------------------------------------------
diff --cc content/feed.xml
index e0d0732,0000000..da361bc
mode 100644,000000..100644
--- a/content/feed.xml
+++ b/content/feed.xml
@@@ -1,935 -1,0 +1,935 @@@
- <?xml version="1.0" encoding="utf-8"?><feed 
xmlns="http://www.w3.org/2005/Atom"; ><generator uri="https://jekyllrb.com/"; 
version="3.4.3">Jekyll</generator><link href="/feed.xml" rel="self" 
type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" 
/><updated>2017-06-08T17:34:10+08:00</updated><id>/</id><title 
type="html">Apache RocketMQ</title><subtitle>The homepage of 
RocketMQ.</subtitle><author><name>{&quot;name&quot;=&gt;nil, 
&quot;avatar&quot;=&gt;&quot;/assets/images/rmq-logo.png&quot;, 
&quot;bio&quot;=&gt;&quot;A fast, low latency, reliable, scalable, distributed 
MOM.&quot;, &quot;location&quot;=&gt;&quot;Hangzhou, China&quot;, 
&quot;email&quot;=&gt;&quot;[email protected]&quot;, 
&quot;uri&quot;=&gt;&quot;http://incubator.staging.apache.org/projects/rocketmq.html&quot;,
 &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, 
&quot;dribbble&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, 
&quot;facebook&quot;=&gt;nil, &quot;foursquare&quot;=&gt;
 nil, &quot;github&quot;=&gt;&quot;apache/incubator-rocketmq&quot;, 
&quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, 
&quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, 
&quot;linkedin&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, 
&quot;soundcloud&quot;=&gt;nil, 
&quot;stackoverflow&quot;=&gt;&quot;questions/tagged/rocketmq&quot;, 
&quot;steam&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, 
&quot;twitter&quot;=&gt;&quot;ApacheRocketMQ&quot;, &quot;vine&quot;=&gt;nil, 
&quot;weibo&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, 
&quot;youtube&quot;=&gt;nil, 
&quot;quora&quot;=&gt;&quot;topic/RocketMQ&quot;}</name><email>[email protected]</email><uri>http://incubator.staging.apache.org/projects/rocketmq.html</uri></author><entry><title
 type="html">Release Notes - Apache RocketMQ - Version 
4.1.0-incubating</title><link href="/release-notes-4.1.0-incubating/" 
rel="alternate" type="text/html" title="Release Notes - Apache RocketMQ - 
Version 4.1.0-incubating" /><published
 >2017-06-02T00:00:00+08:00</published><updated>2017-06-02T00:00:00+08:00</updated><id>/release-notes-4.1.0-incubating</id><content
 > type="html" xml:base="/release-notes-4.1.0-incubating/">&lt;p&gt;Release 
 >Notes - Apache RocketMQ - Version 4.1.0-incubating&lt;/p&gt;
++<?xml version="1.0" encoding="utf-8"?><feed 
xmlns="http://www.w3.org/2005/Atom"; ><generator uri="https://jekyllrb.com/"; 
version="3.4.3">Jekyll</generator><link href="/feed.xml" rel="self" 
type="application/atom+xml" /><link href="/" rel="alternate" type="text/html" 
/><updated>2017-06-08T18:09:33+08:00</updated><id>/</id><title 
type="html">Apache RocketMQ</title><subtitle>The homepage of 
RocketMQ.</subtitle><author><name>{&quot;name&quot;=&gt;nil, 
&quot;avatar&quot;=&gt;&quot;/assets/images/rmq-logo.png&quot;, 
&quot;bio&quot;=&gt;&quot;A fast, low latency, reliable, scalable, distributed 
MOM.&quot;, &quot;location&quot;=&gt;&quot;Hangzhou, China&quot;, 
&quot;email&quot;=&gt;&quot;[email protected]&quot;, 
&quot;uri&quot;=&gt;&quot;http://incubator.staging.apache.org/projects/rocketmq.html&quot;,
 &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, 
&quot;dribbble&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, 
&quot;facebook&quot;=&gt;nil, &quot;foursquare&quot;=&gt;
 nil, &quot;github&quot;=&gt;&quot;apache/incubator-rocketmq&quot;, 
&quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, 
&quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, 
&quot;linkedin&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, 
&quot;soundcloud&quot;=&gt;nil, 
&quot;stackoverflow&quot;=&gt;&quot;questions/tagged/rocketmq&quot;, 
&quot;steam&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, 
&quot;twitter&quot;=&gt;&quot;ApacheRocketMQ&quot;, &quot;vine&quot;=&gt;nil, 
&quot;weibo&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, 
&quot;youtube&quot;=&gt;nil, 
&quot;quora&quot;=&gt;&quot;topic/RocketMQ&quot;}</name><email>[email protected]</email><uri>http://incubator.staging.apache.org/projects/rocketmq.html</uri></author><entry><title
 type="html">Release Notes - Apache RocketMQ - Version 
4.1.0-incubating</title><link href="/release-notes-4.1.0-incubating/" 
rel="alternate" type="text/html" title="Release Notes - Apache RocketMQ - 
Version 4.1.0-incubating" /><published
 >2017-06-02T00:00:00+08:00</published><updated>2017-06-02T00:00:00+08:00</updated><id>/release-notes-4.1.0-incubating</id><content
 > type="html" xml:base="/release-notes-4.1.0-incubating/">&lt;p&gt;Release 
 >Notes - Apache RocketMQ - Version 4.1.0-incubating&lt;/p&gt;
 +
 +&lt;h2 id=&quot;new-feature&quot;&gt;New Feature&lt;/h2&gt;
 +
 +&lt;ul&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-80&quot;&gt;ROCKETMQ-80&lt;/a&gt;]
 - Add batch feature&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-121&quot;&gt;ROCKETMQ-121&lt;/a&gt;]
 - Support message filtering based on SQL92&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-194&quot;&gt;ROCKETMQ-194&lt;/a&gt;]
 - log appender using rocketmq&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-186&quot;&gt;ROCKETMQ-186&lt;/a&gt;]
 - Implement the OpenMessaging specification 0.1.0-alpha version&lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;h2 id=&quot;improvement&quot;&gt;Improvement&lt;/h2&gt;
 +
 +&lt;ul&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-67&quot;&gt;ROCKETMQ-67&lt;/a&gt;]
 - Consistent Hash allocate strategy support&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-99&quot;&gt;ROCKETMQ-99&lt;/a&gt;]
 - Add scripts for Windows platform&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-36&quot;&gt;ROCKETMQ-36&lt;/a&gt;]
 - Improve broker’s GC logs storing&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-39&quot;&gt;ROCKETMQ-39&lt;/a&gt;]
 - Duplicated codes in both filtersrv and namesrv modules&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-86&quot;&gt;ROCKETMQ-86&lt;/a&gt;]
 - Polish the release file format&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-88&quot;&gt;ROCKETMQ-88&lt;/a&gt;]
 - Polish the developer list in pom.xml&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-90&quot;&gt;ROCKETMQ-90&lt;/a&gt;]
 - Include client IP per message queue of consumer progress command 
output&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-114&quot;&gt;ROCKETMQ-114&lt;/a&gt;]
 - Add javadoc to codebase&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-138&quot;&gt;ROCKETMQ-138&lt;/a&gt;]
 - Add AuthenticationException class to remove hard coded Aliyun authentication 
class&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-139&quot;&gt;ROCKETMQ-139&lt;/a&gt;]
 - Degrade the client related modules’ JDK version to 1.6&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-144&quot;&gt;ROCKETMQ-144&lt;/a&gt;]
 - Aggregate distribution specific files to a new module&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-154&quot;&gt;ROCKETMQ-154&lt;/a&gt;]
 - Add a newline after help info&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-160&quot;&gt;ROCKETMQ-160&lt;/a&gt;]
 - SendHeartBeart log may not be triggered in the same expected 
period&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-161&quot;&gt;ROCKETMQ-161&lt;/a&gt;]
 - Update runbroker.sh and runserver.sh to support user defined jvm memory 
flag&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-168&quot;&gt;ROCKETMQ-168&lt;/a&gt;]
 - Duplicated calls of life cycle in Maven.&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-172&quot;&gt;ROCKETMQ-172&lt;/a&gt;]
 - log improvement for rocketmq client&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-176&quot;&gt;ROCKETMQ-176&lt;/a&gt;]
 - Improvement the Maven Central Badge in readme&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-187&quot;&gt;ROCKETMQ-187&lt;/a&gt;]
 - Measure the code coverage for Integration Tests&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-148&quot;&gt;ROCKETMQ-148&lt;/a&gt;]
 - Migrate all relevant docs from the old Github project’s wiki to the ASF 
site&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-218&quot;&gt;ROCKETMQ-218&lt;/a&gt;]
 - Add IT test for Filter By SQL 92&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-219&quot;&gt;ROCKETMQ-219&lt;/a&gt;]
 - Add Batch Example&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-220&quot;&gt;ROCKETMQ-220&lt;/a&gt;]
 - README.md update, remove some github links&lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;h2 id=&quot;bug&quot;&gt;Bug&lt;/h2&gt;
 +
 +&lt;ul&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-77&quot;&gt;ROCKETMQ-77&lt;/a&gt;]
 - [TEST] org.apache.rocketmq.tools.* have NPEs&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-89&quot;&gt;ROCKETMQ-89&lt;/a&gt;]
 - WS_DOMAIN_NAME, SUBGROUP default values overrides custom values passed by 
java options&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-95&quot;&gt;ROCKETMQ-95&lt;/a&gt;]
 - The config files of client log have been damaged&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-98&quot;&gt;ROCKETMQ-98&lt;/a&gt;]
 - Risk of unable to release putMessage Lock forever&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-101&quot;&gt;ROCKETMQ-101&lt;/a&gt;]
 - Possible NullPointerException when retry in send Async way&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-107&quot;&gt;ROCKETMQ-107&lt;/a&gt;]
 - Access ServiceState is not thread safe when start() or shutdown()&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-119&quot;&gt;ROCKETMQ-119&lt;/a&gt;]
 - Shutdown PullMessageService properly&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-140&quot;&gt;ROCKETMQ-140&lt;/a&gt;]
 - Register higher version broker against old name servers&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-143&quot;&gt;ROCKETMQ-143&lt;/a&gt;]
 - Update fastjson from 1.2.12 to 1.2.29&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-153&quot;&gt;ROCKETMQ-153&lt;/a&gt;]
 - Fetch name server address dynamically&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-155&quot;&gt;ROCKETMQ-155&lt;/a&gt;]
 - Fix typo in ClientConfig&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-165&quot;&gt;ROCKETMQ-165&lt;/a&gt;]
 - Maximum pull batch size hard-coded restricted&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-175&quot;&gt;ROCKETMQ-175&lt;/a&gt;]
 - Consumer may miss messages because of inconsistent subscription&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-178&quot;&gt;ROCKETMQ-178&lt;/a&gt;]
 - Broker -m -p options are broken&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-179&quot;&gt;ROCKETMQ-179&lt;/a&gt;]
 - Fix errors of test cases&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-188&quot;&gt;ROCKETMQ-188&lt;/a&gt;]
 - RemotingExecption is not consistent between invoke async and invoke 
oneway&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-189&quot;&gt;ROCKETMQ-189&lt;/a&gt;]
 - Misleading tip on consumeTimestamp and wrong consumeTimestamp exception 
message&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-191&quot;&gt;ROCKETMQ-191&lt;/a&gt;]
 - Fix incorret socket option&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-199&quot;&gt;ROCKETMQ-199&lt;/a&gt;]
 - consumers can not receive stock information.&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-200&quot;&gt;ROCKETMQ-200&lt;/a&gt;]
 - Cluster name is always missing when fetch ClusterInfo from name 
server&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-206&quot;&gt;ROCKETMQ-206&lt;/a&gt;]
 - Load JSON config file error if non-1byte character exists&lt;/li&gt;
 +  &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-208&quot;&gt;ROCKETMQ-208&lt;/a&gt;]
 - incompatibility problem found in enviroment of JDK 1.7 when running 
client&lt;/li&gt;
 +&lt;/ul&gt;</content><author><name>{&quot;name&quot;=&gt;nil, 
&quot;avatar&quot;=&gt;&quot;/assets/images/rmq-logo.png&quot;, 
&quot;bio&quot;=&gt;&quot;A fast, low latency, reliable, scalable, distributed 
MOM.&quot;, &quot;location&quot;=&gt;&quot;Hangzhou, China&quot;, 
&quot;email&quot;=&gt;&quot;[email protected]&quot;, 
&quot;uri&quot;=&gt;&quot;http://incubator.staging.apache.org/projects/rocketmq.html&quot;,
 &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, 
&quot;dribbble&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, 
&quot;facebook&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, 
&quot;github&quot;=&gt;&quot;apache/incubator-rocketmq&quot;, 
&quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, 
&quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, 
&quot;linkedin&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, 
&quot;soundcloud&quot;=&gt;nil, 
&quot;stackoverflow&quot;=&gt;&quot;questions/tagged/rocketmq&quot;, 
&quot;steam&quot;=&gt;nil, &quot;tumblr
 &quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;ApacheRocketMQ&quot;, 
&quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, 
&quot;youtube&quot;=&gt;nil, 
&quot;quora&quot;=&gt;&quot;topic/RocketMQ&quot;}</name><email>[email protected]</email><uri>http://incubator.staging.apache.org/projects/rocketmq.html</uri></author><summary
 type="html">Release Notes - Apache RocketMQ - Version 
4.1.0-incubating</summary></entry><entry><title type="html">Filter Messages By 
SQL92 In RocketMQ</title><link 
href="/rocketmq/filter-messages-by-sql92-in-rocketmq/" rel="alternate" 
type="text/html" title="Filter Messages By SQL92 In RocketMQ" 
/><published>2017-04-26T00:00:00+08:00</published><updated>2017-04-26T00:00:00+08:00</updated><id>/rocketmq/filter-messages-by-sql92-in-rocketmq</id><content
 type="html" 
xml:base="/rocketmq/filter-messages-by-sql92-in-rocketmq/">&lt;p&gt;So far, 
RocketMQ only support message filtering feature by &lt;code 
class=&quot;highlighter-rou
 ge&quot;&gt;TAG&lt;/code&gt;, but one message only can own one tag, this is 
too limited to meet complex business requirements.&lt;/p&gt;
 +
 +&lt;p&gt;So, we want to define and implement a reasonable filter language 
based on a subset of the SQL 92 expression syntax to support customized message 
filtering.&lt;/p&gt;
 +
 +&lt;h3 id=&quot;why-subset-of-sql92&quot;&gt;Why Subset Of SQL92&lt;/h3&gt;
 +
 +&lt;p&gt;Let RocketMQ has the ability of message filtering is the purpose of 
this issue, and as we know, SQL92 is used widely and most persons are familiar 
with it.It’s resonable to select it as RocketMQ’s grammar.&lt;/p&gt;
 +
 +&lt;p&gt;As I know, ActiveMQ already impllement this functionality based on 
JavaCC, it’s simple and exntensible.So I just extract it and integrate into 
RocketMQ, only some grammars:&lt;/p&gt;
 +
 +&lt;ol&gt;
 +  &lt;li&gt;Numeric comparison, like &lt;code 
class=&quot;highlighter-rouge&quot;&gt;&amp;gt;&lt;/code&gt;, &lt;code 
class=&quot;highlighter-rouge&quot;&gt;&amp;gt;=&lt;/code&gt;, &lt;code 
class=&quot;highlighter-rouge&quot;&gt;&amp;lt;&lt;/code&gt;, &lt;code 
class=&quot;highlighter-rouge&quot;&gt;&amp;lt;=&lt;/code&gt;, &lt;code 
class=&quot;highlighter-rouge&quot;&gt;BETWEEN&lt;/code&gt;, &lt;code 
class=&quot;highlighter-rouge&quot;&gt;=&lt;/code&gt;;&lt;/li&gt;
 +  &lt;li&gt;Character comparison, like &lt;code 
class=&quot;highlighter-rouge&quot;&gt;=&lt;/code&gt;, &lt;code 
class=&quot;highlighter-rouge&quot;&gt;&amp;lt;&amp;gt;&lt;/code&gt;, &lt;code 
class=&quot;highlighter-rouge&quot;&gt;IN&lt;/code&gt;;&lt;/li&gt;
 +  &lt;li&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;IS 
NULL&lt;/code&gt; or &lt;code class=&quot;highlighter-rouge&quot;&gt;IS NOT 
NULL&lt;/code&gt;;&lt;/li&gt;
 +  &lt;li&gt;Logical &lt;code 
class=&quot;highlighter-rouge&quot;&gt;AND&lt;/code&gt;, logical &lt;code 
class=&quot;highlighter-rouge&quot;&gt;OR&lt;/code&gt;, logical &lt;code 
class=&quot;highlighter-rouge&quot;&gt;NOT&lt;/code&gt;;&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;p&gt;Constant type are:&lt;/p&gt;
 +
 +&lt;ol&gt;
 +  &lt;li&gt;Numeric, like 123, 3.1415;&lt;/li&gt;
 +  &lt;li&gt;Character, like ‘abc’, must be maked with single 
quotes;&lt;/li&gt;
 +  &lt;li&gt;&lt;code 
class=&quot;highlighter-rouge&quot;&gt;NULL&lt;/code&gt;, special 
constant;&lt;/li&gt;
 +  &lt;li&gt;Boolean, &lt;code 
class=&quot;highlighter-rouge&quot;&gt;TRUE&lt;/code&gt; or &lt;code 
class=&quot;highlighter-rouge&quot;&gt;FALSE&lt;/code&gt;;&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;h3 id=&quot;design&quot;&gt;Design&lt;/h3&gt;
 +&lt;ul&gt;
 +  &lt;li&gt;Structure&lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;p&gt;&lt;img 
src=&quot;/assets/images/blog/filter_structure_apach.png&quot; 
alt=&quot;screenshot&quot; /&gt;&lt;/p&gt;
 +
 +&lt;ol&gt;
 +  &lt;li&gt;Broker collects the expression of consumer through heartbeat 
request, and saved in &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ConsumerFilterManager&lt;/code&gt;.&lt;/li&gt;
 +  &lt;li&gt;When consumer pulls messages, broker will construct a &lt;code 
class=&quot;highlighter-rouge&quot;&gt;MessageFilter&lt;/code&gt;(an interface) 
with compiled expression and subscription data to select matched messages in 
&lt;code 
class=&quot;highlighter-rouge&quot;&gt;CommitLog&lt;/code&gt;.&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;p&gt;The main logic is simple.&lt;/p&gt;
 +
 +&lt;ul&gt;
 +  &lt;li&gt;New Module, rocketmq-filter&lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;p&gt;The implementation of SQL92 language is placed in this module which 
have dependency on common module.&lt;/p&gt;
 +
 +&lt;p&gt;Broker compile or evaluate expression through the interface of 
&lt;code class=&quot;highlighter-rouge&quot;&gt;FilterSpi&lt;/code&gt; 
contained in &lt;code 
class=&quot;highlighter-rouge&quot;&gt;FilterFactory&lt;/code&gt; that manage 
all &lt;code class=&quot;highlighter-rouge&quot;&gt;FilterSpi&lt;/code&gt; and 
also support new one to register.&lt;/p&gt;
 +
 +&lt;ul&gt;
 +  &lt;li&gt;How to manage consumer’s expression data&lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;p&gt;Different from tag filtering, expression of SQL92 should be compiled 
first to check whether is leagal and then use the complied expression to 
compute. This procedure is designed to take place at broker.&lt;/p&gt;
 +
 +&lt;p&gt;&lt;code 
class=&quot;highlighter-rouge&quot;&gt;ConsumerManager&lt;/code&gt; manage the 
suscriptions of push consumer, and &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ConsumerFilterManager&lt;/code&gt; 
manage the expression info of push consumer who wish to filter message by 
special language, the info includes data version, expression, compiled 
expression, alive time and etc.&lt;/p&gt;
 +
 +&lt;ul&gt;
 +  &lt;li&gt;How to filter message by expression&lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;p&gt;I redesign the interface &lt;code 
class=&quot;highlighter-rouge&quot;&gt;getMessage&lt;/code&gt; of &lt;code 
class=&quot;highlighter-rouge&quot;&gt;MessageStore&lt;/code&gt; by replace the 
last parameter &lt;code 
class=&quot;highlighter-rouge&quot;&gt;SubscriptionData&lt;/code&gt; to 
&lt;code class=&quot;highlighter-rouge&quot;&gt;MessageFilter&lt;/code&gt; that 
is also refactored. The purpose is to make module &lt;code 
class=&quot;highlighter-rouge&quot;&gt;rocketmq-store&lt;/code&gt; has no 
relation with protocol.&lt;/p&gt;
 +
 +&lt;p&gt;When get message, the implementation &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ExpressionMessageFilter&lt;/code&gt; 
would check whether the message is matched by &lt;code 
class=&quot;highlighter-rouge&quot;&gt;BitsArray&lt;/code&gt; which will be 
refered later or evaluation, just as the mechanism of tag filtering.&lt;/p&gt;
 +
 +&lt;ul&gt;
 +  &lt;li&gt;Optimization, pre-calculate the filtering result when build 
consume queue&lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;p&gt;It’s poor performance to do filter when pull message:&lt;/p&gt;
 +
 +&lt;ol&gt;
 +  &lt;li&gt;off-heap to heap, once every consumer subscribed same topic pull 
message.&lt;/li&gt;
 +  &lt;li&gt;decode message properties, once every consumer subscribed same 
topic pull message.&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;p&gt;&lt;code 
class=&quot;highlighter-rouge&quot;&gt;BloomFilter&lt;/code&gt; and 
pre-calculation are adopted to optimize the situation:&lt;/p&gt;
 +
 +&lt;p&gt;&lt;img 
src=&quot;/assets/images/blog/filter_build_cq_apache.png&quot; 
alt=&quot;screenshot&quot; /&gt;&lt;/p&gt;
 +
 +&lt;ol&gt;
 +  &lt;li&gt;Every consumer has been asigned some bit position of &lt;code 
class=&quot;highlighter-rouge&quot;&gt;BloomFilter&lt;/code&gt; when register 
to broker.&lt;/li&gt;
 +  &lt;li&gt;When broker build queue after message into &lt;code 
class=&quot;highlighter-rouge&quot;&gt;CommitLog&lt;/code&gt;, the consumer’s 
filtering result would be calculated, and all resuls are assembled as a 
&lt;code class=&quot;highlighter-rouge&quot;&gt;BitsArray&lt;/code&gt; saved in 
&lt;code 
class=&quot;highlighter-rouge&quot;&gt;ConsumeQueueExt&lt;/code&gt;.&lt;/li&gt;
 +  &lt;li&gt;&lt;code 
class=&quot;highlighter-rouge&quot;&gt;ConsumeQueueExt&lt;/code&gt; is a store 
file linked to &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ConsumeQueue&lt;/code&gt;, &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ConsumeQueue&lt;/code&gt; could find the 
data by the &lt;code 
class=&quot;highlighter-rouge&quot;&gt;tagsCode&lt;/code&gt; whitch is already 
replaced by the address(for compitable, the range is Long.MIN_VALUE to 
Integer.MIN_VALUE) generated by &lt;code 
class=&quot;highlighter-rouge&quot;&gt;ConsumeQueueExt&lt;/code&gt;.&lt;/li&gt;
 +  &lt;li&gt;&lt;code 
class=&quot;highlighter-rouge&quot;&gt;ExpressionMessageFilter&lt;/code&gt; 
could use the &lt;code 
class=&quot;highlighter-rouge&quot;&gt;BitsArray&lt;/code&gt; to check whether 
the message is matched. Because of BloomFilter’s collision, it also need to 
decode properties to do calculation for matched message(may could be reduced by 
check the collision, not include in this edition).&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;p&gt;This optimization is suitable for:&lt;/p&gt;
 +
 +&lt;ol&gt;
 +  &lt;li&gt;High subscription ratio.&lt;/li&gt;
 +  &lt;li&gt;Large properties.&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;p&gt;This optimization is off default, it need set some configs when 
broker starting to switch on:&lt;/p&gt;
 +
 +&lt;ol&gt;
 +  &lt;li&gt;enableCalcFilterBitMap = true, means to caculate bitmap when 
build consume queue.&lt;/li&gt;
 +  &lt;li&gt;expectConsumerNumUseFilter = XX(Integer, default is 32), means 
estimated consumer num subscribe same topic.&lt;/li&gt;
 +  &lt;li&gt;maxErrorRateOfBloomFilter = XX(1~100, default is 20), means error 
rate of bloom filter.&lt;/li&gt;
 +  &lt;li&gt;enableConsumeQueueExt = true, means construct consume queue 
extend file.&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;h3 id=&quot;interface&quot;&gt;Interface&lt;/h3&gt;
 +
 +&lt;p&gt;Only push consumer could filter message by SQL92 expression in this 
edition, the interface is:&lt;/p&gt;
 +
 +&lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;public void 
subscribe(final String topic, final MessageSelector 
messageSelector)&lt;/code&gt;&lt;/p&gt;
 +
 +&lt;h3 id=&quot;performance-comparison&quot;&gt;Performance 
Comparison&lt;/h3&gt;
 +
 +&lt;p&gt;Configuration of broker machine: 32 core, 128G memory, 1000Mb/s full 
duplex dual network&lt;/p&gt;
 +
 +&lt;p&gt;Producer send message with 1k body and 1k properties.&lt;/p&gt;
 +
 +&lt;p&gt;Five consumers consume message through push model, every consumer 
would get 1/5 messages of total.&lt;/p&gt;
 +
 +&lt;p&gt;Cpu and gc frequency is about 30% lower when do pre-calculate 
filtering result.&lt;/p&gt;</content><author><name>{&quot;name&quot;=&gt;nil, 
&quot;avatar&quot;=&gt;&quot;/assets/images/rmq-logo.png&quot;, 
&quot;bio&quot;=&gt;&quot;A fast, low latency, reliable, scalable, distributed 
MOM.&quot;, &quot;location&quot;=&gt;&quot;Hangzhou, China&quot;, 
&quot;email&quot;=&gt;&quot;[email protected]&quot;, 
&quot;uri&quot;=&gt;&quot;http://incubator.staging.apache.org/projects/rocketmq.html&quot;,
 &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, 
&quot;dribbble&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, 
&quot;facebook&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, 
&quot;github&quot;=&gt;&quot;apache/incubator-rocketmq&quot;, 
&quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, 
&quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, 
&quot;linkedin&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, 
&quot;soundcloud&quot;=&gt;nil, &quot;stackoverflow&q
 uot;=&gt;&quot;questions/tagged/rocketmq&quot;, &quot;steam&quot;=&gt;nil, 
&quot;tumblr&quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;ApacheRocketMQ&quot;, 
&quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, 
&quot;youtube&quot;=&gt;nil, 
&quot;quora&quot;=&gt;&quot;topic/RocketMQ&quot;}</name><email>[email protected]</email><uri>http://incubator.staging.apache.org/projects/rocketmq.html</uri></author><category
 term="RocketMQ" /><category term="Filter" /><summary type="html">So far, 
RocketMQ only support message filtering feature by TAG, but one message only 
can own one tag, this is too limited to meet complex business 
requirements.</summary></entry><entry><title type="html">Launch The Second 
RocketMQ Code Marathon</title><link 
href="/activity/launch-rocketmq-code-marathon/" rel="alternate" 
type="text/html" title="Launch The Second RocketMQ Code Marathon" 
/><published>2017-03-31T00:00:00+08:00</published><updated>2017-03-31T00:00:00+08:00</upd
 ated><id>/activity/launch-rocketmq-code-marathon</id><content type="html" 
xml:base="/activity/launch-rocketmq-code-marathon/">&lt;p&gt;&lt;img 
src=&quot;/assets/images/blog/banner.jpg&quot; alt=&quot;Banner&quot; 
/&gt;&lt;/p&gt;
 +&lt;h1 id=&quot;rocketmq-code-marathon-&quot;&gt;ROCKETMQ CODE MARATHON &lt;a 
href=&quot;/assets/attachment/launch-second-rocketmq-code-marathon.pdf&quot;&gt;&lt;i
 class=&quot;fa fa-link&quot;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h1&gt;
 +&lt;h5 id=&quot;march-29th-2017&quot;&gt;March 29th 2017&lt;/h5&gt;
 +
 +&lt;h2 id=&quot;objective&quot;&gt;Objective:&lt;/h2&gt;
 +&lt;ol&gt;
 +  &lt;li&gt;Foster Community&lt;/li&gt;
 +  &lt;li&gt;Prosper Ecology&lt;/li&gt;
 +  &lt;li&gt;Incubate Committers&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;h2 id=&quot;output&quot;&gt;Output:&lt;/h2&gt;
 +&lt;ol&gt;
 +  &lt;li&gt;1~3 Milestone Releases Per Project&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;h2 id=&quot;rewards&quot;&gt;Rewards:&lt;/h2&gt;
 +&lt;ol&gt;
 +  &lt;li&gt;Two Potential Committers Candidates Per Project&lt;/li&gt;
 +  &lt;li&gt;Free Offers to Active Participants for On-Site Meetup
 +    &lt;h2 id=&quot;projects&quot;&gt;PROJECTS&lt;/h2&gt;
 +  &lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;h3 id=&quot;rocketmq-big-data&quot;&gt;RocketMQ-Big Data&lt;/h3&gt;
 +&lt;ol&gt;
 +  &lt;li&gt;Integration of big data analysis framework&lt;/li&gt;
 +  &lt;li&gt;Rich Documentation and Good Test Cases Coverage&lt;/li&gt;
 +  &lt;li&gt;Apache Beam preferred&lt;/li&gt;
 +  &lt;li&gt;Join by Creating Pull Requests against &lt;a 
href=&quot;https://github.com/apache/incubator-rocketmq-externals&quot;&gt;RocketMQ
 Beam Repository&lt;/a&gt;&lt;/li&gt;
 +  &lt;li&gt;Join by Creating Pull Requests against &lt;a 
href=&quot;https://github.com/apache/incubator-rocketmq-externals&quot;&gt;RocketMQ
 Flink Repository&lt;/a&gt;&lt;/li&gt;
 +  &lt;li&gt;Join by Existing Pull Request against &lt;a 
href=&quot;https://github.com/apache/storm/pull/2024&quot;&gt;RocketMQ Storm 
Repository&lt;/a&gt;&lt;/li&gt;
 +  &lt;li&gt;Join by Existing Pull Request against &lt;a 
href=&quot;https://github.com/apache/incubator-rocketmq-externals/pull/5&quot;&gt;RocketMQ
 Spark Repository&lt;/a&gt;&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;h3 id=&quot;rocketmq-client-sdk&quot;&gt;RocketMQ-Client SDK&lt;/h3&gt;
 +&lt;ol&gt;
 +  &lt;li&gt;Development of RocketMQ Client&lt;/li&gt;
 +  &lt;li&gt;Rich Documentation and Good Test Cases Coverage&lt;/li&gt;
 +  &lt;li&gt;Go preferred&lt;/li&gt;
 +  &lt;li&gt;Join by Creating Pull Requests against &lt;a 
href=&quot;https://github.com/apache/incubator-rocketmq-externals&quot;&gt;RocketMQ
 Go Repository&lt;/a&gt;&lt;/li&gt;
 +  &lt;li&gt;Join by Creating Pull Requests against &lt;a 
href=&quot;https://github.com/apache/incubator-rocketmq-externals&quot;&gt;RocketMQ
 .Net Repository&lt;/a&gt;&lt;/li&gt;
 +  &lt;li&gt;Join by Creating Pull Requests against &lt;a 
href=&quot;https://github.com/apache/incubator-rocketmq-externals&quot;&gt;RocketMQ
 PHP Repository&lt;/a&gt;&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;h3 id=&quot;rocketmq-data-replication&quot;&gt;RocketMQ-Data 
Replication&lt;/h3&gt;
 +&lt;ol&gt;
 +  &lt;li&gt;Implement Data Replication from Database&lt;/li&gt;
 +  &lt;li&gt;Rich Documentation and Good Test Cases Coverage&lt;/li&gt;
 +  &lt;li&gt;MySQL preferred&lt;/li&gt;
 +  &lt;li&gt;Join by Creating Pull Requests against &lt;a 
href=&quot;https://github.com/apache/incubator-rocketmq-externals&quot;&gt;RocketMQ
 MySQL Repository&lt;/a&gt;&lt;/li&gt;
 +  &lt;li&gt;Join by Creating Pull Requests against &lt;a 
href=&quot;https://github.com/apache/incubator-rocketmq-externals&quot;&gt;RocketMQ
 Redis Repository&lt;/a&gt;&lt;/li&gt;
 +  &lt;li&gt;Join by Creating Pull Requests against &lt;a 
href=&quot;https://github.com/apache/incubator-rocketmq-externals&quot;&gt;RocketMQ
 MongoDB Repository&lt;/a&gt;&lt;/li&gt;
 +&lt;/ol&gt;</content><author><name>{&quot;name&quot;=&gt;nil, 
&quot;avatar&quot;=&gt;&quot;/assets/images/rmq-logo.png&quot;, 
&quot;bio&quot;=&gt;&quot;A fast, low latency, reliable, scalable, distributed 
MOM.&quot;, &quot;location&quot;=&gt;&quot;Hangzhou, China&quot;, 
&quot;email&quot;=&gt;&quot;[email protected]&quot;, 
&quot;uri&quot;=&gt;&quot;http://incubator.staging.apache.org/projects/rocketmq.html&quot;,
 &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, 
&quot;dribbble&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, 
&quot;facebook&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, 
&quot;github&quot;=&gt;&quot;apache/incubator-rocketmq&quot;, 
&quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, 
&quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, 
&quot;linkedin&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, 
&quot;soundcloud&quot;=&gt;nil, 
&quot;stackoverflow&quot;=&gt;&quot;questions/tagged/rocketmq&quot;, 
&quot;steam&quot;=&gt;nil, &quot;tumblr
 &quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;ApacheRocketMQ&quot;, 
&quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, 
&quot;youtube&quot;=&gt;nil, 
&quot;quora&quot;=&gt;&quot;topic/RocketMQ&quot;}</name><email>[email protected]</email><uri>http://incubator.staging.apache.org/projects/rocketmq.html</uri></author><category
 term="Activity" /><category term="Code" /><category term="Marathon" /><summary 
type="html">ROCKETMQ CODE MARATHON March 29th 
2017</summary></entry><entry><title type="html">The Correct Posture Of 
Submitting Pull Request</title><link 
href="/the-correct-posture-of-submitting-pull-request/" rel="alternate" 
type="text/html" title="The Correct Posture Of Submitting Pull Request" 
/><published>2017-03-24T00:00:00+08:00</published><updated>2017-03-24T00:00:00+08:00</updated><id>/the-correct-posture-of-submitting-pull-request</id><content
 type="html" xml:base="/the-correct-posture-of-submitting-pull-request/">&lt;h2 
id=&quot;the-c
 orrect-posture-of-submitting-a-pr&quot;&gt;The correct posture of submitting a 
PR&lt;/h2&gt;
 +
 +&lt;h3 id=&quot;prepare-the-repo&quot;&gt;Prepare the repo&lt;/h3&gt;
 +&lt;ul&gt;
 +  &lt;li&gt;fork the apache repo on Github
 +&lt;img 
src=&quot;http://img3.tbcdn.cn/5476e8b07b923/TB17G5kQpXXXXcUapXXXXXXXXXX&quot; 
alt=&quot;&quot; /&gt;
 +Click the “fork” button, a forked repo will be added to your repo 
list.&lt;/li&gt;
 +  &lt;li&gt;clone the forked repo, here take “foo” as example
 +    &lt;blockquote&gt;
 +      &lt;p&gt;git clone  
https://github.com/foo/incubator-rocketmq.git&lt;/p&gt;
 +    &lt;/blockquote&gt;
 +  &lt;/li&gt;
 +  &lt;li&gt;add apache remote repo
 +    &lt;blockquote&gt;
 +      &lt;p&gt;git remote add apache 
https://github.com/apache/incubator-rocketmq.git&lt;/p&gt;
 +    &lt;/blockquote&gt;
 +  &lt;/li&gt;
 +  &lt;li&gt;show the remote repos
 +    &lt;blockquote&gt;
 +      &lt;p&gt;git remote -v&lt;br /&gt;
 +apache         https://github.com/apache/incubator-rocketmq.git (fetch)&lt;br 
/&gt;
 +apache         https://github.com/apache/incubator-rocketmq.git (push)&lt;br 
/&gt;
 +origin         https://github.com/foo/incubator-rocketmq.git (fetch)&lt;br 
/&gt;
 +origin         https://github.com/foo/incubator-rocketmq.git (push)&lt;/p&gt;
 +    &lt;/blockquote&gt;
 +  &lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: 
https://github.com/apache/incubator-rocketmq.git is a read-only repo, mirrored 
from git://git.apache.org/incubator-rocketmq.git. For submitting PR, fork this 
read-only repo on Github is OK.&lt;/p&gt;
 +
 +&lt;h3 
id=&quot;use-a-new-branch-to-write-your-own-code-and-commit&quot;&gt;Use a new 
branch to write your own code and commit&lt;/h3&gt;
 +&lt;p&gt;you’d better use a new branch for each PR, for it is convenient to 
manage your code and commits&lt;/p&gt;
 +&lt;blockquote&gt;
 +  &lt;p&gt;git checkout -b new_pr&lt;br /&gt;
 +//do something and commit&lt;/p&gt;
 +&lt;/blockquote&gt;
 +
 +&lt;h3 id=&quot;important-rebase-instead-of-merge&quot;&gt;[Important] Rebase 
instead of merge&lt;/h3&gt;
 +&lt;blockquote&gt;
 +  &lt;p&gt;git fetch apache&lt;br /&gt;
 +git rebase apache/develop&lt;/p&gt;
 +&lt;/blockquote&gt;
 +
 +&lt;p&gt;Note: if using merge, it will dirty the commits&lt;/p&gt;
 +
 +&lt;p&gt;the difference between rebase and merge can refer to:&lt;br /&gt;
 +&lt;a 
href=&quot;https://www.atlassian.com/git/tutorials/merging-vs-rebasing&quot;&gt;https://www.atlassian.com/git/tutorials/merging-vs-rebasing&lt;/a&gt;&lt;/p&gt;
 +
 +&lt;h3 id=&quot;suggestedsquash-the-commits&quot;&gt;[Suggested]Squash the 
commits&lt;/h3&gt;
 +&lt;p&gt;you can code and commit as usual. But when you think it is time to 
submit a PR, it is better to squash your commits into single one, for that 
others can easily identify your PR from the history commits.
 +you can squash as follows:&lt;/p&gt;
 +&lt;blockquote&gt;
 +  &lt;p&gt;gt reset &amp;lt;the latest commit that dose not belong to you 
PR&amp;gt;&lt;br /&gt;
 +git add –all&lt;br /&gt;
 +git commit -m “attach the issue or jira”&lt;br /&gt;
 +git push (if the commits have been already pushed to your remote repo, git 
push will fail , use git push -f instead)&lt;/p&gt;
 +&lt;/blockquote&gt;
 +
 +&lt;p&gt;For example:&lt;/p&gt;
 +&lt;blockquote&gt;
 +  &lt;p&gt;git log&lt;/p&gt;
 +&lt;/blockquote&gt;
 +
 +&lt;p&gt;&lt;img 
src=&quot;https://lh3.googleusercontent.com/-xYoltD_ZDhE/WNTONuq58WI/AAAAAAAAABo/zWZdGVxNVa8/I/14864352604541.jpg&quot;
 alt=&quot;&quot; /&gt;&lt;/p&gt;
 +
 +&lt;blockquote&gt;
 +  &lt;p&gt;git resset b4108d2d9d3b1522e45ac5e7ea37106f2135bfa0 &lt;br /&gt;
 +git commit -m ‘Add batch feature’&lt;br /&gt;
 +git log&lt;/p&gt;
 +&lt;/blockquote&gt;
 +
 +&lt;p&gt;&lt;img 
src=&quot;https://lh3.googleusercontent.com/-Pe_xYIiPAGE/WNTOOHEUd1I/AAAAAAAAABs/VfuT_wBQ5QI/I/14864353798102.jpg&quot;
 alt=&quot;&quot; /&gt;&lt;/p&gt;
 +&lt;blockquote&gt;
 +  &lt;p&gt;git push&lt;/p&gt;
 +&lt;/blockquote&gt;
 +
 +&lt;h3 id=&quot;attach-jira-or-issue&quot;&gt;Attach jira or issue&lt;/h3&gt;
 +&lt;p&gt;For now, we have finished the preparations of a PR. It is time to 
create it. For apache projects, we could attach the jira issue using specific 
title like “[XXX] add something”, such as “[ROCKETMQ-80] Add batch 
feature”, the “XXX” represents the the name of the jira issue.
 +you could refer to:&lt;/p&gt;
 +
 +&lt;p&gt;&lt;a 
href=&quot;https://github.com/apache/incubator-rocketmq/pull/53&quot;&gt;https://github.com/apache/incubator-rocketmq/pull/53&lt;/a&gt;&lt;/p&gt;</content><author><name>{&quot;name&quot;=&gt;nil,
 &quot;avatar&quot;=&gt;&quot;/assets/images/rmq-logo.png&quot;, 
&quot;bio&quot;=&gt;&quot;A fast, low latency, reliable, scalable, distributed 
MOM.&quot;, &quot;location&quot;=&gt;&quot;Hangzhou, China&quot;, 
&quot;email&quot;=&gt;&quot;[email protected]&quot;, 
&quot;uri&quot;=&gt;&quot;http://incubator.staging.apache.org/projects/rocketmq.html&quot;,
 &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, 
&quot;dribbble&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, 
&quot;facebook&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, 
&quot;github&quot;=&gt;&quot;apache/incubator-rocketmq&quot;, 
&quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, 
&quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, 
&quot;linkedin&quot;=&gt;nil, &quot;pinterest&quot;=
 &gt;nil, &quot;soundcloud&quot;=&gt;nil, 
&quot;stackoverflow&quot;=&gt;&quot;questions/tagged/rocketmq&quot;, 
&quot;steam&quot;=&gt;nil, &quot;tumblr&quot;=&gt;nil, 
&quot;twitter&quot;=&gt;&quot;ApacheRocketMQ&quot;, &quot;vine&quot;=&gt;nil, 
&quot;weibo&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, 
&quot;youtube&quot;=&gt;nil, 
&quot;quora&quot;=&gt;&quot;topic/RocketMQ&quot;}</name><email>[email protected]</email><uri>http://incubator.staging.apache.org/projects/rocketmq.html</uri></author><summary
 type="html">The correct posture of submitting a 
PR</summary></entry><entry><title type="html">Four Methods to Feed Name Server 
Address List</title><link 
href="/rocketmq/four-methods-to-feed-name-server-address-list/" rel="alternate" 
type="text/html" title="Four Methods to Feed Name Server Address List" 
/><published>2017-02-10T00:00:00+08:00</published><updated>2017-02-10T00:00:00+08:00</updated><id>/rocketmq/four-methods-to-feed-name-server-address-list</id><content
 type="html
 " 
xml:base="/rocketmq/four-methods-to-feed-name-server-address-list/">&lt;p&gt;In 
Apache RocketMQ, name servers are designed to coordinate each component of the 
distributed system
 +and fulfill much of this responsibility through managing topic route 
information.&lt;/p&gt;
 +
 +&lt;p&gt;The management, roughly speaking, consists two parts:&lt;/p&gt;
 +&lt;ul&gt;
 +  &lt;li&gt;Brokers periodically renew meta data, including topics they have, 
which are kept in every name servers.&lt;/li&gt;
 +  &lt;li&gt;Name servers are serving clients, including producers, consumers 
and command line clients with the latest routing information.&lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;p&gt;Therefore, before launching brokers and clients, we need to tell 
them how to reach name servers by feeding them with a name server address list.
 +In Apache RocketMQ, this can be done in four ways.&lt;/p&gt;
 +
 +&lt;ol&gt;
 +  &lt;li&gt;
 +    &lt;p&gt;Programmatic Way&lt;/p&gt;
 +
 +    &lt;p&gt;For broker, we may specify &lt;code 
class=&quot;highlighter-rouge&quot;&gt;namesrvAddr=name-server-ip1:port;name-server-ip2:port&lt;/code&gt;
 in broker configuration file.&lt;/p&gt;
 +
 +    &lt;p&gt;For producers and consumers, we may feed name server address 
list to them as follows:&lt;/p&gt;
 +
 +    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;
 +DefaultMQProducer producer = new 
DefaultMQProducer(&quot;please_rename_unique_group_name&quot;);
 
+producer.setNamesrvAddr(&quot;name-server1-ip:port;name-server2-ip:port&quot;);&lt;/code&gt;&lt;/p&gt;
 +
 +    &lt;p&gt;&lt;code class=&quot;highlighter-rouge&quot;&gt;
 +DefaultMQPushConsumer consumer = new 
DefaultMQPushConsumer(&quot;please_rename_unique_group_name&quot;);
 
+consumer.setNamesrvAddr(&quot;name-server1-ip:port;name-server2-ip:port&quot;);&lt;/code&gt;&lt;/p&gt;
 +
 +    &lt;p&gt;If you use admin command line from shell, you may specify this 
way:
 +&lt;code class=&quot;highlighter-rouge&quot;&gt;sh mqadmin command-name -n 
name-server-ip1:port;name-server-ip2:port -X OTHER-OPTION&lt;/code&gt;&lt;/p&gt;
 +
 +    &lt;p&gt;a simple example is:
 +&lt;code class=&quot;highlighter-rouge&quot;&gt;sh mqadmin -n localhost:9876 
clusterList&lt;/code&gt;
 +assuming to query cluster info on the name server node.&lt;/p&gt;
 +
 +    &lt;p&gt;If integrating admin tool into your own dashboard, you may
 +&lt;code class=&quot;highlighter-rouge&quot;&gt;DefaultMQAdminExt 
defaultMQAdminExt = new 
DefaultMQAdminExt(&quot;please_rename_unique_group_name&quot;);
 + 
defaultMQAdminExt.setNamesrvAddr(&quot;name-server1-ip:port;name-server2-ip:port&quot;);&lt;/code&gt;&lt;/p&gt;
 +  &lt;/li&gt;
 +  &lt;li&gt;
 +    &lt;p&gt;Java Options&lt;/p&gt;
 +
 +    &lt;p&gt;Name server address list may also be fed to your application 
through specifying the sequel java option 
 + &lt;code 
class=&quot;highlighter-rouge&quot;&gt;rocketmq.namesrv.addr&lt;/code&gt; 
before launching.&lt;/p&gt;
 +  &lt;/li&gt;
 +  &lt;li&gt;
 +    &lt;p&gt;Environment Variable&lt;/p&gt;
 +
 +    &lt;p&gt;You can export &lt;code 
class=&quot;highlighter-rouge&quot;&gt;NAMESRV_ADDR&lt;/code&gt; environment 
variable. Brokers and clients will examine and use its value if set.&lt;/p&gt;
 +  &lt;/li&gt;
 +  &lt;li&gt;
 +    &lt;p&gt;HTTP Endpoint&lt;/p&gt;
 +
 +    &lt;p&gt;If you do not specify name server address list using previously 
mentioned methods, Apache RocketMQ will access
 +  the following HTTP end point to acquire and update name server address list 
every two minutes with initial delay of
 +  ten seconds.&lt;/p&gt;
 +
 +    &lt;p&gt;On default, the end point is:&lt;/p&gt;
 +
 +    &lt;p&gt;&lt;code 
class=&quot;highlighter-rouge&quot;&gt;http://jmenv.tbsite.net:8080/rocketmq/nsaddr&lt;/code&gt;&lt;/p&gt;
 +
 +    &lt;p&gt;You may override &lt;code 
class=&quot;highlighter-rouge&quot;&gt;jmenv.tbsite.net&lt;/code&gt; by this 
java option: &lt;code 
class=&quot;highlighter-rouge&quot;&gt;rocketmq.namesrv.domain&lt;/code&gt;,
 + You may also override &lt;code 
class=&quot;highlighter-rouge&quot;&gt;nsaddr&lt;/code&gt; part by this java 
option: &lt;code 
class=&quot;highlighter-rouge&quot;&gt;rocketmq.namesrv.domain.subgroup&lt;/code&gt;&lt;/p&gt;
 +
 +    &lt;p&gt;If you are running Apache RocketMQ in production, this method is 
recommended because it gives you maximum flexibility
 +  – you can dynamically add or remove name server nodes without necessity 
of rebooting your brokers and clients 
 +  according to your name servers’ system load.&lt;/p&gt;
 +  &lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;ul&gt;
 +  &lt;li&gt;
 +    &lt;p&gt;Priority&lt;/p&gt;
 +
 +    &lt;p&gt;Methods introduced first take precedence over the latter, 
namely, &lt;br /&gt;
 + &lt;code class=&quot;highlighter-rouge&quot;&gt;Programmatic Way &amp;gt; 
Java Options &amp;gt; Environment Variable &amp;gt; HTTP 
Endpoint&lt;/code&gt;&lt;/p&gt;
 +  &lt;/li&gt;
 +&lt;/ul&gt;</content><author><name>{&quot;name&quot;=&gt;nil, 
&quot;avatar&quot;=&gt;&quot;/assets/images/rmq-logo.png&quot;, 
&quot;bio&quot;=&gt;&quot;A fast, low latency, reliable, scalable, distributed 
MOM.&quot;, &quot;location&quot;=&gt;&quot;Hangzhou, China&quot;, 
&quot;email&quot;=&gt;&quot;[email protected]&quot;, 
&quot;uri&quot;=&gt;&quot;http://incubator.staging.apache.org/projects/rocketmq.html&quot;,
 &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, 
&quot;dribbble&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, 
&quot;facebook&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, 
&quot;github&quot;=&gt;&quot;apache/incubator-rocketmq&quot;, 
&quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, 
&quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, 
&quot;linkedin&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, 
&quot;soundcloud&quot;=&gt;nil, 
&quot;stackoverflow&quot;=&gt;&quot;questions/tagged/rocketmq&quot;, 
&quot;steam&quot;=&gt;nil, &quot;tumblr
 &quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;ApacheRocketMQ&quot;, 
&quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, 
&quot;youtube&quot;=&gt;nil, 
&quot;quora&quot;=&gt;&quot;topic/RocketMQ&quot;}</name><email>[email protected]</email><uri>http://incubator.staging.apache.org/projects/rocketmq.html</uri></author><category
 term="RocketMQ" /><category term="Name Server" /><summary type="html">In 
Apache RocketMQ, name servers are designed to coordinate each component of the 
distributed system and fulfill much of this responsibility through managing 
topic route information.</summary></entry><entry><title type="html">Release 
Notes - Apache RocketMQ - Version 4.0.0-incubating</title><link 
href="/release_notes/release-notes-4.0.0-incubating/" rel="alternate" 
type="text/html" title="Release Notes - Apache RocketMQ - Version 
4.0.0-incubating" 
/><published>2017-01-24T00:00:00+08:00</published><updated>2017-01-24T00:00:00+08:00</updated><id>/release_
 notes/release-notes-4.0.0-incubating</id><content type="html" 
xml:base="/release_notes/release-notes-4.0.0-incubating/">&lt;p&gt;Below is a 
summary of the JIRA issues addressed in the 4.0.0-incubating release of 
RocketMQ. For full documentation of the release, a guide to get started, please 
refer to &lt;a href=&quot;/docs/quick-start/&quot;&gt;Quick 
Start&lt;/a&gt;.&lt;/p&gt;
 +
 +&lt;h2&gt; Download the 4.0.0-incubating release
 +&lt;/h2&gt;
 +
 +&lt;ul&gt;
 +  &lt;li&gt;Source: &lt;a 
href=&quot;https://www.apache.org/dyn/closer.cgi?path=incubator/rocketmq/4.0.0-incubating/rocketmq-all-4.0.0-incubating-source-release.zip&quot;&gt;rocketmq-all-4.0.0-incubating-source-release.zip&lt;/a&gt;
 [&lt;a 
href=&quot;https://www.apache.org/dist/incubator/rocketmq/4.0.0-incubating/rocketmq-all-4.0.0-incubating-source-release.zip.asc&quot;&gt;PGP&lt;/a&gt;]
 [&lt;a 
href=&quot;https://www.apache.org/dist/incubator/rocketmq/4.0.0-incubating/rocketmq-all-4.0.0-incubating-source-release.zip.md5&quot;&gt;MD5&lt;/a&gt;]
 [&lt;a 
href=&quot;https://www.apache.org/dist/incubator/rocketmq/4.0.0-incubating/rocketmq-all-4.0.0-incubating-source-release.zip.sha1&quot;&gt;SHA1&lt;/a&gt;]&lt;/li&gt;
 +  &lt;li&gt;Binary: &lt;a 
href=&quot;https://www.apache.org/dyn/closer.cgi?path=incubator/rocketmq/4.0.0-incubating/rocketmq-all-4.0.0-incubating-bin-release.zip&quot;&gt;rocketmq-all-4.0.0-incubating-bin-release.zip&lt;/a&gt;
 [&lt;a 
href=&quot;https://www.apache.org/dist/incubator/rocketmq/4.0.0-incubating/rocketmq-all-4.0.0-incubating-bin-release.zip.asc&quot;&gt;PGP&lt;/a&gt;]
 [&lt;a 
href=&quot;https://www.apache.org/dist/incubator/rocketmq/4.0.0-incubating/rocketmq-all-4.0.0-incubating-bin-release.zip.md5&quot;&gt;MD5&lt;/a&gt;]
 [&lt;a 
href=&quot;https://www.apache.org/dist/incubator/rocketmq/4.0.0-incubating/rocketmq-all-4.0.0-incubating-bin-release.zip.sha1&quot;&gt;SHA1&lt;/a&gt;]&lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;h2&gt; Bug
 +&lt;/h2&gt;
 +&lt;ul&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-2&quot;&gt;ROCKETMQ-2&lt;/a&gt;]
 - Broker tests fail with &amp;quot;Address
 +        already in use&amp;quot;
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-5&quot;&gt;ROCKETMQ-5&lt;/a&gt;]
 - Avoid creating directories in
 +        UtilAll#getDiskPartitionSpaceUsedPercent()
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-19&quot;&gt;ROCKETMQ-19&lt;/a&gt;]
 - Thread-unsafe in
 +        MQAdminImpl#queryMessage
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-22&quot;&gt;ROCKETMQ-22&lt;/a&gt;]
 - new funciton &amp;#39;printWaterMark&amp;#39;
 +        in version 3.5.8(4.0.0) will cause a ClassCastException
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-25&quot;&gt;ROCKETMQ-25&lt;/a&gt;]
 - Query Msg by key: Possible
 +        concurrent access to LinkedList
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-30&quot;&gt;ROCKETMQ-30&lt;/a&gt;]
 - Message Filter example has
 +        incorrect method signature
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-31&quot;&gt;ROCKETMQ-31&lt;/a&gt;]
 - Deletion needed for
 +        `$HOME/rmq_bk_gc.log` in `bin/mqbroker`
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-33&quot;&gt;ROCKETMQ-33&lt;/a&gt;]
 - CPU Occupy 100%
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-34&quot;&gt;ROCKETMQ-34&lt;/a&gt;]
 - Potential NPE in
 +        NettyConnetManageHandler#connect
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-35&quot;&gt;ROCKETMQ-35&lt;/a&gt;]
 - Consumer client can’t persist
 +        consume offset table to Broker
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-45&quot;&gt;ROCKETMQ-45&lt;/a&gt;]
 - Delete consume queue hang file
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-47&quot;&gt;ROCKETMQ-47&lt;/a&gt;]
 - Broker updates NameServer
 +        address list on startup twice
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-59&quot;&gt;ROCKETMQ-59&lt;/a&gt;]
 - Charset misusage in
 +        RocketMQSerializable
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-64&quot;&gt;ROCKETMQ-64&lt;/a&gt;]
 - Remove duplication code line in
 +        BrokerOuterAPI.registerBroker method
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-70&quot;&gt;ROCKETMQ-70&lt;/a&gt;]
 - Duplicate methods in
 +        NettyRemotingClient
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-74&quot;&gt;ROCKETMQ-74&lt;/a&gt;]
 - DataVersion equals not working
 +        as expected.
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-83&quot;&gt;ROCKETMQ-83&lt;/a&gt;]
 - Fail in quickstart-sample
 +    &lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;h2&gt; Improvement
 +&lt;/h2&gt;
 +&lt;ul&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-8&quot;&gt;ROCKETMQ-8&lt;/a&gt;]
 - Standardize build script using
 +        maven wrapper
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-11&quot;&gt;ROCKETMQ-11&lt;/a&gt;]
 - Improve concision - Reuse local
 +        variable &amp;#39;brokerAddrs&amp;#39; in 
RouteInfoManager.getSystemTopicList method
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-14&quot;&gt;ROCKETMQ-14&lt;/a&gt;]
 - Remoting invoke callback shoule
 +        be invoked in an executor rather than in current thread.
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-16&quot;&gt;ROCKETMQ-16&lt;/a&gt;]
 - Improve the codes of setting
 +        topic.json&amp;#39;s and subscriptionGroup.json&amp;#39;s path
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-18&quot;&gt;ROCKETMQ-18&lt;/a&gt;]
 - Repackage com.alibaba to
 +        org.apache and change maven coordinate
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-20&quot;&gt;ROCKETMQ-20&lt;/a&gt;]
 - Default &amp;#39;consumeFromWhere&amp;#39;
 +        is inconsist with example&amp;#39;s
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-29&quot;&gt;ROCKETMQ-29&lt;/a&gt;]
 -
 +        org.apache.rocketmq.common.help.FAQUrl refers to docs in Chinese
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-32&quot;&gt;ROCKETMQ-32&lt;/a&gt;]
 - Improve concision - Reuse local
 +        variable &amp;#39;brokerAddrs&amp;#39; in 
RouteInfoManager.getSystemTopicList method
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-37&quot;&gt;ROCKETMQ-37&lt;/a&gt;]
 - Log output information is not
 +        accurate
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-43&quot;&gt;ROCKETMQ-43&lt;/a&gt;]
 - code style file didn&amp;#39;t match
 +        check-style in typecast
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-50&quot;&gt;ROCKETMQ-50&lt;/a&gt;]
 - Polish unit tests for RocketMQ
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-60&quot;&gt;ROCKETMQ-60&lt;/a&gt;]
 - Checklist review for
 +        4.0.0-incubating release
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-69&quot;&gt;ROCKETMQ-69&lt;/a&gt;]
 - Add link to RocketMQ web page
 +        into README.md
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-85&quot;&gt;ROCKETMQ-85&lt;/a&gt;]
 - Polish README file and remove
 +        all the 3rd party links in it.
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-87&quot;&gt;ROCKETMQ-87&lt;/a&gt;]
 - Polish the LICENSE and NOTICE
 +        files to match all the dependencies
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-1&quot;&gt;ROCKETMQ-1&lt;/a&gt;]
 - Update build and clean up ip for
 +        4.0.0-incubating
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-38&quot;&gt;ROCKETMQ-38&lt;/a&gt;]
 - Polish unit tests for
 +        rocketmq-remoting
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-51&quot;&gt;ROCKETMQ-51&lt;/a&gt;]
 - Polish unit tests for
 +        rocketmq-broker
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-52&quot;&gt;ROCKETMQ-52&lt;/a&gt;]
 - Polish unit tests for
 +        rocketmq-client
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-53&quot;&gt;ROCKETMQ-53&lt;/a&gt;]
 - Polish unit tests for
 +        rocketmq-commons
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-54&quot;&gt;ROCKETMQ-54&lt;/a&gt;]
 - Polish unit tests for
 +        rocketmq-namesrv
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-56&quot;&gt;ROCKETMQ-56&lt;/a&gt;]
 - Polish unit tests for
 +        rocketmq-store
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-57&quot;&gt;ROCKETMQ-57&lt;/a&gt;]
 - Polish unit tests for
 +        rocketmq-tools
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-58&quot;&gt;ROCKETMQ-58&lt;/a&gt;]
 - Add integration test for
 +        RocketMQ
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-62&quot;&gt;ROCKETMQ-62&lt;/a&gt;]
 - Polish Maven assembly release
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-3&quot;&gt;ROCKETMQ-3&lt;/a&gt;]
 - Clean up the unit test of rocketmq
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-13&quot;&gt;ROCKETMQ-13&lt;/a&gt;]
 - Wrong log level for
 +        AcceptSocketService termination
 +    &lt;/li&gt;
 +    &lt;li&gt;[&lt;a 
href=&quot;https://issues.apache.org/jira/browse/ROCKETMQ-9&quot;&gt;ROCKETMQ-9&lt;/a&gt;]
 - Errors in rocketmq-store module
 +    &lt;/li&gt;
 +&lt;/ul&gt;</content><author><name>{&quot;name&quot;=&gt;nil, 
&quot;avatar&quot;=&gt;&quot;/assets/images/rmq-logo.png&quot;, 
&quot;bio&quot;=&gt;&quot;A fast, low latency, reliable, scalable, distributed 
MOM.&quot;, &quot;location&quot;=&gt;&quot;Hangzhou, China&quot;, 
&quot;email&quot;=&gt;&quot;[email protected]&quot;, 
&quot;uri&quot;=&gt;&quot;http://incubator.staging.apache.org/projects/rocketmq.html&quot;,
 &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, 
&quot;dribbble&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, 
&quot;facebook&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, 
&quot;github&quot;=&gt;&quot;apache/incubator-rocketmq&quot;, 
&quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, 
&quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, 
&quot;linkedin&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, 
&quot;soundcloud&quot;=&gt;nil, 
&quot;stackoverflow&quot;=&gt;&quot;questions/tagged/rocketmq&quot;, 
&quot;steam&quot;=&gt;nil, &quot;tumblr
 &quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;ApacheRocketMQ&quot;, 
&quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, 
&quot;youtube&quot;=&gt;nil, 
&quot;quora&quot;=&gt;&quot;topic/RocketMQ&quot;}</name><email>[email protected]</email><uri>http://incubator.staging.apache.org/projects/rocketmq.html</uri></author><category
 term="Release_Notes" /><category term="RocketMQ" /><category term="Version" 
/><summary type="html">Below is a summary of the JIRA issues addressed in the 
4.0.0-incubating release of RocketMQ. For full documentation of the release, a 
guide to get started, please refer to Quick 
Start.</summary></entry><entry><title type="html">Launch RocketMQ Code 
Marathon</title><link href="/activity/launch-rocketmq-code-marathon/" 
rel="alternate" type="text/html" title="Launch RocketMQ Code Marathon" 
/><published>2017-01-05T00:00:00+08:00</published><updated>2017-01-05T00:00:00+08:00</updated><id>/activity/launch-rocketmq-code-marathon</i
 d><content type="html" 
xml:base="/activity/launch-rocketmq-code-marathon/">&lt;p&gt;&lt;img 
src=&quot;/assets/images/blog/banner.jpg&quot; alt=&quot;Banner&quot; 
/&gt;&lt;/p&gt;
 +&lt;h1 id=&quot;rocketmq-code-marathon-&quot;&gt;ROCKETMQ CODE MARATHON &lt;a 
href=&quot;/assets/attachment/launch-rocketmq-code-marathon.pdf&quot;&gt;&lt;i 
class=&quot;fa fa-link&quot;&gt;&lt;/i&gt;&lt;/a&gt;&lt;/h1&gt;
 +&lt;h5 id=&quot;january-5th-2017&quot;&gt;January 5th 2017&lt;/h5&gt;
 +
 +&lt;h2 id=&quot;objective&quot;&gt;Objective:&lt;/h2&gt;
 +&lt;ol&gt;
 +  &lt;li&gt;Foster Community&lt;/li&gt;
 +  &lt;li&gt;Prosper Ecology&lt;/li&gt;
 +  &lt;li&gt;Incubate Committers&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;h2 id=&quot;output&quot;&gt;Output:&lt;/h2&gt;
 +&lt;ol&gt;
 +  &lt;li&gt;1~3 Milestone Releases Per Project&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;h2 id=&quot;rewards&quot;&gt;Rewards:&lt;/h2&gt;
 +&lt;ol&gt;
 +  &lt;li&gt;Two Potential Committers Per Project&lt;/li&gt;
 +  &lt;li&gt;Free Offers to Active Participants for On-Site Meetup&lt;/li&gt;
 +  &lt;li&gt;PMC Memberships for Qualified Committers&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;h2 id=&quot;projects&quot;&gt;PROJECTS&lt;/h2&gt;
 +
 +&lt;h3 id=&quot;rocketmq-console&quot;&gt;RocketMQ-Console&lt;/h3&gt;
 +&lt;ol&gt;
 +  &lt;li&gt;Brand New UI&lt;/li&gt;
 +  &lt;li&gt;I18n Support&lt;/li&gt;
 +  &lt;li&gt;&lt;a 
href=&quot;https://projects.spring.io/spring-boot/&quot;&gt;Spring 
Boot&lt;/a&gt; + &lt;a 
href=&quot;http://getbootstrap.com/&quot;&gt;Bootstrap&lt;/a&gt; 
Recommended&lt;/li&gt;
 +  &lt;li&gt;Join by Creating Pull Requests against &lt;a 
href=&quot;https://github.com/apache/incubator-rocketmq-externals/tree/master/rocketmq-console&quot;&gt;RocketMQ
 Console Repository&lt;/a&gt;&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;h3 id=&quot;rocketmq-jms&quot;&gt;RocketMQ-JMS&lt;/h3&gt;
 +&lt;ol&gt;
 +  &lt;li&gt;Supporting JMS 2.0 Protocol&lt;/li&gt;
 +  &lt;li&gt;Rich Documentation and Good Test Cases Coverage&lt;/li&gt;
 +  &lt;li&gt;Join by Creating Pull Requests against &lt;a 
href=&quot;https://github.com/apache/incubator-rocketmq-externals/tree/master/rocketmq-jms&quot;&gt;RocketMQ
 JMS Repository&lt;/a&gt;&lt;/li&gt;
 +&lt;/ol&gt;
 +
 +&lt;h3 id=&quot;rocketmq-flume&quot;&gt;RocketMQ-Flume&lt;/h3&gt;
 +&lt;ol&gt;
 +  &lt;li&gt;Supporting Latest &lt;a 
href=&quot;http://flume.apache.org/&quot;&gt;Flume&lt;/a&gt;&lt;/li&gt;
 +  &lt;li&gt;Rich Documentation and Good Test Cases Coverage&lt;/li&gt;
 +  &lt;li&gt;Join by Creating Pull Requests against &lt;a 
href=&quot;https://github.com/apache/incubator-rocketmq-externals/tree/master/rocketmq-flume&quot;&gt;RocketMQ
 Flume Repository&lt;/a&gt;&lt;/li&gt;
 +&lt;/ol&gt;</content><author><name>{&quot;name&quot;=&gt;nil, 
&quot;avatar&quot;=&gt;&quot;/assets/images/rmq-logo.png&quot;, 
&quot;bio&quot;=&gt;&quot;A fast, low latency, reliable, scalable, distributed 
MOM.&quot;, &quot;location&quot;=&gt;&quot;Hangzhou, China&quot;, 
&quot;email&quot;=&gt;&quot;[email protected]&quot;, 
&quot;uri&quot;=&gt;&quot;http://incubator.staging.apache.org/projects/rocketmq.html&quot;,
 &quot;bitbucket&quot;=&gt;nil, &quot;codepen&quot;=&gt;nil, 
&quot;dribbble&quot;=&gt;nil, &quot;flickr&quot;=&gt;nil, 
&quot;facebook&quot;=&gt;nil, &quot;foursquare&quot;=&gt;nil, 
&quot;github&quot;=&gt;&quot;apache/incubator-rocketmq&quot;, 
&quot;google_plus&quot;=&gt;nil, &quot;keybase&quot;=&gt;nil, 
&quot;instagram&quot;=&gt;nil, &quot;lastfm&quot;=&gt;nil, 
&quot;linkedin&quot;=&gt;nil, &quot;pinterest&quot;=&gt;nil, 
&quot;soundcloud&quot;=&gt;nil, 
&quot;stackoverflow&quot;=&gt;&quot;questions/tagged/rocketmq&quot;, 
&quot;steam&quot;=&gt;nil, &quot;tumblr
 &quot;=&gt;nil, &quot;twitter&quot;=&gt;&quot;ApacheRocketMQ&quot;, 
&quot;vine&quot;=&gt;nil, &quot;weibo&quot;=&gt;nil, &quot;xing&quot;=&gt;nil, 
&quot;youtube&quot;=&gt;nil, 
&quot;quora&quot;=&gt;&quot;topic/RocketMQ&quot;}</name><email>[email protected]</email><uri>http://incubator.staging.apache.org/projects/rocketmq.html</uri></author><category
 term="Activity" /><category term="Code" /><category term="Marathon" /><summary 
type="html">ROCKETMQ CODE MARATHON January 5th 
2017</summary></entry><entry><title type="html">Mastering Component Compatible 
Dependency</title><link 
href="/maven/mastering-component-compatible-dependency/" rel="alternate" 
type="text/html" title="Mastering Component Compatible Dependency" 
/><published>2016-12-23T00:00:00+08:00</published><updated>2016-12-23T00:00:00+08:00</updated><id>/maven/mastering-component-compatible-dependency</id><content
 type="html" 
xml:base="/maven/mastering-component-compatible-dependency/">&lt;p&gt;This 
article mainl
 y includes three parts.at first,I will introduce compatibility principle(more 
details see &lt;a 
href=&quot;http://blog.csdn.net/fengjia10/article/details/7799227&quot;&gt;here&lt;/a&gt;)
 briefly.followed by a detailed elaborating about Java component compatible 
dependency,including the interface-oriented programming,single component 
signature protection,single component compatibility protection and 
multi-component compatibility compile time checking.Finally is the review and 
prospect,especially about &lt;strong&gt;Dependency Mediator&lt;/strong&gt; 
project.&lt;/p&gt;
 +
 +&lt;aside class=&quot;sidebar__right&quot;&gt;
 +&lt;nav class=&quot;toc&quot;&gt;
 +    &lt;header&gt;&lt;h4 class=&quot;nav__title&quot;&gt;&lt;i class=&quot;fa 
fa-file-text&quot;&gt;&lt;/i&gt; On This Page&lt;/h4&gt;&lt;/header&gt;
 +&lt;ul class=&quot;toc__menu&quot; id=&quot;markdown-toc&quot;&gt;
 +  &lt;li&gt;&lt;a href=&quot;#compatibility&quot; 
id=&quot;markdown-toc-compatibility&quot;&gt;Compatibility&lt;/a&gt;&lt;/li&gt;
 +  &lt;li&gt;&lt;a href=&quot;#component-compatible-dependency&quot; 
id=&quot;markdown-toc-component-compatible-dependency&quot;&gt;Component 
Compatible Dependency&lt;/a&gt;    &lt;ul&gt;
 +      &lt;li&gt;&lt;a href=&quot;#interface-oriented-programming&quot; 
id=&quot;markdown-toc-interface-oriented-programming&quot;&gt;Interface-oriented
 programming&lt;/a&gt;&lt;/li&gt;
 +      &lt;li&gt;&lt;a href=&quot;#single-component-signature-protection&quot; 
id=&quot;markdown-toc-single-component-signature-protection&quot;&gt;Single 
component signature protection&lt;/a&gt;&lt;/li&gt;
 +      &lt;li&gt;&lt;a 
href=&quot;#single-component-compatibility-protection&quot; 
id=&quot;markdown-toc-single-component-compatibility-protection&quot;&gt;Single 
component compatibility protection&lt;/a&gt;&lt;/li&gt;
 +      &lt;li&gt;&lt;a 
href=&quot;#multi-component-compatibility-compile-time-checking&quot; 
id=&quot;markdown-toc-multi-component-compatibility-compile-time-checking&quot;&gt;Multi-component
 compatibility compile time checking&lt;/a&gt;&lt;/li&gt;
 +    &lt;/ul&gt;
 +  &lt;/li&gt;
 +  &lt;li&gt;&lt;a href=&quot;#summary&quot; 
id=&quot;markdown-toc-summary&quot;&gt;Summary&lt;/a&gt;&lt;/li&gt;
 +&lt;/ul&gt;
 +
 +  &lt;/nav&gt;
 +&lt;/aside&gt;
 +
 +&lt;h1 id=&quot;compatibility&quot;&gt;Compatibility&lt;/h1&gt;
 +
 +&lt;p&gt;what is compatibility?it is also the key to understanding the 
compatible dependency.Compatibility, often catch our eyes through two 
forms,&lt;strong&gt;binary compatibility&lt;/strong&gt;,that means they can run 
the same executable code, typically machine code for a general purpose computer 
CPU.within the framework of Release-to-Release Binary Compatibility in SOM 
(Forman, Conner, Danforth, and Raper, Proceedings of OOPSLA ‘95), Java 
programming language binaries are binary compatible under all relevant 
transformations that the authors identify (with some caveats with respect to 
the addition of instance variables). here is a list of some important binary 
compatible changes that the Java programming language supports:&lt;/p&gt;
 +
 +&lt;ul&gt;
 +  &lt;li&gt;Reimplementing existing methods, constructors, and initializers 
to improve performance.&lt;/li&gt;
 +  &lt;li&gt;Changing methods or constructors to return values on inputs for 
which they previously either threw exceptions that normally should not occur or 
failed by going into an infinite loop or causing a deadlock.&lt;/li&gt;
 +  &lt;li&gt;Adding new fields, methods, or constructors to an existing class 
or interface.&lt;/li&gt;
 +  &lt;li&gt;Deleting private fields, methods, or constructors of a 
class.&lt;/li&gt;
 +  &lt;li&gt;When an entire package is updated, deleting default 
(package-only) access fields, methods, or constructors of classes and 
interfaces in the package.&lt;/li&gt;
 +  &lt;li&gt;Reordering the fields, methods, or constructors in an existing 
type declaration.&lt;/li&gt;
 +  &lt;li&gt;Moving a method upward in the class hierarchy.&lt;/li&gt;
 +  &lt;li&gt;Reordering the list of direct superinterfaces of a class or 
interface.&lt;/li&gt;
 +  &lt;li&gt;Inserting new class or interface types in the type 
hierarchy.&lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;p&gt;Generally,java language is &lt;strong&gt;upwards 
binary-compatible&lt;/strong&gt; with previous version,such as Java SE 6 is 
upwards binary-compatible with J2SE 5.0 except for some minor 
incompatibilities.You can get details from &lt;a 
href=&quot;http://www.oracle.com/technetwork/java/javase/compatibility-137541.html#binary&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
 +
 +&lt;p&gt;Another compatibility form,we call it &lt;strong&gt;source 
compatibility&lt;/strong&gt;,meaning that recompilation is necessary.Java 
language does not support downward source compatibility. Such as if source 
files use new language features or Java SE platform APIs, they will not be 
usable with an earlier version of the Java platform. Usually it will throw 
similar error like this:&lt;/p&gt;
 +
 +&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span 
class=&quot;n&quot;&gt;java&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;lang&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;UnsupportedClassVersionError&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;com&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;alibaba&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;mq&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;core&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;MessageConsumer&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;:&lt;/span&gt;
 +         &lt;span class=&quot;n&quot;&gt;Unsupported&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;major&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;minor&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;version&lt;/span&gt; &lt;span 
class=&quot;mf&quot;&gt;51.0&lt;/span&gt;
 +         &lt;span class=&quot;n&quot;&gt;at&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;java&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;lang&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;ClassLoader&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;defineClass1&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;Native&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;Method&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;)&lt;/span&gt;
 +         &lt;span class=&quot;n&quot;&gt;at&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;java&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;lang&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;ClassLoader&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;defineClassCond&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;Unknown&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;Source&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;)&lt;/span&gt;
 +&lt;/code&gt;&lt;/pre&gt;
 +&lt;/div&gt;
 +
 +&lt;p&gt;Java language source compatibility policy is as follows,except for 
any incompatibilities listed further below:&lt;/p&gt;
 +
 +&lt;ul&gt;
 +  &lt;li&gt;Maintenance releases (such as 1.7.25, 1.7.26) do not introduce 
any new language features or APIs. They will maintain source-compatibility with 
each other.&lt;/li&gt;
 +  &lt;li&gt;Functionality releases and major releases (such as 
1.4.0,5.0,6.0,7.0,8.0) maintain upwards but not downwards 
source-compatibility.&lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;p&gt;Let’s sum up before going on:&lt;/p&gt;
 +
 +&lt;ul&gt;
 +  &lt;li&gt;Document those incompatibility cases as much as possible, even 
some rare circumstances and corner cases.&lt;/li&gt;
 +  &lt;li&gt;Recommend developer to provide facilities that alert developers 
to the impact of changes on pre-existing binaries that cannot be 
recompiled.&lt;/li&gt;
 +  &lt;li&gt;Generally speaking,Binary Compatibility problems may occur in the 
following situations:&lt;/li&gt;
 +  &lt;li&gt;&lt;strong&gt;Replacing the old with the new&lt;/strong&gt;,such 
as the Java platform Profiling Architecture in the Java SE6,JVMDI was removed 
and JVMPI was disabled in Java SE 6.&lt;/li&gt;
 +  &lt;li&gt;&lt;strong&gt;Combinatorial resolution&lt;/strong&gt;,such as Non 
class files have been moved from rt.jar in Java SE 6.if 
-Xbootclasspath:&lt;path to=&quot;&quot; rt.jar=&quot;&quot;&gt; is 
specified,and request any resource files will fail since these resources now 
reside in a different jar file called resources.jar.&lt;/path&gt;&lt;/li&gt;
 +  &lt;li&gt;&lt;strong&gt;Behavior change&lt;/strong&gt;,such as Java SE 6 
will throw an OverlappingFileLockException,if the application attempts to lock 
the overlapping region other instances of FileChannel that has been locked, in 
order to realize the backward compatibility, it provides 
disableSystemWideOverlappingFileLockCheck system properties. again, also in 
Java SE 6, jar will preserve file modification dates and times during extract, 
through the sun.tools.jar.useExtractionTime=true to achieve backward 
compatibility.&lt;/li&gt;
 +  &lt;li&gt;&lt;strong&gt;Structure change&lt;/strong&gt;,this is also the 
key problem to solve in &lt;strong&gt;Dependency Mediator&lt;/strong&gt; 
project. generally speaking,modification and deletion belonging to incompatible 
operations.and more attentions must be paid in the RPC service maintenance, 
more detailed description,please refer to an &lt;a 
href=&quot;http://blog.csdn.net/fengjia10/article/details/7799227&quot;&gt;article&lt;/a&gt;
 I wrote before. also you can read the the thirteenth chapter of Java language 
specification.&lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;h1 id=&quot;component-compatible-dependency&quot;&gt;Component Compatible 
Dependency&lt;/h1&gt;
 +
 +&lt;p&gt;This article don’t talk about &lt;strong&gt;dependency 
analysis&lt;/strong&gt; and &lt;strong&gt;dependency 
decoupling&lt;/strong&gt;,if you care these topics,please read &lt;a 
href=&quot;http://java.dzone.com/articles/dependency-analysis-and-1&quot;&gt;Dependency
 Analysis and the Modularisation of Java Programs&lt;/a&gt;.highly recommending 
you try to dive into open source project &lt;a 
href=&quot;http://xplrarc.massey.ac.nz/&quot;&gt;Architecture 
Explorer&lt;/a&gt;,through bcel technology,analyzing and measuring 
component’s dependency relationship.but in my opinion,&lt;a 
href=&quot;http://clarkware.com/software/JDepend.html&quot;&gt;Jdepend&lt;/a&gt;
 was surely the most distinguished tool in dependency analysis and dependency 
decoupling area.it traverses Java class file directories and generates design 
quality metrics for each Java package,also allows you to automatically measure 
the quality of a design in terms of its extensibility, reusability, and 
maintainability 
 to manage package dependencies effectively.&lt;/p&gt;
 +
 +&lt;p&gt;Let’s return,ask yourself,have you ever been disturbed by the 
following problems?&lt;/p&gt;
 +
 +&lt;ul&gt;
 +  &lt;li&gt;Your service depend a volatile service,volatile means your 
service depending neither an abstract class nor a interface,this class update 
at irregular intervals,you often encountered errors such as 
&lt;strong&gt;NoSuchMethodError&lt;/strong&gt;,&lt;strong&gt;NoSuchFieldError&lt;/strong&gt;
 and &lt;strong&gt;NoClassDefFoundError&lt;/strong&gt; etc.&lt;/li&gt;
 +  &lt;li&gt;You are developing a new feature,but this feature can not 
backward compatible with previous version,
 +what should you do ? How do you give a incompatible list in your release 
report.&lt;/li&gt;
 +  &lt;li&gt;Java language library is a superb collection of beautiful 
things,how do you make a rational dependency exclusion and effective mediate 
various dependency problems when developing.&lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;p&gt;It is the time to introduce the key idea - &lt;strong&gt;Mediating 
Components Compatible Dependency&lt;/strong&gt;.Specifically,it includs the 
following basic principles:&lt;/p&gt;
 +
 +&lt;ul&gt;
 +  &lt;li&gt;Interface-oriented programming&lt;/li&gt;
 +  &lt;li&gt;Single component signature protection&lt;/li&gt;
 +  &lt;li&gt;Single component compatibility protection&lt;/li&gt;
 +  &lt;li&gt;Multi-component compatibility compile time checking&lt;/li&gt;
 +&lt;/ul&gt;
 +
 +&lt;h2 id=&quot;interface-oriented-programming&quot;&gt;Interface-oriented 
programming&lt;/h2&gt;
 +
 +&lt;p&gt;Interface-oriented programming,It’s easier said than done.I will 
cite SLF4J design philosophy explain this principle.&lt;/p&gt;
 +
 +&lt;p&gt;Differing from commons logging,SLF4J use &lt;strong&gt;static binder 
technology&lt;/strong&gt; so as to avoid notorious &lt;a 
href=&quot;http://articles.qos.ch/classloader.html&quot;&gt;classloader 
problem&lt;/a&gt;,every concrete log implementation must 
 +have a class named StaticLoggerBinder and implementing SLF4J spi 
LoggerFactoryBinder.thus you just depend SLF4J api,not concerned about 
underlying implementation.some people may asking,why choose SLF4J not commons 
logging,I can also depend commons logging api but not concret 
implementation?it’s not performance but classloader problem.JCL discovery 
process relies on classloader hacks to find the logging framework at runtime 
but this mechanism leads to numerous problems including unexpected 
behavior,hard to debug classloading problems resulting in increased 
complexity.This is nicely captured by Ceki (the author of Log4J, SLF4J and 
Logback) in Think again before adopting the commons-logging API (which also 
mentions memory leaks problems observed with JCL).and this is why SLF4J, which 
uses static bindings, has been created. Let’s see.how to find the concrete 
realizations in SLF4J:&lt;/p&gt;
 +
 +&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span class=&quot;c1&quot;&gt;// 
We need to use the name of the StaticLoggerBinder class, but we can't 
reference&lt;/span&gt;
 +&lt;span class=&quot;c1&quot;&gt;// the class itself.&lt;/span&gt;
 +&lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span 
class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;STATIC_LOGGER_BINDER_PATH&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;org/slf4j/impl/StaticLoggerBinder.class&quot;&lt;/span&gt;&lt;span
 class=&quot;o&quot;&gt;;&lt;/span&gt;
 + &lt;span class=&quot;cm&quot;&gt;/**
 +  * It is LoggerFactory's responsibility to track version changes and manage
 +  * the compatibility list.
 +  * It is assumed that all versions in the 1.6 are mutually compatible.
 +  */&lt;/span&gt;
 +&lt;span class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span 
class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span 
class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;[]&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;API_COMPATIBILITY_LIST&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;k&quot;&gt;new&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;String&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;[]{&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;1.6&quot;&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;1.7&quot;&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;};&lt;/span&gt;
 +
 +&lt;span class=&quot;c1&quot;&gt;// private constructor prevents 
instantiation&lt;/span&gt;
 +&lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;LoggerFactory&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;{}&lt;/span&gt;
 +&lt;span class=&quot;kd&quot;&gt;private&lt;/span&gt; &lt;span 
class=&quot;kd&quot;&gt;final&lt;/span&gt; &lt;span 
class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span 
class=&quot;kt&quot;&gt;void&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;versionSanityCheck&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;{&lt;/span&gt;
 + &lt;span class=&quot;k&quot;&gt;try&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;{&lt;/span&gt;
 +    &lt;span class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;requested&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;StaticLoggerBinder&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;REQUESTED_API_VERSION&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;;&lt;/span&gt;
 +    &lt;span class=&quot;kt&quot;&gt;boolean&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;match&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;kc&quot;&gt;false&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;;&lt;/span&gt;
 +    &lt;span class=&quot;k&quot;&gt;for&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;kt&quot;&gt;int&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;mi&quot;&gt;0&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;i&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;API_COMPATIBILITY_LIST&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;length&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;;&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;++)&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;{&lt;/span&gt;
 +      &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;requested&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;startsWith&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;API_COMPATIBILITY_LIST&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;[&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;i&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;]))&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;{&lt;/span&gt;
 +          &lt;span class=&quot;n&quot;&gt;match&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;kc&quot;&gt;true&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;;&lt;/span&gt;
 +      &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
 +     &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
 +    &lt;span class=&quot;k&quot;&gt;if&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(!&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;match&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;{&lt;/span&gt;
 +      &lt;span class=&quot;n&quot;&gt;Util&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;report&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;The 
requested version &quot;&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;requested&lt;/span&gt;
 +           &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot; by your slf4j binding is not compatible with 
&quot;&lt;/span&gt;
 +           &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;Arrays&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;asList&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;API_COMPATIBILITY_LIST&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;).&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;toString&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;());&lt;/span&gt;
 +      &lt;span class=&quot;n&quot;&gt;Util&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;report&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;s&quot;&gt;&quot;See 
&quot;&lt;/span&gt; &lt;span class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;VERSION_MISMATCH&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&quot; 
for further details.&quot;&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;);&lt;/span&gt;
 +    &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
 +&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span 
class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;java&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;lang&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;NoSuchFieldError&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;nsfe&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;{&lt;/span&gt;
 + &lt;span class=&quot;c1&quot;&gt;// given our large user base and SLF4J's 
commitment to backward&lt;/span&gt;
 + &lt;span class=&quot;c1&quot;&gt;// compatibility, we cannot cry here. Only 
for implementations&lt;/span&gt;
 + &lt;span class=&quot;c1&quot;&gt;// which willingly declare a 
REQUESTED_API_VERSION field do we&lt;/span&gt;
 + &lt;span class=&quot;c1&quot;&gt;// emit compatibility warnings.&lt;/span&gt;
 +&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt; &lt;span 
class=&quot;k&quot;&gt;catch&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;Throwable&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;)&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;{&lt;/span&gt;
 + &lt;span class=&quot;c1&quot;&gt;// we should never reach here&lt;/span&gt;
 + &lt;span class=&quot;n&quot;&gt;Util&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;.&lt;/span&gt;&lt;span 
class=&quot;na&quot;&gt;report&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt;&lt;span 
class=&quot;s&quot;&gt;&quot;Unexpected problem occured during version sanity 
check&quot;&lt;/span&gt;&lt;span class=&quot;o&quot;&gt;,&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;e&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;);&lt;/span&gt;
 +  &lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
 +&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
 +&lt;/code&gt;&lt;/pre&gt;
 +&lt;/div&gt;
 +
 +&lt;p&gt;you can use these skills at your library.just Let others depend on 
your interface package,detecting certain implementation statically.&lt;/p&gt;
 +
 +&lt;p&gt;If you have developed an old version library,naming it as 2.x.x.next 
version,you hope to refactor some implementations,how to process multi-version 
compatibility?here is a skill from maven dependency plugin:&lt;/p&gt;
 +
 +&lt;div class=&quot;language-java highlighter-rouge&quot;&gt;&lt;pre 
class=&quot;highlight&quot;&gt;&lt;code&gt;&lt;span 
class=&quot;n&quot;&gt;String&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;hint&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;=&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;isMaven31&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;?&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;maven31&quot;&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span 
class=&quot;n&quot;&gt;isMaven2x&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;()&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;?&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;maven2&quot;&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;:&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;maven3&quot;&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;;&lt;/span&gt;
 +
 +&lt;span class=&quot;cm&quot;&gt;/**
 +* Check the current Maven version to see if it's Maven 2.x.
 +*/&lt;/span&gt;
 +&lt;span class=&quot;kd&quot;&gt;protected&lt;/span&gt; &lt;span 
class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span 
class=&quot;kt&quot;&gt;boolean&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;isMaven2x&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;()&lt;/span&gt;
 +&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
 +   &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span 
class=&quot;o&quot;&gt;!&lt;/span&gt;&lt;span 
class=&quot;n&quot;&gt;canFindCoreClass&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;org.apache.maven.project.DependencyResolutionRequest&quot;&lt;/span&gt;
 &lt;span class=&quot;o&quot;&gt;);&lt;/span&gt; &lt;span 
class=&quot;c1&quot;&gt;// Maven 3 specific&lt;/span&gt;
 +&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
 +
 +&lt;span class=&quot;cm&quot;&gt;/**
 +* Check the current Maven version to see if it's Maven 3.1.
 +*/&lt;/span&gt;
 +&lt;span class=&quot;kd&quot;&gt;protected&lt;/span&gt; &lt;span 
class=&quot;kd&quot;&gt;static&lt;/span&gt; &lt;span 
class=&quot;kt&quot;&gt;boolean&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;isMaven31&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;()&lt;/span&gt;
 +&lt;span class=&quot;o&quot;&gt;{&lt;/span&gt;
 +   &lt;span class=&quot;k&quot;&gt;return&lt;/span&gt; &lt;span 
class=&quot;nf&quot;&gt;canFindCoreClass&lt;/span&gt;&lt;span 
class=&quot;o&quot;&gt;(&lt;/span&gt; &lt;span 
class=&quot;s&quot;&gt;&quot;org.eclipse.aether.artifact.Artifact&quot;&lt;/span&gt;
 &lt;span class=&quot;o&quot;&gt;);&lt;/span&gt; &lt;span 
class=&quot;c1&quot;&gt;// Maven 3.1 specific&lt;/span&gt;
 +&lt;span class=&quot;o&quot;&gt;}&lt;/span&gt;
 +&l

<TRUNCATED>

Reply via email to