<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Java on 蓝尾蜂鸟</title><link>https://clibing.com/tags/java/</link><description>Recent content in Java on 蓝尾蜂鸟</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><copyright>Copyright © 2011-2026 clibing. All Rights Reserved.</copyright><lastBuildDate>Fri, 12 Jul 2024 10:29:26 +0800</lastBuildDate><atom:link href="https://clibing.com/tags/java/index.xml" rel="self" type="application/rss+xml"/><item><title>Sonatype Oss（02）私服使用</title><link>https://clibing.com/posts/enterprise/chapter01/basics/sonatype-oss-use/</link><pubDate>Fri, 12 Jul 2024 10:29:26 +0800</pubDate><guid>https://clibing.com/posts/enterprise/chapter01/basics/sonatype-oss-use/</guid><description></description></item><item><title>Sonatype Oss（01）私服搭建</title><link>https://clibing.com/posts/enterprise/chapter01/basics/sonatype-oss-install/</link><pubDate>Thu, 11 Jul 2024 12:34:05 +0800</pubDate><guid>https://clibing.com/posts/enterprise/chapter01/basics/sonatype-oss-install/</guid><description></description></item><item><title>Synchronizd Lock 锁升级 AQS</title><link>https://clibing.com/posts/java/jdk/synchronizd_lock/</link><pubDate>Fri, 21 Aug 2020 10:06:07 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/synchronizd_lock/</guid><description><![CDATA[<h3 id="synchronized" data-numberify>Synchronized<a class="anchor ms-1" href="#synchronized"></a></h3>
<p>在1.5以前是重量级锁，当遇到synchronzed时，其他线程需要等待并进入blocked状态。</p>
<p>在1.6以后，经过大量的测试发现加锁的地方经常被一个线程访问。所以对synchronized进行了锁的粒度优化，主要在对象头增加标记位因此有了偏向锁、轻量级锁、重量级锁。</p>]]></description></item><item><title>Spring Spring Boot 杂项</title><link>https://clibing.com/posts/java/spring/spring_many/</link><pubDate>Thu, 20 Aug 2020 14:05:12 +0800</pubDate><guid>https://clibing.com/posts/java/spring/spring_many/</guid><description><![CDATA[<h4 id="spring-springboot小的细节总结记录" data-numberify>Spring SpringBoot小的细节总结记录<a class="anchor ms-1" href="#spring-springboot小的细节总结记录"></a></h4>
<ul>
<li>
<p>spring mvc</p>
<p>采用SPI技术，注入Spring的Servlet类，具体是实现了javax.servlet.ServletContainerInitializer接口的SpringServletContainerInitializer类,在这个类上注解@HandlesTypes传递的参数给Servlet中进行扩展使用</p>]]></description></item><item><title>限流器 RateLimiter</title><link>https://clibing.com/posts/java/rate_limit/</link><pubDate>Thu, 20 Aug 2020 13:52:27 +0800</pubDate><guid>https://clibing.com/posts/java/rate_limit/</guid><description><![CDATA[<h3 id="限流器" data-numberify>限流器<a class="anchor ms-1" href="#限流器"></a></h3>
<p>我们项目是新闻类的站点，每天需要限制各种爬虫，保证服务在可承受范围内，需要保护后台服务正常。需要使用限流器。</p>]]></description></item><item><title>Java_docker_jvm</title><link>https://clibing.com/posts/linux/docker/java_docker_jvm/</link><pubDate>Thu, 20 Aug 2020 13:48:32 +0800</pubDate><guid>https://clibing.com/posts/linux/docker/java_docker_jvm/</guid><description><![CDATA[<h4 id="当前jvm配置" data-numberify>当前jvm配置<a class="anchor ms-1" href="#当前jvm配置"></a></h4>
<ul>
<li>-XX:+PrintFlagsInitial  查看初始</li>
</ul>

<h4 id="docker-java_opts" data-numberify>docker JAVA_OPTS<a class="anchor ms-1" href="#docker-java_opts"></a></h4>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="ln"> 1</span><span class="cl">-XX:+AlwaysPreTouch 
</span></span><span class="line"><span class="ln"> 2</span><span class="cl">    JAVA进程启动的时候,虽然我们可以为JVM指定合适的内存大小,但是这些内存操作系统并没有真正的分配给JVM,而是等JVM访问这些内存的时候,才真正分配,这样会造成以下问题。
</span></span><span class="line"><span class="ln"> 3</span><span class="cl">    1、GC的时候,新生代的对象要晋升到老年代的时候,需要内存,这个时候操作系统才真正分配内存,这样就会加大young gc的停顿时间<span class="p">;</span>
</span></span><span class="line"><span class="ln"> 4</span><span class="cl">    2、可能存在内存碎片的问题。
</span></span><span class="line"><span class="ln"> 5</span><span class="cl">
</span></span><span class="line"><span class="ln"> 6</span><span class="cl">    jvm启用会慢，JDK8版本以前都不是并行处理的，到了JDK9才是并行
</span></span><span class="line"><span class="ln"> 7</span><span class="cl">
</span></span><span class="line"><span class="ln"> 8</span><span class="cl">    在没有配置-XX:+AlwaysPreTouch参数即默认情况下，JVM参数-Xms申明的堆只是在虚拟内存中分配，而不是在物理内存中分配：它被以一种内部数据结构的形式记录，从而避免被其他进程使用这些内存。这些内存页直到被访问时，才会在物理内存中分配。当JVM需要内存的时候，操作系统将根据需要分配内存页。
</span></span><span class="line"><span class="ln"> 9</span><span class="cl">
</span></span><span class="line"><span class="ln">10</span><span class="cl">    配置-XX:+AlwaysPreTouch参数后，JVM将-Xms指定的堆内存中每个字节都写入<span class="s1">&#39;0&#39;</span>，这样的话，除了在虚拟内存中以内部数据结构保留之外，还会在物理内存中分配。并且由于touch这个行为是单线程的，因此它将会让JVM进程启动变慢。所以，要么选择减少接下来对每个缓存页的第一次访问时间，要么选择减少JVM进程启动时间，这是一种trade-off。
</span></span><span class="line"><span class="ln">11</span><span class="cl">
</span></span><span class="line"><span class="ln">12</span><span class="cl">-XX:AutoBoxCacheMax<span class="o">=</span><span class="m">20000</span> 
</span></span><span class="line"><span class="ln">13</span><span class="cl">   jvm启动加载rt.jar包的时候，其中IntegerCache会加载int的~128-128为Integer到cahce，其他范围的使用时会进行new Integer操作。所以建议设置到大一点。 一般设置20000。 
</span></span><span class="line"><span class="ln">14</span><span class="cl">-XX:InitialHeapSize<span class="o">=</span><span class="m">523969984</span> 
</span></span><span class="line"><span class="ln">15</span><span class="cl">-XX:MaxHeapSize<span class="o">=</span><span class="m">8383519744</span> 
</span></span><span class="line"><span class="ln">16</span><span class="cl">-XX:+PrintCommandLineFlags 打印当前使用的参数
</span></span><span class="line"><span class="ln">17</span><span class="cl">-XX:+PrintFlagsFinal 打印当前使用参数最终的值
</span></span><span class="line"><span class="ln">18</span><span class="cl">-XX:+PrintGC  打印GC
</span></span><span class="line"><span class="ln">19</span><span class="cl">-XX:+PrintGCApplicationStoppedTime :打印垃圾回收期间程序暂停的时间.
</span></span><span class="line"><span class="ln">20</span><span class="cl">-XX:+PrintGCDateStamps :默认是+PrintGCTimeStamps打印jvm启动的相对时间，这个时间不利于查看，所以调整为系统时间
</span></span><span class="line"><span class="ln">21</span><span class="cl">-XX:+PrintGCDetails : 打印gc详细的信息
</span></span><span class="line"><span class="ln">22</span><span class="cl">-XX:+PrintGCTimeStamps :jvm启动的相对时间
</span></span><span class="line"><span class="ln">23</span><span class="cl">-XX:+UnlockExperimentalVMOptions : 可保证你的Java进程不会因为内存问题被容器Kill
</span></span><span class="line"><span class="ln">24</span><span class="cl">-XX:+UseCGroupMemoryLimitForHeap :感知CGroup的内存限制，防止容器被kill
</span></span><span class="line"><span class="ln">25</span><span class="cl">-XX:+UseCompressedOops 
</span></span><span class="line"><span class="ln">26</span><span class="cl">-XX:+UseCompressedClassPointers : 开启需要UseCompressedOops的支持，
</span></span><span class="line"><span class="ln">27</span><span class="cl">    如果不开启普通对象指针压缩，-UseCompressedOops，会在内存中消耗24个字节，o 指针占8个字节，Object对象占16个字节。
</span></span><span class="line"><span class="ln">28</span><span class="cl">    如果开启普通对象指针压缩，+UseCompressedOops，会在内存中消耗20个字节，o指针占4个字节，Object对象占16个字节。
</span></span><span class="line"><span class="ln">29</span><span class="cl">-XX:+UseParallelGC: 指定垃圾收集器为并行收集器
</span></span></code></pre></div>
<h4 id="压缩" data-numberify>压缩<a class="anchor ms-1" href="#压缩"></a></h4>
<ul>
<li>
<p>-XX:+UseCompressedOops: 针对32位、64位系统占用空间不同，进行压缩，主要节省内存和缩短GC时间</p>]]></description></item><item><title>Controller方法上自定义注解</title><link>https://clibing.com/posts/java/spring/controller-annotation/</link><pubDate>Thu, 16 Apr 2020 17:31:56 +0800</pubDate><guid>https://clibing.com/posts/java/spring/controller-annotation/</guid><description><![CDATA[<h3 id="定义自定义注解" data-numberify>定义自定义注解<a class="anchor ms-1" href="#定义自定义注解"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="ln">1</span><span class="cl"><span class="nd">@Retention</span><span class="p">(</span><span class="n">RetentionPolicy</span><span class="p">.</span><span class="na">RUNTIME</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="nd">@Target</span><span class="p">(</span><span class="n">ElementType</span><span class="p">.</span><span class="na">PARAMETER</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="nd">@interface</span><span class="w"> </span><span class="n">Logined</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="注解处理器" data-numberify>注解处理器<a class="anchor ms-1" href="#注解处理器"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="nd">@Component</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="nd">@Slf4j</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">LoginedArgumentResolver</span><span class="w"> </span><span class="kd">implements</span><span class="w"> </span><span class="n">HandlerMethodArgumentResolver</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w">    </span><span class="nd">@Override</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kt">boolean</span><span class="w"> </span><span class="nf">supportsParameter</span><span class="p">(</span><span class="n">MethodParameter</span><span class="w"> </span><span class="n">parameter</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w">        </span><span class="k">return</span><span class="w"> </span><span class="n">CurrentRequest</span><span class="p">.</span><span class="na">class</span><span class="p">.</span><span class="na">isAssignableFrom</span><span class="p">(</span><span class="n">parameter</span><span class="p">.</span><span class="na">getParameterType</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">    </span><span class="nd">@Override</span><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="n">Object</span><span class="w"> </span><span class="nf">resolveArgument</span><span class="p">(</span><span class="n">MethodParameter</span><span class="w"> </span><span class="n">parameter</span><span class="p">,</span><span class="w"> </span><span class="n">ModelAndViewContainer</span><span class="w"> </span><span class="n">mavContainer</span><span class="p">,</span><span class="w"> </span><span class="n">NativeWebRequest</span><span class="w"> </span><span class="n">webRequest</span><span class="p">,</span><span class="w"> </span><span class="n">WebDataBinderFactory</span><span class="w"> </span><span class="n">binderFactory</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">Exception</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="w">        </span><span class="n">HttpServletRequest</span><span class="w"> </span><span class="n">request</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">HttpServletRequest</span><span class="p">)</span><span class="w"> </span><span class="n">webRequest</span><span class="p">.</span><span class="na">getNativeRequest</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="w">        </span><span class="n">CurrentRequest</span><span class="w"> </span><span class="n">currentRequest</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">CurrentRequest</span><span class="p">)</span><span class="w"> </span><span class="n">request</span><span class="p">.</span><span class="na">getAttribute</span><span class="p">(</span><span class="n">CurrentRequest</span><span class="p">.</span><span class="na">requestAttributeName</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="w">        </span><span class="k">return</span><span class="w"> </span><span class="n">currentRequest</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="使用" data-numberify>使用<a class="anchor ms-1" href="#使用"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="ln">1</span><span class="cl"><span class="w">    </span><span class="nd">@RequestMapping</span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="s">&#34;...&#34;</span><span class="p">})</span><span class="w">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="n">Object</span><span class="w"> </span><span class="nf">create</span><span class="p">(</span><span class="n">HttpServletRequest</span><span class="w"> </span><span class="n">request</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="w">                         </span><span class="nd">@Logined</span><span class="w"> </span><span class="n">CurrentRequest</span><span class="w"> </span><span class="n">user</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="w">                             </span><span class="p">......</span><span class="w">
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>]]></description></item><item><title>Java 基础技</title><link>https://clibing.com/posts/java/jdk/java_base/</link><pubDate>Thu, 16 Apr 2020 17:31:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/java_base/</guid><description><![CDATA[<h2 id="java-基础技能" data-numberify>Java 基础技能<a class="anchor ms-1" href="#java-基础技能"></a></h2>
<p>包括以下大致内容</p>
<ul>
<li>Object类的常用方法</li>
<li>常用反射方法</li>
<li>常用字段处理</li>
<li>枚举处理</li>
<li>泛型的获取</li>
<li>基本类型的判断</li>
</ul>

<h3 id="1-isassignablefrom与instanceof" data-numberify>1. isAssignableFrom()与instanceof<a class="anchor ms-1" href="#1-isassignablefrom与instanceof"></a></h3>
<ul>
<li><code>isAssignableFrom()</code>
<ul>
<li>描述：判断目标类是否为父类的子类</li>
<li>使用：父类.class.isAssignableFrom(子类.class)</li>
</ul>
</li>
<li><code>instanceof</code>
<ul>
<li>描述：判断实例是否为父类的子类</li>
<li>描述：(new)实例 instanceof 父类</li>
</ul>
</li>
</ul>
<p>具体的demo如下</p>]]></description></item><item><title>Java基本类型</title><link>https://clibing.com/posts/java/jdk/basic_types/</link><pubDate>Fri, 10 Apr 2020 15:46:22 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/basic_types/</guid><description><![CDATA[<h3 id="一java基础类型" data-numberify>一、Java基础类型<a class="anchor ms-1" href="#一java基础类型"></a></h3>
<table>
  <thead>
      <tr>
          <th>名字</th>
          <th>默认值</th>
          <th>占用空间</th>
          <th>最大值</th>
          <th>最小值</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>byte</td>
          <td>0</td>
          <td>8位</td>
          <td>127(2^7-1)</td>
          <td>-128(-2^7)</td>
      </tr>
      <tr>
          <td>chat</td>
          <td>&lsquo;u0000&rsquo;</td>
          <td>16 位 Unicode 字符</td>
          <td>\uffff (65535)</td>
          <td>\u0000 (0)</td>
      </tr>
      <tr>
          <td>boolean</td>
          <td>false</td>
          <td>1位</td>
          <td>-</td>
          <td>-</td>
      </tr>
      <tr>
          <td>short</td>
          <td>0</td>
          <td>16位</td>
          <td>32767（2^15 - 1）</td>
          <td>-32768（-2^15）</td>
      </tr>
      <tr>
          <td>int</td>
          <td>0</td>
          <td>32 位</td>
          <td>2,147,483,647(2^31 - 1)</td>
          <td>-2,147,483,648（-2^31）</td>
      </tr>
      <tr>
          <td>float</td>
          <td>0.0f</td>
          <td>32位</td>
          <td>-</td>
          <td>-</td>
      </tr>
      <tr>
          <td>long</td>
          <td>0L</td>
          <td>64 位</td>
          <td>9,223,372,036,854,775,807(2^63 -1)</td>
          <td>-9,223,372,036,854,775,808(-2^63)</td>
      </tr>
      <tr>
          <td>double</td>
          <td>0.0d</td>
          <td>64位</td>
          <td>-</td>
          <td>-</td>
      </tr>
      <tr>
          <td>String</td>
          <td>null</td>
          <td>-</td>
          <td>-</td>
          <td>-</td>
      </tr>
  </tbody>
</table>
<p><code>占用空间: 位/8=字节</code></p>]]></description></item><item><title>Java中init和clinit方法的区别</title><link>https://clibing.com/posts/java/jdk/clinit-and-init-diffent/</link><pubDate>Mon, 06 Apr 2020 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/clinit-and-init-diffent/</guid><description><![CDATA[<h3 id="调用时机" data-numberify>调用时机<a class="anchor ms-1" href="#调用时机"></a></h3>
<p>clinit在jvm第一次加载class时调用，init在实例创建出来的时候调用</p>
<ul>
<li>clinit在jvm第一次加载class文件时调用，包括<code>静态变量初始化语句和静态块的执行</code></li>
<li>init在实例创建出来的时候调用，包括调用new操作符；调用Class或java.lang.reflect.Constructor对象的newInstance()方法；调用任何现有对象的clone()方法；通过java.io.ObjectInputStream类的getObject()方法反序列化。</li>
</ul>

<h3 id="详情" data-numberify>详情<a class="anchor ms-1" href="#详情"></a></h3>
<ol>
<li>clinit方法是由编译器自动收集类中的所有类变量的赋值动作和静态语句块（static）中的语句合并产生的，编译器收集的顺序是由语句在源文件中出现的顺序所决定的，静态语句块只能访问到定义在静态语句块之前的变量，点贵在他之后的变量，在前面的静态语句块中可以赋值但不能访问。
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="ln">1</span><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">Test</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="w">  </span><span class="kd">static</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="w">    </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">0</span><span class="p">;</span><span class="c1">//给变量赋值可以正常通过</span><span class="w">
</span></span></span><span class="line"><span class="ln">4</span><span class="cl"><span class="w">    </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="n">i</span><span class="p">);</span><span class="c1">//这句编译器会提示“非法向前引用”</span><span class="w">
</span></span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="w">  </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">6</span><span class="cl"><span class="w">  </span><span class="kd">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">1</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div></li>
<li>clinit方法与类的构造函数（或者说实例构造器中的<!-- raw HTML omitted -->()方法）不同， 它不需要显示的调用父类构造器，虚拟机会保证在<code>子类的&lt;init&gt;()方法执行之前，父类的&lt;clinit&gt;()方法已经执行完毕</code>。因为在虚拟机中第一个被执行的<!-- raw HTML omitted -->()方法的类肯定是java.lang.Object</li>
<li>由于父类的clinit方法先执行，也就意味着父类中定义的静态语句块要优先于子类类的变量赋值操作。</li>
<li>clinit方法对于类或者接口来说并不是必须的，如果一个类没有静态语句块，也就没有变量的赋值操作，那么编译器可以不为这个类生成<!-- raw HTML omitted -->()方法。</li>
<li>接口中不能使用静态语句块，但仍然可以有变量初始化的赋值操作，因此接口与类一样都会生成<!-- raw HTML omitted -->()方法。但接口与类不同，执行接口的<!-- raw HTML omitted -->()方法不需要先执行父接口的<!-- raw HTML omitted -->()方法。只有当父接口中定义的变量使用时，父接口才会初始化。另外，接口的实现类在初始化时也一样不会执行接口的<!-- raw HTML omitted -->()方法。</li>
<li>虚拟机会保证一个类的<!-- raw HTML omitted -->()方法在多线程环境中被正确地加锁、同步，如果多个线程同时去初始化一个类，那么只有一个线程去执行这个类的<!-- raw HTML omitted -->()方法中有耗时很长的操作，就可能造成多个线程阻塞。</li>
</ol>

<h3 id="举例" data-numberify>举例<a class="anchor ms-1" href="#举例"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="ln"> 1</span><span class="cl"><span class="w">    </span><span class="kd">class</span> <span class="nc">Single</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 2</span><span class="cl"><span class="w">        </span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">Single</span><span class="w"> </span><span class="n">single</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">Single</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 3</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">count1</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 4</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">count2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">0</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 5</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 6</span><span class="cl"><span class="w">        </span><span class="kd">private</span><span class="w"> </span><span class="nf">Single</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 7</span><span class="cl"><span class="w">            </span><span class="n">count1</span><span class="o">++</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 8</span><span class="cl"><span class="w">            </span><span class="n">count2</span><span class="o">++</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 9</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">10</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">Single</span><span class="w"> </span><span class="nf">getInstance</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">11</span><span class="cl"><span class="w">            </span><span class="k">return</span><span class="w"> </span><span class="n">single</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">12</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">13</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">14</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">15</span><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">class</span> <span class="nc">Test</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">16</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">main</span><span class="p">(</span><span class="n">String</span><span class="o">[]</span><span class="w"> </span><span class="n">args</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">17</span><span class="cl"><span class="w">            </span><span class="n">Single</span><span class="w"> </span><span class="n">single</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Single</span><span class="p">.</span><span class="na">getInstance</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">18</span><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;count1=&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">single</span><span class="p">.</span><span class="na">count1</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">19</span><span class="cl"><span class="w">            </span><span class="n">System</span><span class="p">.</span><span class="na">out</span><span class="p">.</span><span class="na">println</span><span class="p">(</span><span class="s">&#34;count2=&#34;</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">single</span><span class="p">.</span><span class="na">count2</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">20</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">21</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span></code></pre></div><p>输出结果：</p>]]></description></item><item><title>Java内存优化之Reference分析</title><link>https://clibing.com/posts/java/jdk/reference/</link><pubDate>Tue, 27 Feb 2018 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/reference/</guid><description><![CDATA[<p>Java的内存优化之Reference，SoftReference、WeakReference、StrongReference</p>

<h3 id="引用对象类型定义" data-numberify>引用对象类型定义<a class="anchor ms-1" href="#引用对象类型定义"></a></h3>
<p>首先，引用对象在Java定义中有三种类型，从弱到强依次为：软引用、弱引用与虚引用，三种级别也各有所不同(软引用&gt;弱引用)。本文浅析下软引用与弱引用。大概的解释，软引用适合应用在需要cache的场景，一般面向实现内存敏感的缓存；弱引用则是适用在某些场景为了无法防止被回收的规范性映射，它优先级最低，一般与引用队列联合使用。</p>]]></description></item><item><title>HttpClient 工具类</title><link>https://clibing.com/posts/java/apache-httpclient/</link><pubDate>Thu, 08 Feb 2018 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/apache-httpclient/</guid><description><![CDATA[<h3 id="httpclient-工具类" data-numberify>HttpClient 工具类<a class="anchor ms-1" href="#httpclient-工具类"></a></h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-java" data-lang="java"><span class="line"><span class="ln">  1</span><span class="cl"><span class="kn">package</span><span class="w"> </span><span class="nn">cn.linuxcrypt.utils</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">  2</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">  3</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.*</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">  4</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.client.ClientProtocolException</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">  5</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.client.ResponseHandler</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">  6</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.client.config.CookieSpecs</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">  7</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.client.config.RequestConfig</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">  8</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.client.entity.UrlEncodedFormEntity</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">  9</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.client.methods.CloseableHttpResponse</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 10</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.client.methods.HttpGet</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 11</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.client.methods.HttpPost</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 12</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.client.methods.HttpRequestBase</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 13</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.client.protocol.HttpClientContext</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 14</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.config.ConnectionConfig</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 15</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.config.Registry</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 16</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.config.RegistryBuilder</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 17</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.conn.ConnectionKeepAliveStrategy</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 18</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.conn.socket.ConnectionSocketFactory</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 19</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.conn.socket.PlainConnectionSocketFactory</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 20</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.conn.ssl.SSLConnectionSocketFactory</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 21</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.entity.ContentType</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 22</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.impl.client.CloseableHttpClient</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 23</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.impl.client.DefaultHttpRequestRetryHandler</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 24</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.impl.conn.PoolingHttpClientConnectionManager</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 25</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.message.BasicHeader</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 26</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.message.BasicHeaderElementIterator</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 27</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.message.BasicNameValuePair</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 28</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.protocol.HTTP</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 29</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.protocol.HttpContext</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 30</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.ssl.SSLContextBuilder</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 31</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.util.Args</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 32</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">org.apache.http.util.EntityUtils</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 33</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 34</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">javax.net.ssl.SSLContext</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 35</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">javax.net.ssl.TrustManager</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 36</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">javax.net.ssl.X509TrustManager</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 37</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.io.IOException</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 38</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.nio.charset.Charset</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 39</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.nio.charset.CodingErrorAction</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 40</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.security.cert.X509Certificate</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 41</span><span class="cl"><span class="kn">import</span><span class="w"> </span><span class="nn">java.util.*</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 42</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 43</span><span class="cl"><span class="kd">public</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="kd">class</span> <span class="nc">HttpClients</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 44</span><span class="cl"><span class="w">    </span><span class="c1">// 设置整个连接池最大连接数</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 45</span><span class="cl"><span class="w">    </span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">POOL_MAX_TOTAL</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">2</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 46</span><span class="cl"><span class="w">    </span><span class="cm">/**
</span></span></span><span class="line"><span class="ln"> 47</span><span class="cl"><span class="cm">     * 设置整个连接池最大连接数
</span></span></span><span class="line"><span class="ln"> 48</span><span class="cl"><span class="cm">     *
</span></span></span><span class="line"><span class="ln"> 49</span><span class="cl"><span class="cm">     * @param maxTotal
</span></span></span><span class="line"><span class="ln"> 50</span><span class="cl"><span class="cm">     */</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 51</span><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">setPoolMaxTotal</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">maxTotal</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 52</span><span class="cl"><span class="w">        </span><span class="kd">synchronized</span><span class="w"> </span><span class="p">(</span><span class="n">HttpClients</span><span class="p">.</span><span class="na">class</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 53</span><span class="cl"><span class="w">            </span><span class="n">POOL_MAX_TOTAL</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">maxTotal</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 54</span><span class="cl"><span class="w">            </span><span class="n">HttpClientPool</span><span class="p">.</span><span class="na">setMaxTotal</span><span class="p">(</span><span class="n">maxTotal</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 55</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 56</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 57</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 58</span><span class="cl"><span class="w">    </span><span class="cm">/**
</span></span></span><span class="line"><span class="ln"> 59</span><span class="cl"><span class="cm">     * http 连接池
</span></span></span><span class="line"><span class="ln"> 60</span><span class="cl"><span class="cm">     */</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 61</span><span class="cl"><span class="w">    </span><span class="kd">static</span><span class="w"> </span><span class="kd">class</span> <span class="nc">HttpClientPool</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 62</span><span class="cl"><span class="w">        </span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">PoolingHttpClientConnectionManager</span><span class="w"> </span><span class="n">poolingHttpClientConnectionManager</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 63</span><span class="cl"><span class="w">        </span><span class="c1">// 设置每个路由上的默认连接个数，setMaxPerRoute则单独为某个站点设置最大连接个数。</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 64</span><span class="cl"><span class="w">        </span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">POOL_MAX_PER_ROUTER</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">1</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 65</span><span class="cl"><span class="w">        </span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">DEFAULT_USER_AGENT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&#34;Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0&#34;</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 66</span><span class="cl"><span class="w">        </span><span class="c1">// keepalive</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 67</span><span class="cl"><span class="w">        </span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">DEFAULT_KEEP_ALIVE</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">30</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">1000</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 68</span><span class="cl"><span class="w">        </span><span class="cm">/**
</span></span></span><span class="line"><span class="ln"> 69</span><span class="cl"><span class="cm">         * 从连接池中获取请求连接的超时时间 单位毫秒
</span></span></span><span class="line"><span class="ln"> 70</span><span class="cl"><span class="cm">         * -1: 系统默认的超时时间，内核级配置
</span></span></span><span class="line"><span class="ln"> 71</span><span class="cl"><span class="cm">         * 0: 无限制。
</span></span></span><span class="line"><span class="ln"> 72</span><span class="cl"><span class="cm">         * 具体参考{@link org.apache.http.client.config.RequestConfig#getConnectionRequestTimeout()}
</span></span></span><span class="line"><span class="ln"> 73</span><span class="cl"><span class="cm">         */</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 74</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">DEFAULT_CONNECTION_REQUEST_TIMEOUT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">-</span><span class="n">1</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 75</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 76</span><span class="cl"><span class="w">        </span><span class="c1">// 默认连接超时时间</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 77</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">DEFAULT_CONNECT_TIMEOUT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">10000</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 78</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 79</span><span class="cl"><span class="w">        </span><span class="c1">// 默认socket读取数据超时时间,具体的长耗时请求中(如文件传送等)必须覆盖此设置</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 80</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">final</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">DEFAULT_SO_TIMEOUT</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">15000</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 81</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 82</span><span class="cl"><span class="w">        </span><span class="kd">static</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 83</span><span class="cl"><span class="w">            </span><span class="n">Registry</span><span class="o">&lt;</span><span class="n">ConnectionSocketFactory</span><span class="o">&gt;</span><span class="w"> </span><span class="n">socketFactoryRegistry</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 84</span><span class="cl"><span class="w">            </span><span class="k">try</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 85</span><span class="cl"><span class="w">                </span><span class="kd">final</span><span class="w"> </span><span class="n">SSLContext</span><span class="w"> </span><span class="n">sslContext</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">SSLContextBuilder</span><span class="p">.</span><span class="na">create</span><span class="p">().</span><span class="na">build</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 86</span><span class="cl"><span class="w">                </span><span class="n">sslContext</span><span class="p">.</span><span class="na">init</span><span class="p">(</span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">TrustManager</span><span class="o">[]</span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 87</span><span class="cl"><span class="w">                        </span><span class="k">new</span><span class="w"> </span><span class="n">X509TrustManager</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 88</span><span class="cl"><span class="w">                            </span><span class="kd">public</span><span class="w"> </span><span class="n">X509Certificate</span><span class="o">[]</span><span class="w"> </span><span class="nf">getAcceptedIssuers</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 89</span><span class="cl"><span class="w">                                </span><span class="k">return</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 90</span><span class="cl"><span class="w">                            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 91</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 92</span><span class="cl"><span class="w">                            </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">checkClientTrusted</span><span class="p">(</span><span class="n">X509Certificate</span><span class="o">[]</span><span class="w"> </span><span class="n">certs</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">authType</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 93</span><span class="cl"><span class="w">                            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 94</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln"> 95</span><span class="cl"><span class="w">                            </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">checkServerTrusted</span><span class="p">(</span><span class="n">X509Certificate</span><span class="o">[]</span><span class="w"> </span><span class="n">certs</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="n">authType</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 96</span><span class="cl"><span class="w">                            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 97</span><span class="cl"><span class="w">                        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 98</span><span class="cl"><span class="w">                </span><span class="p">},</span><span class="w"> </span><span class="kc">null</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln"> 99</span><span class="cl"><span class="w">                </span><span class="n">socketFactoryRegistry</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RegistryBuilder</span><span class="w">
</span></span></span><span class="line"><span class="ln">100</span><span class="cl"><span class="w">                        </span><span class="p">.</span><span class="o">&lt;</span><span class="n">ConnectionSocketFactory</span><span class="o">&gt;</span><span class="n">create</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="ln">101</span><span class="cl"><span class="w">                        </span><span class="p">.</span><span class="na">register</span><span class="p">(</span><span class="s">&#34;http&#34;</span><span class="p">,</span><span class="w"> </span><span class="n">PlainConnectionSocketFactory</span><span class="p">.</span><span class="na">INSTANCE</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">102</span><span class="cl"><span class="w">                        </span><span class="p">.</span><span class="na">register</span><span class="p">(</span><span class="s">&#34;https&#34;</span><span class="p">,</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">SSLConnectionSocketFactory</span><span class="p">(</span><span class="n">sslContext</span><span class="p">)).</span><span class="na">build</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">103</span><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">104</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">105</span><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">106</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">107</span><span class="cl"><span class="w">            </span><span class="n">poolingHttpClientConnectionManager</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">PoolingHttpClientConnectionManager</span><span class="p">(</span><span class="n">socketFactoryRegistry</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">108</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">109</span><span class="cl"><span class="w">            </span><span class="c1">//连接池的最大连接数</span><span class="w">
</span></span></span><span class="line"><span class="ln">110</span><span class="cl"><span class="w">            </span><span class="n">poolingHttpClientConnectionManager</span><span class="p">.</span><span class="na">setMaxTotal</span><span class="p">(</span><span class="n">POOL_MAX_TOTAL</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">111</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">112</span><span class="cl"><span class="w">            </span><span class="cm">/**
</span></span></span><span class="line"><span class="ln">113</span><span class="cl"><span class="cm">             * 设置每个路由上的默认连接个数，setMaxPerRoute则单独为某个站点设置最大连接个数。
</span></span></span><span class="line"><span class="ln">114</span><span class="cl"><span class="cm">             *
</span></span></span><span class="line"><span class="ln">115</span><span class="cl"><span class="cm">             * DefaultMaxPerRoute是根据连接到的主机对MaxTotal的一个细分；比如：
</span></span></span><span class="line"><span class="ln">116</span><span class="cl"><span class="cm">             * MaxtTotal=400 DefaultMaxPerRoute=200
</span></span></span><span class="line"><span class="ln">117</span><span class="cl"><span class="cm">             * 而我只连接到http://a.com时，到这个主机的并发最多只有200；而不是400；
</span></span></span><span class="line"><span class="ln">118</span><span class="cl"><span class="cm">             * 而我连接到http://a.com 和 http://b.com时，到每个主机的并发最多只有200；即加起来是400（但不能超过400；所以起作用的设置是DefaultMaxPerRoute。
</span></span></span><span class="line"><span class="ln">119</span><span class="cl"><span class="cm">             */</span><span class="w">
</span></span></span><span class="line"><span class="ln">120</span><span class="cl"><span class="w">            </span><span class="n">poolingHttpClientConnectionManager</span><span class="p">.</span><span class="na">setDefaultMaxPerRoute</span><span class="p">(</span><span class="n">POOL_MAX_PER_ROUTER</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">121</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">122</span><span class="cl"><span class="w">            </span><span class="c1">// 默认连接配置</span><span class="w">
</span></span></span><span class="line"><span class="ln">123</span><span class="cl"><span class="w">            </span><span class="n">ConnectionConfig</span><span class="w"> </span><span class="n">connectionConfig</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ConnectionConfig</span><span class="p">.</span><span class="na">custom</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="ln">124</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">setMalformedInputAction</span><span class="p">(</span><span class="n">CodingErrorAction</span><span class="p">.</span><span class="na">IGNORE</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">125</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">setUnmappableInputAction</span><span class="p">(</span><span class="n">CodingErrorAction</span><span class="p">.</span><span class="na">IGNORE</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">126</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">setCharset</span><span class="p">(</span><span class="n">Consts</span><span class="p">.</span><span class="na">UTF_8</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">127</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">build</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">128</span><span class="cl"><span class="w">            </span><span class="n">poolingHttpClientConnectionManager</span><span class="p">.</span><span class="na">setDefaultConnectionConfig</span><span class="p">(</span><span class="n">connectionConfig</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">129</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">130</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">131</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">setMaxTotal</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">maxTotal</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">132</span><span class="cl"><span class="w">            </span><span class="n">poolingHttpClientConnectionManager</span><span class="p">.</span><span class="na">setMaxTotal</span><span class="p">(</span><span class="n">maxTotal</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">133</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">134</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">135</span><span class="cl"><span class="w">        </span><span class="cm">/**
</span></span></span><span class="line"><span class="ln">136</span><span class="cl"><span class="cm">         * 增加默认的http 头
</span></span></span><span class="line"><span class="ln">137</span><span class="cl"><span class="cm">         *
</span></span></span><span class="line"><span class="ln">138</span><span class="cl"><span class="cm">         * @return
</span></span></span><span class="line"><span class="ln">139</span><span class="cl"><span class="cm">         * @{link https://www.cnblogs.com/lwhkdash/archive/2012/10/14/2723252.html}
</span></span></span><span class="line"><span class="ln">140</span><span class="cl"><span class="cm">         */</span><span class="w">
</span></span></span><span class="line"><span class="ln">141</span><span class="cl"><span class="w">        </span><span class="kd">private</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">Set</span><span class="o">&lt;</span><span class="n">Header</span><span class="o">&gt;</span><span class="w"> </span><span class="nf">defaultHeaders</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">142</span><span class="cl"><span class="w">            </span><span class="n">Set</span><span class="o">&lt;</span><span class="n">Header</span><span class="o">&gt;</span><span class="w"> </span><span class="n">header</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">HashSet</span><span class="o">&lt;&gt;</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">143</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">144</span><span class="cl"><span class="w">            </span><span class="n">Header</span><span class="w"> </span><span class="n">accept</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">BasicHeader</span><span class="p">(</span><span class="n">HttpHeaders</span><span class="p">.</span><span class="na">ACCEPT</span><span class="p">,</span><span class="w">
</span></span></span><span class="line"><span class="ln">145</span><span class="cl"><span class="w">                    </span><span class="s">&#34;text/html,application/xhtml+xml,application/json,application/xml;q=0.9,*/*;q=0.8&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">146</span><span class="cl"><span class="w">            </span><span class="n">header</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">accept</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">147</span><span class="cl"><span class="w">            </span><span class="n">Header</span><span class="w"> </span><span class="n">acceptEncoding</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">BasicHeader</span><span class="p">(</span><span class="n">HttpHeaders</span><span class="p">.</span><span class="na">ACCEPT_ENCODING</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;gzip, deflate&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">148</span><span class="cl"><span class="w">            </span><span class="n">header</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">acceptEncoding</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">149</span><span class="cl"><span class="w">            </span><span class="n">Header</span><span class="w"> </span><span class="n">acceptLanguage</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">BasicHeader</span><span class="p">(</span><span class="n">HttpHeaders</span><span class="p">.</span><span class="na">ACCEPT_LANGUAGE</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">150</span><span class="cl"><span class="w">            </span><span class="n">header</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">acceptLanguage</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">151</span><span class="cl"><span class="w">            </span><span class="n">Header</span><span class="w"> </span><span class="n">connect</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">BasicHeader</span><span class="p">(</span><span class="n">HttpHeaders</span><span class="p">.</span><span class="na">CONNECTION</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;keep-alive&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">152</span><span class="cl"><span class="w">            </span><span class="n">header</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">connect</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">153</span><span class="cl"><span class="w">            </span><span class="n">Header</span><span class="w"> </span><span class="n">acceptCharset</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">BasicHeader</span><span class="p">(</span><span class="n">HttpHeaders</span><span class="p">.</span><span class="na">ACCEPT_CHARSET</span><span class="p">,</span><span class="w"> </span><span class="n">Consts</span><span class="p">.</span><span class="na">UTF_8</span><span class="p">.</span><span class="na">name</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="ln">154</span><span class="cl"><span class="w">            </span><span class="n">header</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">acceptCharset</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">155</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">156</span><span class="cl"><span class="w">            </span><span class="c1">// DO NOT TRACK的缩写，要求服务器程序不要跟踪记录用户信息。DNT: 1 (开启DNT) DNT: 0 (关闭DNT)火狐，safari,IE9都支持这个头域，并且于2011年3月7日被提交至IETF组织实现标准化</span><span class="w">
</span></span></span><span class="line"><span class="ln">157</span><span class="cl"><span class="w">            </span><span class="n">Header</span><span class="w"> </span><span class="n">dnt</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">BasicHeader</span><span class="p">(</span><span class="s">&#34;DNT&#34;</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;1&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">158</span><span class="cl"><span class="w">            </span><span class="n">header</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">dnt</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">159</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">160</span><span class="cl"><span class="w">            </span><span class="k">return</span><span class="w"> </span><span class="n">header</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">161</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">162</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">163</span><span class="cl"><span class="w">        </span><span class="cm">/**
</span></span></span><span class="line"><span class="ln">164</span><span class="cl"><span class="cm">         * 获取 HttpClient
</span></span></span><span class="line"><span class="ln">165</span><span class="cl"><span class="cm">         * @return
</span></span></span><span class="line"><span class="ln">166</span><span class="cl"><span class="cm">         */</span><span class="w">
</span></span></span><span class="line"><span class="ln">167</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">CloseableHttpClient</span><span class="w"> </span><span class="nf">getHttpClient</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">168</span><span class="cl"><span class="w">            </span><span class="k">return</span><span class="w"> </span><span class="n">getHttpClient</span><span class="p">(</span><span class="n">DEFAULT_SO_TIMEOUT</span><span class="p">,</span><span class="w"> </span><span class="n">DEFAULT_CONNECT_TIMEOUT</span><span class="p">,</span><span class="w"> </span><span class="n">0</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">169</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">170</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">171</span><span class="cl"><span class="w">        </span><span class="cm">/**
</span></span></span><span class="line"><span class="ln">172</span><span class="cl"><span class="cm">         * 默认keepAlive策略：如果响应中存在服务器端的keepAlive超时时间则返回该时间否则返回默认的
</span></span></span><span class="line"><span class="ln">173</span><span class="cl"><span class="cm">         */</span><span class="w">
</span></span></span><span class="line"><span class="ln">174</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">class</span> <span class="nc">DefaultConnectionKeepAliveStrategy</span><span class="w"> </span><span class="kd">implements</span><span class="w"> </span><span class="n">ConnectionKeepAliveStrategy</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">175</span><span class="cl"><span class="w">            </span><span class="kd">public</span><span class="w"> </span><span class="kt">long</span><span class="w"> </span><span class="nf">getKeepAliveDuration</span><span class="p">(</span><span class="n">HttpResponse</span><span class="w"> </span><span class="n">response</span><span class="p">,</span><span class="w"> </span><span class="n">HttpContext</span><span class="w"> </span><span class="n">context</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">176</span><span class="cl"><span class="w">                </span><span class="n">HeaderElementIterator</span><span class="w"> </span><span class="n">it</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">BasicHeaderElementIterator</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="na">headerIterator</span><span class="p">(</span><span class="n">HTTP</span><span class="p">.</span><span class="na">CONN_KEEP_ALIVE</span><span class="p">));</span><span class="w">
</span></span></span><span class="line"><span class="ln">177</span><span class="cl"><span class="w">                </span><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">it</span><span class="p">.</span><span class="na">hasNext</span><span class="p">())</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">178</span><span class="cl"><span class="w">                    </span><span class="n">HeaderElement</span><span class="w"> </span><span class="n">he</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">it</span><span class="p">.</span><span class="na">nextElement</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">179</span><span class="cl"><span class="w">                    </span><span class="n">String</span><span class="w"> </span><span class="n">param</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">he</span><span class="p">.</span><span class="na">getName</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">180</span><span class="cl"><span class="w">                    </span><span class="n">String</span><span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">he</span><span class="p">.</span><span class="na">getValue</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">181</span><span class="cl"><span class="w">                    </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">value</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="n">param</span><span class="p">.</span><span class="na">equalsIgnoreCase</span><span class="p">(</span><span class="s">&#34;timeout&#34;</span><span class="p">))</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">182</span><span class="cl"><span class="w">                        </span><span class="k">try</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">183</span><span class="cl"><span class="w">                            </span><span class="k">return</span><span class="w"> </span><span class="n">Long</span><span class="p">.</span><span class="na">parseLong</span><span class="p">(</span><span class="n">value</span><span class="p">)</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">1000</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">184</span><span class="cl"><span class="w">                        </span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">NumberFormatException</span><span class="w"> </span><span class="n">ignore</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">185</span><span class="cl"><span class="w">                        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">186</span><span class="cl"><span class="w">                    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">187</span><span class="cl"><span class="w">                </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">188</span><span class="cl"><span class="w">                </span><span class="k">return</span><span class="w"> </span><span class="n">DEFAULT_KEEP_ALIVE</span><span class="p">;</span><span class="w"> </span><span class="c1">//默认30秒</span><span class="w">
</span></span></span><span class="line"><span class="ln">189</span><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">190</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">191</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">192</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">CloseableHttpClient</span><span class="w"> </span><span class="nf">getHttpClient</span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">socketTimeout</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">connectTimeout</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">retryCount</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">193</span><span class="cl"><span class="w">            </span><span class="n">RequestConfig</span><span class="w"> </span><span class="n">globalConfig</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">RequestConfig</span><span class="p">.</span><span class="na">custom</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="ln">194</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">setCookieSpec</span><span class="p">(</span><span class="n">CookieSpecs</span><span class="p">.</span><span class="na">IGNORE_COOKIES</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">195</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">setSocketTimeout</span><span class="p">(</span><span class="n">socketTimeout</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">196</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">setConnectionRequestTimeout</span><span class="p">(</span><span class="n">DEFAULT_CONNECTION_REQUEST_TIMEOUT</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">197</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">setConnectTimeout</span><span class="p">(</span><span class="n">connectTimeout</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">198</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">build</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">199</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">200</span><span class="cl"><span class="w">            </span><span class="n">CloseableHttpClient</span><span class="w"> </span><span class="n">closeableHttpClient</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">org</span><span class="p">.</span><span class="na">apache</span><span class="p">.</span><span class="na">http</span><span class="p">.</span><span class="na">impl</span><span class="p">.</span><span class="na">client</span><span class="p">.</span><span class="na">HttpClients</span><span class="w">
</span></span></span><span class="line"><span class="ln">201</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">custom</span><span class="p">()</span><span class="w">
</span></span></span><span class="line"><span class="ln">202</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">setConnectionManager</span><span class="p">(</span><span class="n">poolingHttpClientConnectionManager</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">203</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">setKeepAliveStrategy</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">DefaultConnectionKeepAliveStrategy</span><span class="p">())</span><span class="w">
</span></span></span><span class="line"><span class="ln">204</span><span class="cl"><span class="w">                    </span><span class="c1">// 另外设置http client的重试次数，默认是3次；当前是禁用掉（如果项目量不到，这个默认即可）</span><span class="w">
</span></span></span><span class="line"><span class="ln">205</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">setRetryHandler</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">DefaultHttpRequestRetryHandler</span><span class="p">(</span><span class="n">retryCount</span><span class="p">,</span><span class="w"> </span><span class="kc">false</span><span class="p">))</span><span class="w">
</span></span></span><span class="line"><span class="ln">206</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">setUserAgent</span><span class="p">(</span><span class="n">DEFAULT_USER_AGENT</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">207</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">setDefaultHeaders</span><span class="p">(</span><span class="n">defaultHeaders</span><span class="p">())</span><span class="w">
</span></span></span><span class="line"><span class="ln">208</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">setDefaultRequestConfig</span><span class="p">(</span><span class="n">globalConfig</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">209</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">setConnectionManagerShared</span><span class="p">(</span><span class="kc">true</span><span class="p">)</span><span class="w">
</span></span></span><span class="line"><span class="ln">210</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">evictExpiredConnections</span><span class="p">()</span><span class="c1">// 开启超时清理线程</span><span class="w">
</span></span></span><span class="line"><span class="ln">211</span><span class="cl"><span class="w">                    </span><span class="p">.</span><span class="na">build</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">212</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">213</span><span class="cl"><span class="w">            </span><span class="k">return</span><span class="w"> </span><span class="n">closeableHttpClient</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">214</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">215</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">216</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">217</span><span class="cl"><span class="w">    </span><span class="cm">/**
</span></span></span><span class="line"><span class="ln">218</span><span class="cl"><span class="cm">     * 对于特殊请求(比如请求涉及到cookie的处理,鉴权认证等),默认的一些配置已经满足不了了,
</span></span></span><span class="line"><span class="ln">219</span><span class="cl"><span class="cm">     * 这时就可以使用一个独立于全局的配置来执行请求,这个独立于全局,又不会干扰其他线程的请求执行的机制就是使用HttpClientContext,
</span></span></span><span class="line"><span class="ln">220</span><span class="cl"><span class="cm">     * 该设置类用于对已经提供的一个基于全局配置的副本,来设置一些配置(见HttpClientContext.setXxx)
</span></span></span><span class="line"><span class="ln">221</span><span class="cl"><span class="cm">     */</span><span class="w">
</span></span></span><span class="line"><span class="ln">222</span><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">interface</span> <span class="nc">HttpClientContextSetter</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">223</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">setHttpClientContext</span><span class="p">(</span><span class="n">HttpClientContext</span><span class="w"> </span><span class="n">context</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">224</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">225</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">226</span><span class="cl"><span class="w">    </span><span class="cm">/**
</span></span></span><span class="line"><span class="ln">227</span><span class="cl"><span class="cm">     * &lt;p&gt;执行http请求&lt;/p&gt;
</span></span></span><span class="line"><span class="ln">228</span><span class="cl"><span class="cm">     *
</span></span></span><span class="line"><span class="ln">229</span><span class="cl"><span class="cm">     * @param httpMethod              - HTTP请求(HttpGet、HttpPost等等)
</span></span></span><span class="line"><span class="ln">230</span><span class="cl"><span class="cm">     * @param httpClientContextSetter - 可选参数,请求前的一些参数设置(如：cookie、鉴权认证等)
</span></span></span><span class="line"><span class="ln">231</span><span class="cl"><span class="cm">     * @param responseHandler         - 必选参数,响应处理类(如针对httpstatu的各种值做一些策略处理等等)
</span></span></span><span class="line"><span class="ln">232</span><span class="cl"><span class="cm">     * @return 推荐使用 org.apache.http.impl.client.CloseableHttpClient#execute( org.apache.http.HttpHost,
</span></span></span><span class="line"><span class="ln">233</span><span class="cl"><span class="cm">     * org.apache.http.HttpRequest,
</span></span></span><span class="line"><span class="ln">234</span><span class="cl"><span class="cm">     * org.apache.http.client.ResponseHandler,
</span></span></span><span class="line"><span class="ln">235</span><span class="cl"><span class="cm">     * org.apache.http.protocol.HttpContext)
</span></span></span><span class="line"><span class="ln">236</span><span class="cl"><span class="cm">     */</span><span class="w">
</span></span></span><span class="line"><span class="ln">237</span><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="n">T</span><span class="w"> </span><span class="nf">doHttpRequest</span><span class="p">(</span><span class="n">HttpRequestBase</span><span class="w"> </span><span class="n">httpMethod</span><span class="p">,</span><span class="w"> </span><span class="n">HttpClientContextSetter</span><span class="w"> </span><span class="n">httpClientContextSetter</span><span class="p">,</span><span class="w"> </span><span class="n">ResponseHandler</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="w"> </span><span class="n">responseHandler</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">238</span><span class="cl"><span class="w">        </span><span class="n">Args</span><span class="p">.</span><span class="na">notNull</span><span class="p">(</span><span class="n">httpMethod</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Parameter &#39;httpMethod&#39; can not be null!&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">239</span><span class="cl"><span class="w">        </span><span class="n">Args</span><span class="p">.</span><span class="na">notNull</span><span class="p">(</span><span class="n">responseHandler</span><span class="p">,</span><span class="w"> </span><span class="s">&#34;Parameter &#39;responseHandler&#39; can not be null!&#34;</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">240</span><span class="cl"><span class="w">        </span><span class="n">CloseableHttpResponse</span><span class="w"> </span><span class="n">response</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">241</span><span class="cl"><span class="w">        </span><span class="k">try</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">242</span><span class="cl"><span class="w">            </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">httpClientContextSetter</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">243</span><span class="cl"><span class="w">                </span><span class="n">HttpClientContext</span><span class="w"> </span><span class="n">context</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">HttpClientContext</span><span class="p">.</span><span class="na">create</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">244</span><span class="cl"><span class="w">                </span><span class="n">httpClientContextSetter</span><span class="p">.</span><span class="na">setHttpClientContext</span><span class="p">(</span><span class="n">context</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">245</span><span class="cl"><span class="w">                </span><span class="n">response</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">HttpClientPool</span><span class="p">.</span><span class="na">getHttpClient</span><span class="p">().</span><span class="na">execute</span><span class="p">(</span><span class="n">httpMethod</span><span class="p">,</span><span class="w"> </span><span class="n">context</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">246</span><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">247</span><span class="cl"><span class="w">                </span><span class="n">response</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">HttpClientPool</span><span class="p">.</span><span class="na">getHttpClient</span><span class="p">().</span><span class="na">execute</span><span class="p">(</span><span class="n">httpMethod</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">248</span><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">249</span><span class="cl"><span class="w">            </span><span class="k">return</span><span class="w"> </span><span class="n">response</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">responseHandler</span><span class="p">.</span><span class="na">handleResponse</span><span class="p">(</span><span class="n">response</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">250</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">251</span><span class="cl"><span class="w">            </span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">RuntimeException</span><span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="na">getMessage</span><span class="p">(),</span><span class="w"> </span><span class="n">e</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">252</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w"> </span><span class="k">finally</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">253</span><span class="cl"><span class="w">            </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">response</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">254</span><span class="cl"><span class="w">                </span><span class="k">try</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">255</span><span class="cl"><span class="w">                    </span><span class="n">response</span><span class="p">.</span><span class="na">close</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">256</span><span class="cl"><span class="w">                </span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">IOException</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">257</span><span class="cl"><span class="w">                </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">258</span><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">259</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">260</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">261</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">262</span><span class="cl"><span class="w">    </span><span class="cm">/**
</span></span></span><span class="line"><span class="ln">263</span><span class="cl"><span class="cm">     * 默认的处理返回值为String的ResponseHandler
</span></span></span><span class="line"><span class="ln">264</span><span class="cl"><span class="cm">     */</span><span class="w">
</span></span></span><span class="line"><span class="ln">265</span><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="kd">class</span> <span class="nc">DefaultStringResponseHandler</span><span class="w"> </span><span class="kd">implements</span><span class="w"> </span><span class="n">ResponseHandler</span><span class="o">&lt;</span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">266</span><span class="cl"><span class="w">        </span><span class="cm">/**
</span></span></span><span class="line"><span class="ln">267</span><span class="cl"><span class="cm">         * 默认响应html字符集编码
</span></span></span><span class="line"><span class="ln">268</span><span class="cl"><span class="cm">         */</span><span class="w">
</span></span></span><span class="line"><span class="ln">269</span><span class="cl"><span class="w">        </span><span class="kd">private</span><span class="w"> </span><span class="n">Charset</span><span class="w"> </span><span class="n">defaultCharset</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Consts</span><span class="p">.</span><span class="na">UTF_8</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">270</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">271</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="nf">DefaultStringResponseHandler</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">272</span><span class="cl"><span class="w">            </span><span class="kd">super</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">273</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">274</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">275</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="nf">DefaultStringResponseHandler</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">defaultCharset</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">276</span><span class="cl"><span class="w">            </span><span class="kd">super</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">277</span><span class="cl"><span class="w">            </span><span class="k">this</span><span class="p">.</span><span class="na">defaultCharset</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Charset</span><span class="p">.</span><span class="na">forName</span><span class="p">(</span><span class="n">defaultCharset</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">278</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">279</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">280</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="n">Charset</span><span class="w"> </span><span class="nf">getDefaultCharset</span><span class="p">()</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">281</span><span class="cl"><span class="w">            </span><span class="k">return</span><span class="w"> </span><span class="n">defaultCharset</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">282</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">283</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">284</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="kt">void</span><span class="w"> </span><span class="nf">setDefaultCharset</span><span class="p">(</span><span class="n">Charset</span><span class="w"> </span><span class="n">defaultCharset</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">285</span><span class="cl"><span class="w">            </span><span class="k">this</span><span class="p">.</span><span class="na">defaultCharset</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">defaultCharset</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">286</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">287</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">288</span><span class="cl"><span class="w">        </span><span class="kd">public</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">handleResponse</span><span class="p">(</span><span class="n">HttpResponse</span><span class="w"> </span><span class="n">response</span><span class="p">)</span><span class="w"> </span><span class="kd">throws</span><span class="w"> </span><span class="n">ClientProtocolException</span><span class="p">,</span><span class="w"> </span><span class="n">IOException</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">289</span><span class="cl"><span class="w">            </span><span class="n">HttpEntity</span><span class="w"> </span><span class="n">httpEntity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">response</span><span class="p">.</span><span class="na">getEntity</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">290</span><span class="cl"><span class="w">            </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">httpEntity</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">291</span><span class="cl"><span class="w">                </span><span class="k">return</span><span class="w"> </span><span class="n">EntityUtils</span><span class="p">.</span><span class="na">toString</span><span class="p">(</span><span class="n">httpEntity</span><span class="p">,</span><span class="w"> </span><span class="n">defaultCharset</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">?</span><span class="w"> </span><span class="n">ContentType</span><span class="p">.</span><span class="na">getOrDefault</span><span class="p">(</span><span class="n">httpEntity</span><span class="p">).</span><span class="na">getCharset</span><span class="p">()</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">defaultCharset</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">292</span><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">293</span><span class="cl"><span class="w">            </span><span class="k">return</span><span class="w"> </span><span class="kc">null</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">294</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">295</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">296</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">297</span><span class="cl"><span class="w">    </span><span class="cm">/**
</span></span></span><span class="line"><span class="ln">298</span><span class="cl"><span class="cm">     * &lt;p&gt;根据URL和参数创建HttpPost对象&lt;/p&gt;
</span></span></span><span class="line"><span class="ln">299</span><span class="cl"><span class="cm">     *
</span></span></span><span class="line"><span class="ln">300</span><span class="cl"><span class="cm">     * @param url
</span></span></span><span class="line"><span class="ln">301</span><span class="cl"><span class="cm">     * @param paramMap
</span></span></span><span class="line"><span class="ln">302</span><span class="cl"><span class="cm">     * @return
</span></span></span><span class="line"><span class="ln">303</span><span class="cl"><span class="cm">     */</span><span class="w">
</span></span></span><span class="line"><span class="ln">304</span><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">HttpPost</span><span class="w"> </span><span class="nf">createHttpPost</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">url</span><span class="p">,</span><span class="w"> </span><span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">paramMap</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">305</span><span class="cl"><span class="w">        </span><span class="k">try</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">306</span><span class="cl"><span class="w">            </span><span class="n">HttpPost</span><span class="w"> </span><span class="n">httpPost</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">HttpPost</span><span class="p">(</span><span class="n">url</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">307</span><span class="cl"><span class="w">            </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">paramMap</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="o">!</span><span class="n">paramMap</span><span class="p">.</span><span class="na">isEmpty</span><span class="p">())</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">308</span><span class="cl"><span class="w">                </span><span class="n">List</span><span class="o">&lt;</span><span class="n">NameValuePair</span><span class="o">&gt;</span><span class="w"> </span><span class="n">params</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">ArrayList</span><span class="o">&lt;</span><span class="n">NameValuePair</span><span class="o">&gt;</span><span class="p">();</span><span class="w">
</span></span></span><span class="line"><span class="ln">309</span><span class="cl"><span class="w">                </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Map</span><span class="p">.</span><span class="na">Entry</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">entry</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">paramMap</span><span class="p">.</span><span class="na">entrySet</span><span class="p">())</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">310</span><span class="cl"><span class="w">                    </span><span class="n">params</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">BasicNameValuePair</span><span class="p">(</span><span class="n">entry</span><span class="p">.</span><span class="na">getKey</span><span class="p">(),</span><span class="w"> </span><span class="n">entry</span><span class="p">.</span><span class="na">getValue</span><span class="p">()));</span><span class="w">
</span></span></span><span class="line"><span class="ln">311</span><span class="cl"><span class="w">                </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">312</span><span class="cl"><span class="w">                </span><span class="n">UrlEncodedFormEntity</span><span class="w"> </span><span class="n">formEntity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">UrlEncodedFormEntity</span><span class="p">(</span><span class="n">params</span><span class="p">,</span><span class="w"> </span><span class="n">Consts</span><span class="p">.</span><span class="na">UTF_8</span><span class="p">.</span><span class="na">name</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="ln">313</span><span class="cl"><span class="w">                </span><span class="n">httpPost</span><span class="p">.</span><span class="na">setEntity</span><span class="p">(</span><span class="n">formEntity</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">314</span><span class="cl"><span class="w">            </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">315</span><span class="cl"><span class="w">            </span><span class="k">return</span><span class="w"> </span><span class="n">httpPost</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">316</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w"> </span><span class="k">catch</span><span class="w"> </span><span class="p">(</span><span class="n">Exception</span><span class="w"> </span><span class="n">e</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">317</span><span class="cl"><span class="w">            </span><span class="k">throw</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">RuntimeException</span><span class="p">(</span><span class="n">e</span><span class="p">.</span><span class="na">getMessage</span><span class="p">(),</span><span class="w"> </span><span class="n">e</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">318</span><span class="cl"><span class="w">        </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">319</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">320</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">321</span><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">get</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">url</span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w">
</span></span></span><span class="line"><span class="ln">322</span><span class="cl"><span class="w">        </span><span class="n">HttpGet</span><span class="w"> </span><span class="n">httpGet</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">HttpGet</span><span class="p">(</span><span class="n">url</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">323</span><span class="cl"><span class="w">        </span><span class="n">String</span><span class="w"> </span><span class="n">value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">doHttpRequest</span><span class="p">(</span><span class="n">httpGet</span><span class="p">,</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">DefaultStringResponseHandler</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="ln">324</span><span class="cl"><span class="w">        </span><span class="k">return</span><span class="w"> </span><span class="n">value</span><span class="p">;</span><span class="w">
</span></span></span><span class="line"><span class="ln">325</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">326</span><span class="cl"><span class="w">
</span></span></span><span class="line"><span class="ln">327</span><span class="cl"><span class="w">    </span><span class="kd">public</span><span class="w"> </span><span class="kd">static</span><span class="w"> </span><span class="n">String</span><span class="w"> </span><span class="nf">post</span><span class="p">(</span><span class="n">String</span><span class="w"> </span><span class="n">url</span><span class="p">,</span><span class="w"> </span><span class="n">Map</span><span class="o">&lt;</span><span class="n">String</span><span class="p">,</span><span class="w"> </span><span class="n">String</span><span class="o">&gt;</span><span class="w"> </span><span class="n">param</span><span class="p">){</span><span class="w">
</span></span></span><span class="line"><span class="ln">328</span><span class="cl"><span class="w">        </span><span class="n">HttpPost</span><span class="w"> </span><span class="n">post</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">createHttpPost</span><span class="p">(</span><span class="n">url</span><span class="p">,</span><span class="w"> </span><span class="n">param</span><span class="p">);</span><span class="w">
</span></span></span><span class="line"><span class="ln">329</span><span class="cl"><span class="w">        </span><span class="k">return</span><span class="w"> </span><span class="n">doHttpRequest</span><span class="p">(</span><span class="n">post</span><span class="p">,</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">DefaultStringResponseHandler</span><span class="p">());</span><span class="w">
</span></span></span><span class="line"><span class="ln">330</span><span class="cl"><span class="w">    </span><span class="p">}</span><span class="w">
</span></span></span><span class="line"><span class="ln">331</span><span class="cl"><span class="p">}</span><span class="w">
</span></span></span></code></pre></div>
<h3 id="总结" data-numberify>总结<a class="anchor ms-1" href="#总结"></a></h3>
<ol>
<li><code>DefaultMaxPerRoute</code>和<code>MaxTotal</code>配置
DefaultMaxPerRoute是根据连接到的主机对MaxTotal的一个细分；比如：
MaxtTotal=400 DefaultMaxPerRoute=200
而我只连接到http://a.com时，到这个主机的并发最多只有200；而不是400；
而我连接到http://a.com 和 <a href="http://b.com" target="_blank" rel="noopener noreferrer">http://b.com<i class="fas fa-external-link-square-alt ms-1"></i></a>时，到每个主机的并发最多只有200；即加起来是400（但不能超过400；所以起作用的设置是DefaultMaxPerRoute。</li>
<li>超时设置</li>
</ol>
<ul>
<li>connectionRequestTimeout: 从连接池中获取请求连接的超时时间 单位毫秒, -1:系统默认的超时时间，内核级配置; 0:无限制</li>
<li>connectTimeout: 默认连接超时时间</li>
<li>soTimeout: 默认socket读取数据超时时间,具体的长耗时请求中(如文件传送等)必须覆盖此设置</li>
</ul>
<ol start="3">
<li>策略</li>
</ol>
<ul>
<li>pool.evictExpiredConnections(true): 后台启动一个线程，进行超时连接处理</li>
<li>当获取可用连接时，采用LRU进行处理连接。</li>
</ul>
<ol start="4">
<li>池中池</li>
</ol>
<ul>
<li>httpclient在初始化时，设置的MaxTotal的参数为总的连接池</li>
<li>在最大的池中，根据主机的名字(route)进行小池的划分</li>
<li>在动态获取可用连接的时候采用<code>LRU</code>算法，清理或者释放连接</li>
</ul>
<ol start="5">
<li>available集合和leased集合</li>
</ol>
<ul>
<li>见 org.apache.http.pool.AbstractConnPool</li>
<li>leased集合当前租用的连接</li>
<li>available集合当前可用的连接</li>
<li>LRU会根据MaxTotal、leased集合总数、available集合总数进行LRU淘汰。</li>
</ul>
<ol start="6">
<li>Future<!-- raw HTML omitted --> 进行一步接收数据</li>
<li>持久连接</li>
</ol>
<ul>
<li>HTTP/1.1采取持久连接的方式替代了Keep-Alive</li>
<li>HTTP/1.1的连接默认情况下都是持久连接。如果要显式关闭，需要在报文中加上Connection:Close首部。即在HTTP/1.1中，所有的连接都进行了复用</li>
<li>两种方式，空闲的持久连接也可以随时被客户端与服务端关闭。不发送Connection:Close不意味着服务器承诺连接永远保持打开。</li>
</ul>
<ol start="8">
<li>EntityUtils.toString(HttpEntity, &hellip;)和EntityUtils.consume(HttpEntity);</li>
</ol>
<ul>
<li>注意此方法会关闭InputStream，因为是多路复用，每次读取完必须关闭，否则不能被复用</li>
<li>CloseableHttpResponse在每次请求完进行reponse.close()</li>
</ul>
<ol start="9">
<li>HttpClient不能关闭，否则连接都会重新建立，会发起tcp的3次握手连接和4次握手断开</li>
</ol>

<h3 id="测试" data-numberify>测试<a class="anchor ms-1" href="#测试"></a></h3>
<p>抓包测试池化后网络连接3次握手建立连接和4次握手断开连接(抓包只看到3次)</p>]]></description></item><item><title>Deque双向队列之ArrayDeque</title><link>https://clibing.com/posts/java/jdk/array-deque/</link><pubDate>Tue, 06 Feb 2018 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/array-deque/</guid><description><![CDATA[<h3 id="概述" data-numberify>概述<a class="anchor ms-1" href="#概述"></a></h3>
<p><picture><img class="img-fluid " alt="" src="https://clibing.com/images/java/ArrayDeque.png?v=fba7934f280e05fe331658c7d7767396" loading="lazy" width="480" height="372" />
</picture>

</p>
<p>Deque是Queue的子接口,我们知道Queue是一种队列形式,而Deque则是双向队列,它支持从两个端点方向检索和插入元素,因此Deque既可以支持LIFO形式也可以支持LIFO形式.Deque接口是一种比Stack和Vector更为丰富的抽象数据形式,因为它同时实现了以上两者
ArrayDeque实现了Deque的接口以及上图其他的接口，因此ArrayDeque支持序列化、克隆、迭代器操作、队列特性并且扩展了AbstractCollection抽象类</p>]]></description></item><item><title>Java 8中的常用函数式接口</title><link>https://clibing.com/posts/java/jdk/java8-functional-interface/</link><pubDate>Mon, 29 Jan 2018 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/java8-functional-interface/</guid><description><![CDATA[<h3 id="java-8中的常用函数式接口" data-numberify>Java 8中的常用函数式接口<a class="anchor ms-1" href="#java-8中的常用函数式接口"></a></h3>
<table>
  <thead>
      <tr>
          <th style="text-align: center">函数式接口</th>
          <th style="text-align: center">函数描述符</th>
          <th style="text-align: left">原始类型特化</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td style="text-align: center">Predicate<!-- raw HTML omitted --></td>
          <td style="text-align: center">T-&gt;boolean</td>
          <td style="text-align: left">IntPredicate, LongPredicate, DoublePredicate</td>
      </tr>
      <tr>
          <td style="text-align: center">Consumer<!-- raw HTML omitted --></td>
          <td style="text-align: center">T-&gt;void</td>
          <td style="text-align: left">IntConsumer,LongConsumer, DoubleConsumer</td>
      </tr>
      <tr>
          <td style="text-align: center">Function&lt;T,R&gt;</td>
          <td style="text-align: center">T-&gt;R</td>
          <td style="text-align: left">IntFunction<!-- raw HTML omitted -->, IntToDoubleFunction, IntToLongFunction,<!-- raw HTML omitted --> LongFunction<!-- raw HTML omitted -->, LongToDoubleFunction, LongToIntFunction,<!-- raw HTML omitted --> DoubleFunction<!-- raw HTML omitted -->, ToIntFunction<!-- raw HTML omitted -->, ToDoubleFunction<!-- raw HTML omitted -->,<!-- raw HTML omitted --> ToLongFunction<!-- raw HTML omitted --></td>
      </tr>
      <tr>
          <td style="text-align: center">Supplier<!-- raw HTML omitted --></td>
          <td style="text-align: center">()-&gt;T</td>
          <td style="text-align: left">BooleanSupplier,IntSupplier, LongSupplier, DoubleSupplier</td>
      </tr>
      <tr>
          <td style="text-align: center">UnaryOperator<!-- raw HTML omitted --></td>
          <td style="text-align: center">T-&gt;T</td>
          <td style="text-align: left">IntUnaryOperator, LongUnaryOperator, DoubleUnaryOperator</td>
      </tr>
      <tr>
          <td style="text-align: center">BinaryOperator<!-- raw HTML omitted --></td>
          <td style="text-align: center">(T,T)-&gt;T</td>
          <td style="text-align: left">IntBinaryOperator, LongBinaryOperator, DoubleBinaryOperator</td>
      </tr>
      <tr>
          <td style="text-align: center">BiPredicate&lt;L,R&gt;</td>
          <td style="text-align: center">(L,R)-&gt;boolean</td>
          <td style="text-align: left"></td>
      </tr>
      <tr>
          <td style="text-align: center">BiConsumer&lt;T,U&gt;</td>
          <td style="text-align: center">(T,U)-&gt;void</td>
          <td style="text-align: left">ObjIntConsumer<!-- raw HTML omitted -->, ObjLongConsumer<!-- raw HTML omitted -->, ObjDoubleConsumer<!-- raw HTML omitted --></td>
      </tr>
      <tr>
          <td style="text-align: center">BiFunction&lt;T,U,R&gt;</td>
          <td style="text-align: center">(T,U)-&gt;R</td>
          <td style="text-align: left">ToIntBiFunction&lt;T,U&gt;, ToLongBiFunction&lt;T,U&gt;, ToDoubleBiFunction&lt;T,U&gt;</td>
      </tr>
  </tbody>
</table>

<h3 id="测试" data-numberify>测试<a class="anchor ms-1" href="#测试"></a></h3>
<p>对于下列函数描述符(即Lambda表达式的签名),你会使用哪些函数式接口?在上表中
可以找到大部分答案。作为进一步练习,请构造一个可以利用这些函数式接口的有效Lambda</p>]]></description></item><item><title>Java 类加载机制</title><link>https://clibing.com/posts/java/jdk/java-classloader/</link><pubDate>Mon, 22 Jan 2018 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/java-classloader/</guid><description><![CDATA[<h3 id="java-类的加载机制" data-numberify>Java 类的加载机制<a class="anchor ms-1" href="#java-类的加载机制"></a></h3>
<p><picture><img class="img-fluid " alt="" src="https://clibing.com/images/java/class_loading.png?v=fba7934f280e05fe331658c7d7767396" loading="lazy" width="695" height="279" />
</picture>

</p>
<p>大致流程: <code>读取.class文件二进制文件</code>&ndash;&gt;<code>验证与解析(格式 关键字 关键词 语法 引用 类型转化等等)</code> &ndash;&gt; <code>初始化</code> &ndash;&gt; <code>使用</code> &ndash;&gt; <code>卸载</code></p>]]></description></item><item><title>分布式事物CAP和BASE理论介绍</title><link>https://clibing.com/posts/java/mybatis/distributed-transaction/</link><pubDate>Mon, 22 Jan 2018 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/mybatis/distributed-transaction/</guid><description><![CDATA[<blockquote>
<p>我们都知道普通的事务中有原子性，一致性，隔离性，持久性。而分布式事务中也有这些属性。</p>
</blockquote>

<h3 id="分布式事务" data-numberify>分布式事务<a class="anchor ms-1" href="#分布式事务"></a></h3>
<p>随着分布式计算的发展，事务在分布式中也得到了广泛的应用。
在单机数据库中，我们很容易能够实现满足ACID特性的事务处理系统，但在分布式数据库中，数据分散在各个不同的机器上，如何对这些数据进行分布式的事务处理具有非常大的挑战。
分布式中会有机器宕机和各种网络异常。尽管存在这种种分布式问题，但是在分布式计算领域，为了保证分布式应用程序的可靠性，分布式事务是无法回避的。</p>]]></description></item><item><title>Java CAS 理解</title><link>https://clibing.com/posts/java/jdk/java-cas/</link><pubDate>Mon, 06 Feb 2017 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/java-cas/</guid><description>&lt;blockquote>
&lt;p>CAS(Compare and Swap) 是利用底层硬件平台特性，实现原子性操作的算法，Java 1.5 以后 JUC(java.util.concurrent) 实现主要以此为基础；找了不少资料以下记录一下个人对于 CAS 的理解(部分资料 copy 的)&lt;/p></description></item><item><title>Java的安全可靠的动态跟踪工具</title><link>https://clibing.com/posts/java/java-btrace-greys-jvmsanbox/</link><pubDate>Mon, 06 Feb 2017 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/java-btrace-greys-jvmsanbox/</guid><description><![CDATA[<h3 id="java-动态跟踪工具介绍" data-numberify>Java 动态跟踪工具介绍<a class="anchor ms-1" href="#java-动态跟踪工具介绍"></a></h3>
<ul>
<li><a href="https://github.com/btraceio/btrace" target="_blank" rel="noopener noreferrer">BTrace<i class="fas fa-external-link-square-alt ms-1"></i></a></li>
<li><a href="https://github.com/oldmanpushcart/greys-anatomy" target="_blank" rel="noopener noreferrer">Greys-anatomy<i class="fas fa-external-link-square-alt ms-1"></i></a></li>
<li><a href="https://yq.aliyun.com/articles/2390" target="_blank" rel="noopener noreferrer">Greys介绍<i class="fas fa-external-link-square-alt ms-1"></i></a></li>
<li><a href="https://github.com/alibaba/jvm-sandbox" target="_blank" rel="noopener noreferrer">jvm-sandbox<i class="fas fa-external-link-square-alt ms-1"></i></a></li>
</ul>]]></description></item><item><title>Java内存之直接内存</title><link>https://clibing.com/posts/java/jdk/direct_buffer/</link><pubDate>Mon, 06 Feb 2017 14:38:56 +0800</pubDate><guid>https://clibing.com/posts/java/jdk/direct_buffer/</guid><description><![CDATA[<h3 id="一概念和特征" data-numberify>一、概念和特征<a class="anchor ms-1" href="#一概念和特征"></a></h3>
<ul>
<li>直接内存并非 JVMS 定义的标准 Java 运行时内存。</li>
<li>JDK1.4 加入了新的 NIO 机制，目的是防止 Java 堆 和 Native 堆之间往复的数据复制带来的性能损耗，此后 NIO 可以使用 Native 的方式直接在 Native 堆分配内存。</li>
<li>直接内存区域是全局共享的内存区域。</li>
<li>直接内存区域可以进行自动内存管理(GC)，但机制并不完善。</li>
<li>本机的 Native 堆(直接内存) 不受 JVM 堆内存大小限制。</li>
<li>可能出现 OutOfMemoryError 异常。</li>
</ul>

<h3 id="二异常演示" data-numberify>二、异常演示<a class="anchor ms-1" href="#二异常演示"></a></h3>
<p>测试代码：</p>]]></description></item></channel></rss>