<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_Phinecos(洞庭散人)</title><subtitle type="text">专注于开源技术的研究与应用</subtitle><id>http://feed.cnblogs.com/blog/u/18782/rss</id><updated>2012-02-10T08:36:57Z</updated><author><name>Phinecos(洞庭散人)</name><uri>http://www.cnblogs.com/phinecos/</uri></author><generator>CNBlogs BlogServer</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/phinecos/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/18782/rss"/><entry><id>http://www.cnblogs.com/phinecos/archive/2012/02/10/2345634.html</id><title type="text">深入剖析SolrCloud（一）</title><summary type="text">SolrCloud是基于Solr和Zookeeper的分布式搜索方案，是正在开发中的Solr4.0的核心组件之一，它的主要思想是使用Zookeeper作为集群的配置信息中心。它有几个特色功能：1）集中式的配置信息 2）自动容错 3）近实时搜索 4）查询时自动负载均衡</summary><published>2012-02-10T08:36:00Z</published><updated>2012-02-10T08:36:00Z</updated><author><name>Phinecos(洞庭散人)</name><uri>http://www.cnblogs.com/phinecos/</uri></author><link rel="alternate" href="http://www.cnblogs.com/phinecos/archive/2012/02/10/2345634.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/phinecos/archive/2012/02/10/2345634.html"/><content type="html">&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 10pt"&gt;&lt;a href="http://wiki.apache.org/solr/SolrCloud"&gt;&lt;span style="color: #075db3"&gt;SolrCloud&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;是基于&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 10pt"&gt;Solr&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;和&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 10pt"&gt;Zookeeper&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;的分布式搜索方案，是正在开发中的&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 10pt"&gt;Solr4.0&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;的核心组件之一，它的主要思想是使用&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 10pt"&gt;Zookeeper&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;作为集群的配置信息中心。它有几个特色功能：&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 10pt"&gt;1&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;）集中式的配置信息&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 10pt"&gt; 2&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;）自动容错&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 10pt"&gt; 3&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;）近实时搜索&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; color: black; font-size: 10pt"&gt; &lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt"&gt;）查询时自动负载均衡&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/phinecos/20120210/2shard4serverFull.jpg" width="800" height="633" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体"&gt;基本可以用上面这幅图来概述，这是一个拥有&lt;/span&gt;4&lt;span style="font-family: 宋体"&gt;个&lt;/span&gt;Solr&lt;span style="font-family: 宋体"&gt;节点的集群，索引分布在两个&lt;/span&gt;Shard&lt;span style="font-family: 宋体"&gt;里面，每个&lt;/span&gt;Shard&lt;span style="font-family: 宋体"&gt;包含两个&lt;/span&gt;Solr&lt;span style="font-family: 宋体"&gt;节点，一个是&lt;/span&gt;Leader&lt;span style="font-family: 宋体"&gt;节点，一个是&lt;/span&gt;Replica&lt;span style="font-family: 宋体"&gt;节点，此外集群中有一个负责维护集群状态信息的&lt;/span&gt;Overseer&lt;span style="font-family: 宋体"&gt;节点，它是一个总控制器。集群的所有状态信息都放在&lt;/span&gt;Zookeeper&lt;span style="font-family: 宋体"&gt;集群中统一维护。从图中还可以看到，任何一个节点都可以接收索引更新的请求，然后再将这个请求转发到文档所应该属于的那个&lt;/span&gt;Shard&lt;span style="font-family: 宋体"&gt;的&lt;/span&gt;Leader&lt;span style="font-family: 宋体"&gt;节点，&lt;/span&gt;Leader&lt;span style="font-family: 宋体"&gt;节点更新结束完成，最后将版本号和文档转发给同属于一个&lt;/span&gt;Shard&lt;span style="font-family: 宋体"&gt;的&lt;/span&gt;replicas&lt;span style="font-family: 宋体"&gt;节点。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体"&gt;下面我们来看一个简单的&lt;/span&gt;SolrCloud&lt;span style="font-family: 宋体"&gt;集群的配置过程。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体"&gt;首先去&lt;/span&gt;&lt;a href="https://builds.apache.org/job/Solr-trunk/lastSuccessfulBuild/artifact/artifacts/下载Solr4.0"&gt;https://builds.apache.org/job/Solr-trunk/lastSuccessfulBuild/artifact/artifacts/&lt;span style="font-family: 宋体"&gt;&lt;span&gt;下载&lt;/span&gt;Solr4.0&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;的源码和二进制包，注意&lt;/span&gt;Solr4.0&lt;span style="font-family: 宋体"&gt;现在还在开发中，因此这里是&lt;/span&gt;Nightly Build&lt;span style="font-family: 宋体"&gt;版本。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体"&gt;示例&lt;/span&gt;1&lt;span style="font-family: 宋体"&gt;，简单的包含&lt;/span&gt;2&lt;span style="font-family: 宋体"&gt;个&lt;/span&gt;Shard&lt;span style="font-family: 宋体"&gt;的集群&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/phinecos/20120210/2shard2server.jpg" width="275" height="120" /&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体"&gt;这个示例中，我们把一个&lt;/span&gt;collection&lt;span style="font-family: 宋体"&gt;的索引数据分布到两个&lt;/span&gt;shard&lt;span style="font-family: 宋体"&gt;上去，步骤如下：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体"&gt;为了弄&lt;/span&gt;2&lt;span style="font-family: 宋体"&gt;个&lt;/span&gt;solr&lt;span style="font-family: 宋体"&gt;服务器，我们拷贝一份&lt;/span&gt;example&lt;span style="font-family: 宋体"&gt;目录&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;cp&amp;nbsp;-r&amp;nbsp;example&amp;nbsp;example2&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;然后启动第一个&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Calibri"&gt;solr&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;服务器，并初始化一个新的&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Calibri"&gt;solr&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;集群，&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;cd&amp;nbsp;example&lt;br /&gt;java&amp;nbsp;-Dbootstrap_confdir=./solr/conf&amp;nbsp;-Dcollection.configName=myconf&amp;nbsp;-DzkRun&amp;nbsp;-DnumShards=2&amp;nbsp;-jar&amp;nbsp;start.jar&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;/span&gt;&lt;span style="font-family: Courier; color: black"&gt;-DzkRun&lt;/span&gt;&lt;span style="font-family: 宋体; color: black"&gt;参数是启动一个嵌入式的&lt;/span&gt;&lt;span style="font-family: Courier; color: black"&gt;Zookeeper&lt;/span&gt;&lt;span style="font-family: 宋体; color: black"&gt;服务器，它会作为&lt;/span&gt;&lt;span style="font-family: Courier; color: black"&gt;solr&lt;/span&gt;&lt;span style="font-family: 宋体; color: black"&gt;服务器的一部分，&lt;/span&gt;&lt;span style="font-family: Courier; color: black"&gt;-Dbootstrap_confdir&lt;/span&gt;&lt;span style="font-family: 宋体; color: black"&gt;参数是上传本地的配置文件上传到&lt;/span&gt;&lt;span style="font-family: Courier; color: black"&gt;zookeeper&lt;/span&gt;&lt;span style="font-family: 宋体; color: black"&gt;中去，作为整个集群共用的配置文件，&lt;/span&gt;&lt;span style="font-family: Courier; color: black"&gt;-DnumShards&lt;/span&gt;&lt;span style="font-family: 宋体; color: black"&gt;指定了集群的逻辑分组数目。&lt;/span&gt;&lt;span style="font-family: Courier; color: black"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体; color: black"&gt;然后启动第二个&lt;/span&gt;&lt;span style="font-family: Courier; color: black"&gt;solr&lt;/span&gt;&lt;span style="font-family: 宋体; color: black"&gt;服务器，并将其引向集群所在位置&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;cd&amp;nbsp;example2&lt;br /&gt;java&amp;nbsp;-Djetty.port=7574&amp;nbsp;-DzkHost=localhost:9983&amp;nbsp;-jar&amp;nbsp;start.jar&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;span &gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt" lang="EN-US"&gt;-DzkHost=localhost:9983&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"&gt;就是指明了&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt" lang="EN-US"&gt;Zookeeper&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt; mso-ascii-font-family: 'Courier New'; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: 'Courier New'; mso-bidi-font-family: 'Courier New'"&gt;集群所在位置&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Courier; color: black" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;span style="font-family: 宋体; color: black; mso-ascii-font-family: Courier; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Courier"&gt;我们可以打开&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 'Arial','sans-serif'; color: black" lang="EN-US"&gt;&lt;a href="http://localhost:8983/solr/collection1/admin/zookeeper.jsp"&gt;&lt;span style="border-bottom: windowtext 1pt; border-left: windowtext 1pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; color: #4477ff; border-top: windowtext 1pt; border-right: windowtext 1pt; text-decoration: none; padding-top: 0cm; text-underline: none; mso-border-alt: none windowtext 0cm"&gt;http://localhost:8983/solr/collection1/admin/zookeeper.jsp&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 'Arial','sans-serif'; color: black" lang="EN-US"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 宋体; color: black; mso-ascii-font-family: Arial; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"&gt;或者&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 'Arial','sans-serif'; color: black" lang="EN-US"&gt;&lt;a href="http://localhost:8983/solr/#/cloud"&gt;&lt;span style="border-bottom: windowtext 1pt; border-left: windowtext 1pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; color: #4477ff; border-top: windowtext 1pt; border-right: windowtext 1pt; text-decoration: none; padding-top: 0cm; text-underline: none; mso-border-alt: none windowtext 0cm"&gt;http://localhost:8983/solr/#/cloud&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 宋体; color: black; mso-ascii-font-family: Arial; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"&gt;看看目前集群的状态，&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 'Arial','sans-serif'; color: black" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;img style="width: 911px; height: 431px" border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/phinecos/20120210/2node.jpg" width="911" height="431" /&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;span style="font-family: 宋体; font-size: 10.5pt"&gt;现在，我们可以试试索引一些文档，&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;cd&amp;nbsp;exampledocs&lt;br /&gt;java&amp;nbsp;-Durl=http://localhost:8983/solr/collection1/update&amp;nbsp;-jar&amp;nbsp;post.jar&amp;nbsp;ipod_video.xml&lt;br /&gt;java&amp;nbsp;-Durl=http://localhost:8983/solr/collection1/update&amp;nbsp;-jar&amp;nbsp;post.jar&amp;nbsp;monitor.xml&lt;br /&gt;java&amp;nbsp;-Durl=http://localhost:8983/solr/collection1/update&amp;nbsp;-jar&amp;nbsp;post.jar&amp;nbsp;mem.xml&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;/span&gt;&lt;span style="font-family: 'Calibri','sans-serif'; font-size: 10.5pt"&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;最后，来试试分布式搜索吧&lt;/span&gt;&lt;span lang="EN-US"&gt;:&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;a href="http://localhost:8983/solr/collection1/select?q"&gt;http://localhost:8983/solr/collection1/select?q&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;Zookeeper&lt;span style="font-family: 宋体"&gt;维护的集群状态数据是存放在&lt;/span&gt;solr/zoo_data&lt;span style="font-family: 宋体"&gt;目录下的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体"&gt;现在我们来剖析下这样一个简单的集群构建的基本流程：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体"&gt;先从第一台&lt;/span&gt;solr&lt;span style="font-family: 宋体"&gt;服务器说起：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 39pt"&gt;&lt;span&gt;1)&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;它首先启动一个嵌入式的&lt;/span&gt;Zookeeper&lt;span style="font-family: 宋体"&gt;服务器，作为集群状态信息的管理者，&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;2&lt;span style="font-family: 宋体"&gt;）&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;将自己这个节点注册到&lt;/span&gt;/node_states/&lt;span style="font-family: 宋体"&gt;目录下&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;3&lt;span style="font-family: 宋体"&gt;）&lt;/span&gt; &lt;span style="font-family: 宋体"&gt;同时将自己注册到&lt;/span&gt;/live_nodes/&lt;span style="font-family: 宋体"&gt;目录下&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;4&lt;span style="font-family: 宋体"&gt;）创建&lt;/span&gt;/overseer_elect/leader&lt;span style="font-family: 宋体"&gt;，为后续&lt;/span&gt;Overseer&lt;span style="font-family: 宋体"&gt;节点的选举做准备，新建一个&lt;/span&gt;Overseer&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;5) &lt;span style="font-family: 宋体"&gt;更新&lt;/span&gt;/clusterstate.json&lt;span style="font-family: 宋体"&gt;目录下&lt;/span&gt;json&lt;span style="font-family: 宋体"&gt;格式的集群状态信息&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;6) &lt;span style="font-family: 宋体"&gt;本机从&lt;/span&gt;Zookeeper&lt;span style="font-family: 宋体"&gt;中更新集群状态信息，维持与&lt;/span&gt;Zookeeper&lt;span style="font-family: 宋体"&gt;上的集群信息一致&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;7&lt;span style="font-family: 宋体"&gt;）上传本地配置文件到&lt;/span&gt;Zookeeper&lt;span style="font-family: 宋体"&gt;中，供集群中其他&lt;/span&gt;solr&lt;span style="font-family: 宋体"&gt;节点使用&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;8) &lt;span style="font-family: 宋体"&gt;启动本地的&lt;/span&gt;Solr&lt;span style="font-family: 宋体"&gt;服务器，&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;9) Solr&lt;span style="font-family: 宋体"&gt;启动完成后，&lt;/span&gt;Overseer&lt;span style="font-family: 宋体"&gt;会得知&lt;/span&gt;shard&lt;span style="font-family: 宋体"&gt;中有第一个节点进来，更新&lt;/span&gt;shard&lt;span style="font-family: 宋体"&gt;状态信息，并将本机所在节点设置为&lt;/span&gt;shard1&lt;span style="font-family: 宋体"&gt;的&lt;/span&gt;leader&lt;span style="font-family: 宋体"&gt;节点，并向整个集群发布最新的集群状态信息。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;10&lt;span style="font-family: 宋体"&gt;）本机从&lt;/span&gt;Zookeeper&lt;span style="font-family: 宋体"&gt;中再次更新集群状态信息，第一台&lt;/span&gt;solr&lt;span style="font-family: 宋体"&gt;服务器启动完毕。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体"&gt;然后来看第二台&lt;/span&gt;solr&lt;span style="font-family: 宋体"&gt;服务器的启动过程：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 39pt"&gt;&lt;span&gt;1）&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;本机连接到集群所在的&lt;/span&gt;Zookeeper&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 39pt"&gt;&lt;span&gt;2）&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;将自己这个节点注册到&lt;/span&gt;/node_states/&lt;span style="font-family: 宋体"&gt;目录下&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 39pt"&gt;&lt;span&gt;3）&amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;span style="font-family: 宋体"&gt;同时将自己注册到&lt;/span&gt;/live_nodes/&lt;span style="font-family: 宋体"&gt;目录下&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 39pt"&gt;&lt;span&gt;4）&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;本机从&lt;/span&gt;Zookeeper&lt;span style="font-family: 宋体"&gt;中更新集群状态信息，维持与&lt;/span&gt;Zookeeper&lt;span style="font-family: 宋体"&gt;上的集群信息一致&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 39pt"&gt;&lt;span&gt;5）&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;从集群中保存的配置文件加载&lt;/span&gt;Solr&lt;span style="font-family: 宋体"&gt;所需要的配置信息&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 39pt"&gt;&lt;span&gt;6）&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;启动本地&lt;/span&gt;solr&lt;span style="font-family: 宋体"&gt;服务器，&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 39pt"&gt;&lt;span&gt;7）&amp;nbsp;&lt;/span&gt;solr&lt;span style="font-family: 宋体"&gt;启动完成后，将本节点注册为集群中的&lt;/span&gt;shard&lt;span style="font-family: 宋体"&gt;，并将本机设置为&lt;/span&gt;shard2&lt;span style="font-family: 宋体"&gt;的&lt;/span&gt;Leader&lt;span style="font-family: 宋体"&gt;节点，&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin: 0cm 0cm 0pt 39pt"&gt;&lt;span&gt;8）&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;本机从&lt;/span&gt;Zookeeper&lt;span style="font-family: 宋体"&gt;中再次更新集群状态信息，第二台&lt;/span&gt;solr&lt;span style="font-family: 宋体"&gt;服务器启动完毕。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt"&gt;&lt;span style="font-family: 宋体"&gt;示例&lt;/span&gt;2&lt;span style="font-family: 宋体"&gt;，包含&lt;/span&gt;2&lt;span style="font-family: 宋体"&gt;个&lt;/span&gt;shard&lt;span style="font-family: 宋体"&gt;的集群，每个&lt;/span&gt;shard&lt;span style="font-family: 宋体"&gt;中有&lt;/span&gt;replica&lt;span style="font-family: 宋体"&gt;节点&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/phinecos/20120210/2shard4server.jpg" width="300" height="264" /&gt;&lt;/p&gt;&#xD;
&lt;p style="margin: 0cm 0cm 0pt 21pt" &gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;如图所示，集群包含&lt;/span&gt;&lt;span lang="EN-US"&gt;2&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;个&lt;/span&gt;&lt;span lang="EN-US"&gt;shard&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;，每个&lt;/span&gt;&lt;span lang="EN-US"&gt;shard&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;中有两个&lt;/span&gt;&lt;span lang="EN-US"&gt;solr&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;节点，一个是&lt;/span&gt;&lt;span lang="EN-US"&gt;leader&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;，一个是&lt;/span&gt;&lt;span lang="EN-US"&gt;replica&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin"&gt;节点，&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;cp&amp;nbsp;-r&amp;nbsp;example&amp;nbsp;exampleB&lt;br /&gt;cp&amp;nbsp;-r&amp;nbsp;example2&amp;nbsp;example2B&lt;br /&gt;cd&amp;nbsp;exampleB&lt;br /&gt;java&amp;nbsp;-Djetty.port=8900&amp;nbsp;-DzkHost=localhost:9983&amp;nbsp;-jar&amp;nbsp;start.jar&lt;br /&gt;cd&amp;nbsp;example2B&lt;br /&gt;java&amp;nbsp;-Djetty.port=7500&amp;nbsp;-DzkHost=localhost:9983&amp;nbsp;-jar&amp;nbsp;start.jar&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;span style="font-family: 宋体; color: black; mso-ascii-font-family: Courier; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Courier"&gt;我们可以打开&lt;/span&gt;&lt;span &gt;&lt;span style="border-bottom: windowtext 1pt; border-left: windowtext 1pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; font-family: 'Arial','sans-serif'; color: black; border-top: windowtext 1pt; border-right: windowtext 1pt; padding-top: 0cm; mso-border-alt: none windowtext 0cm" lang="EN-US"&gt;&lt;a href="http://localhost:8983/solr/collection1/admin/zookeeper.jsp"&gt;http://localhost:8983/solr/collection1/admin/zookeeper.jsp&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 'Arial','sans-serif'; color: black" lang="EN-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 'Arial','sans-serif'; color: black" lang="EN-US"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 宋体; color: black; mso-ascii-font-family: Arial; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"&gt;看看包含&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 'Arial','sans-serif'; color: black" lang="EN-US"&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 宋体; color: black; mso-ascii-font-family: Arial; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"&gt;个节点的集群的状态，&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 'Arial','sans-serif'; color: black" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;span style="font-family: 'Calibri','sans-serif'; font-size: 10.5pt"&gt;&lt;span lang="EN-US"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;img style="width: 899px; height: 495px" border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/phinecos/20120210/4node.jpg" width="899" height="495" /&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21pt"&gt;&lt;span style="font-family: 宋体"&gt;这个集群现在就具备容错性了，你可以试着干掉一个&lt;/span&gt;Solr&lt;span style="font-family: 宋体"&gt;服务器，然后再发送查询请求。背后的实质是集群的&lt;/span&gt;ov erseer&lt;span style="font-family: 宋体"&gt;会监测各个&lt;/span&gt;shard&lt;span style="font-family: 宋体"&gt;的&lt;/span&gt;leader&lt;span style="font-family: 宋体"&gt;节点，如果&lt;/span&gt;leader&lt;span style="font-family: 宋体"&gt;节点挂了，则会启动自动的容错机制，会从同一个&lt;/span&gt;shard&lt;span style="font-family: 宋体"&gt;中的其他&lt;/span&gt;replica&lt;span style="font-family: 宋体"&gt;节点集中重新选举出一个&lt;/span&gt;leader&lt;span style="font-family: 宋体"&gt;节点，甚至如果&lt;/span&gt;overseer&lt;span style="font-family: 宋体"&gt;节点自己也挂了，同样会自动在其他节点上启用新的&lt;/span&gt;overseer&lt;span style="font-family: 宋体"&gt;节点，这样就确保了集群的高可用性。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21pt"&gt;&lt;span style="font-family: 宋体"&gt;示例&lt;/span&gt;3 &lt;span style="font-family: 宋体"&gt;包含&lt;/span&gt;2&lt;span style="font-family: 宋体"&gt;个&lt;/span&gt;shard&lt;span style="font-family: 宋体"&gt;的集群，带&lt;/span&gt;shard&lt;span style="font-family: 宋体"&gt;备份和&lt;/span&gt;zookeeper&lt;span style="font-family: 宋体"&gt;集群机制&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/phinecos/20120210/2shard4server2.jpg" width="300" height="246" /&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21pt"&gt;&lt;span style="font-family: 宋体"&gt;上一个示例中存在的问题是：尽管&lt;/span&gt;solr&lt;span style="font-family: 宋体"&gt;服务器可以容忍挂掉，但集群中只有一个&lt;/span&gt;zookeeper&lt;span style="font-family: 宋体"&gt;服务器来维护集群的状态信息，单点的存在即是不稳定的根源。如果这个&lt;/span&gt;zookeeper&lt;span style="font-family: 宋体"&gt;服务器挂了，那么分布式查询还是可以工作的，因为每个&lt;/span&gt;solr&lt;span style="font-family: 宋体"&gt;服务器都会在内存中维护最近一次由&lt;/span&gt;zookeeper&lt;span style="font-family: 宋体"&gt;维护的集群状态信息，但新的节点无法加入集群，集群的状态变化也不可知了。因此，为了解决这个问题，需要对&lt;/span&gt;Zookeeper&lt;span style="font-family: 宋体"&gt;服务器也设置一个集群，让其也具备高可用性和容错性。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt 21pt"&gt;&lt;span style="font-family: 宋体"&gt;有两种方式可选，一种是提供一个外部独立的&lt;/span&gt;Zookeeper&lt;span style="font-family: 宋体"&gt;集群，另一种是每个&lt;/span&gt;solr&lt;span style="font-family: 宋体"&gt;服务器都启动一个内嵌的&lt;/span&gt;Zookeeper&lt;span style="font-family: 宋体"&gt;服务器，再将这些&lt;/span&gt;Zookeeper&lt;span style="font-family: 宋体"&gt;服务器组成一个集群。&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;我们这里用后一种做示例：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;cd&amp;nbsp;example&lt;br /&gt;java&amp;nbsp;-Dbootstrap_confdir=./solr/conf&amp;nbsp;-Dcollection.configName=myconf&amp;nbsp;-DzkRun&amp;nbsp;-DzkHost=localhost:9983,localhost:8574,localhost:9900&amp;nbsp;-DnumShards=2&amp;nbsp;-jar&amp;nbsp;start.jar&lt;br /&gt;cd&amp;nbsp;example2&lt;br /&gt;java&amp;nbsp;-Djetty.port=7574&amp;nbsp;-DzkRun&amp;nbsp;-DzkHost=localhost:9983,localhost:8574,localhost:9900&amp;nbsp;-jar&amp;nbsp;start.jar&lt;br /&gt;cd&amp;nbsp;exampleB&lt;br /&gt;java&amp;nbsp;-Djetty.port=8900&amp;nbsp;-DzkRun&amp;nbsp;-DzkHost=localhost:9983,localhost:8574,localhost:9900&amp;nbsp;-jar&amp;nbsp;start.jar&lt;br /&gt;cd&amp;nbsp;example2B&lt;br /&gt;java&amp;nbsp;-Djetty.port=7500&amp;nbsp;-DzkHost=localhost:9983,localhost:8574,localhost:9900&amp;nbsp;-jar&amp;nbsp;start.jar&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;span style="font-family: 宋体; color: black; mso-ascii-font-family: Courier; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Courier"&gt;我们可以打开&lt;/span&gt;&lt;span &gt;&lt;span style="border-bottom: windowtext 1pt; border-left: windowtext 1pt; padding-bottom: 0cm; padding-left: 0cm; padding-right: 0cm; font-family: 'Arial','sans-serif'; color: black; border-top: windowtext 1pt; border-right: windowtext 1pt; padding-top: 0cm; mso-border-alt: none windowtext 0cm" lang="EN-US"&gt;&lt;a href="http://localhost:8983/solr/collection1/admin/zookeeper.jsp"&gt;http://localhost:8983/solr/collection1/admin/zookeeper.jsp&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 'Arial','sans-serif'; color: black" lang="EN-US"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 'Arial','sans-serif'; color: black" lang="EN-US"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 宋体; color: black; mso-ascii-font-family: Arial; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"&gt;看看包含&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 'Arial','sans-serif'; color: black" lang="EN-US"&gt;4&lt;/span&gt;&lt;/span&gt;&lt;span &gt;&lt;span style="font-family: 宋体; color: black; mso-ascii-font-family: Arial; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial"&gt;个节点的集群的状态，可以发现其实和上一个没有任何区别。&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Arial','sans-serif'; color: black" lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体; color: black"&gt;后续的文章将从实现层面对&lt;/span&gt;&lt;span style="font-family: 'Arial','sans-serif'; color: black"&gt;SolrCloud&lt;/span&gt;&lt;span style="font-family: 宋体; color: black"&gt;这个分布式搜索解决方案进行进一步的深入剖析。&lt;/span&gt;&lt;span style="font-family: 'Arial','sans-serif'; color: black"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/phinecos/aggbug/2345634.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/phinecos/archive/2012/02/10/2345634.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/phinecos/archive/2012/01/10/2318514.html</id><title type="text">技术宅---我的网上抢火车票攻略（终极秒杀版）</title><summary type="text">前几天在我在博客上发了一篇《技术宅---我的网上抢火车票攻略》，短短4天内点击量达到8000多，可见火车票是近期最为火热的话题了。这几天又帮很多朋友代购火车票，不断总结经验教训，最后得到了一个完整的全自动刷票方案。 准备工作： 1)一键自动刷票软件Go-Home下载地址：http://code.google.com/p/go-home/，这个软件有多牛逼，看看下面的项目简介就知道了。。。 2)Firefox浏览器或者Chrome浏览器 3) 12306自动登陆脚本https://gist.github.com/raw/1570973/f200dd587f6d68ab81edf7...</summary><published>2012-01-10T12:38:00Z</published><updated>2012-01-10T12:38:00Z</updated><author><name>Phinecos(洞庭散人)</name><uri>http://www.cnblogs.com/phinecos/</uri></author><link rel="alternate" href="http://www.cnblogs.com/phinecos/archive/2012/01/10/2318514.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/phinecos/archive/2012/01/10/2318514.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-family:宋体;"&gt;前几天在我在博客上发了一篇&lt;span&gt;《&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.cnblogs.com/phinecos/archive/2012/01/06/2315192.html"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:宋体;"&gt;技术宅---&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:宋体;"&gt;我的网上抢火车票攻略&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:宋体;"&gt;》&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-family:宋体;"&gt;，短短4&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-family:宋体;"&gt;天内点击量达到8000&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-family:宋体;"&gt;多，可见火车票是近期最为火热的话题了。这几天又帮很多朋友代购火车票，不断总结经验教训，最后得到了一个完整的全自动刷票方案。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family: 宋体;"&gt;准备工作：&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="margin-left:21.0pt"&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;1)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:宋体;"&gt;一键自动刷票软件Go-Home&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-size: 13px; line-height: 19px; "&gt;&lt;span style="font-family: 宋体"&gt;下载地址：&lt;/span&gt;&lt;a style="background-color: transparent; color: #336699; text-decoration: none; background-clip: initial; background-origin: initial" href="http://code.google.com/p/go-home/" target="_blank"&gt;http://code.google.com/p/go-home/&lt;/a&gt;&amp;nbsp;，这个软件有多牛逼，看看下面的项目简介就知道了。。。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/2012011002.jpg" width="663" height="516" alt="" /&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;/p&gt; &lt;p style="line-height: 19px; text-indent: 0px; margin: 5px auto; font-size: 13px"&gt;2)&amp;nbsp;Firefox&lt;span style="font-family: 宋体"&gt;浏览器或者&lt;/span&gt;Chrome&lt;span style="font-family: 宋体"&gt;浏览器&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: 19px; text-indent: 0px; margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; "&gt;&lt;span style="font-family: Calibri, sans-serif; font-size: 10.5pt; "&gt;3) &amp;nbsp;  12306&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10.5pt; "&gt;自动登陆脚本&lt;/span&gt;&lt;span style="color: #494949; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;span  style="font-family: Calibri, sans-serif; line-height: 19px; "&gt;&lt;a style="widows: 2; background-color: transparent; orphans: 2; color: #336699; word-spacing: 0px; text-decoration: none; -webkit-text-size-adjust: auto; background-clip: initial; -webkit-text-stroke-width: 0px; background-origin: initial" href="https://gist.github.com/raw/1570973/f200dd587f6d68ab81edf74436b1fb7d91c79973/12306AutoLogin.user.js" target="_blank"&gt;https://gist.github.com/raw/1570973/f200dd587f6d68ab81edf74436b1fb7d91c79973/12306AutoLogin.user.js&lt;/a&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/201201080002346892.jpg" width="244" height="143" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-size: 13px; line-height: 19px; font-family: Simsun; "&gt;4&lt;span&gt;&lt;span&gt;)&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;12306&lt;span style="font-family: 宋体"&gt;自动查询脚本，&lt;/span&gt;&lt;span style="font-family: Verdana, sans-serif; color: black; font-size: 10pt"&gt;&lt;span style="color: #336699"&gt;&lt;a href="https://gist.github.com/raw/1554666/dec45c925002ec23ccef9f5be14770572d27625c/12306.user.js" target="_blank"&gt;https://gist.github.com/raw/1554666/dec45c925002ec23ccef9f5be14770572d27625c/12306.user.js&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;span style="font-size: 10.5pt; "&gt;&lt;span style="line-height: 19px; font-size: 13px; font: normal normal normal medium/normal Simsun; "&gt; &lt;p style="line-height: 19px; text-indent: 0px; margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; font-size: 13px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; "&gt;&lt;span style="font-family: 宋体"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 关于这两个脚本如何使用，请参见《&lt;/span&gt;&lt;a style="background-color: transparent; color: #336699; text-decoration: none; background-clip: initial; background-origin: initial" href="http://www.cnblogs.com/phinecos/archive/2012/01/06/2315192.html" target="_blank"&gt;&lt;span style="font-family: 宋体"&gt;技术宅---&lt;span style="font-family: 宋体"&gt;我的网上抢火车票攻略&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: 宋体"&gt;》的后半部分，&lt;/span&gt;&lt;/p&gt; &lt;div&gt; &lt;p style="line-height: 19px; text-indent: 0px; margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; font-size: 13px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; "&gt;&lt;span&gt;5)&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;招商银行信用卡或一卡通&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: 19px; text-indent: 0px; margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; font-size: 13px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; "&gt;&lt;span&gt;6)&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;UCWeb&lt;span style="font-family: 宋体"&gt;手机浏览器&lt;/span&gt;&lt;/p&gt; &lt;div&gt; &lt;p style="line-height: 19px; text-indent: 0px; margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; font-size: 13px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; "&gt;&lt;span style="font-family: 宋体"&gt;下面我们开始从头至尾进行一次快速 而完整的刷票之旅&lt;/span&gt;&lt;/p&gt; &lt;p style="line-height: 19px; text-indent: 0px; margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; font-size: 13px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; "&gt;&lt;span style="font-family: 宋体"&gt;第一步，使用一键刷票的&lt;/span&gt;Go-Home&lt;span style="font-family: 宋体"&gt;进行全自动刷票，它会自动识别验证码，自动登陆，自动查询车票信息，自动选择最优车次及席别，自动订票，如果你时间充裕，建议改成非自动模式，采用人工输入验证码相结合的方式进行刷票。这一步是至关重要的一步，同时也是最拼人品的一步，因为大家都知道，登陆和提交订单有多么困难。&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; "&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/2012011001.jpg" width="440" height="374" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; "&gt;&lt;span  style="font-size: 13px; line-height: 19px; font-family: Simsun; "&gt;&lt;span style="font-family: 宋体"&gt;第二步，如果你运气够好，在第一步中顺利地提交订单成功了，那么现在你要做的就是在&lt;/span&gt;45&lt;span style="font-family: 宋体"&gt;分钟内完成支付。这里我采用上面提到的&lt;/span&gt;12306&lt;span style="font-family: 宋体"&gt;自动登陆脚本，在&lt;/span&gt;Firefox&lt;span style="font-family: 宋体"&gt;和&lt;/span&gt;Chrome&lt;span style="font-family: 宋体"&gt;中打开登陆页面，通过&lt;/span&gt;Ajax&lt;span style="font-family: 宋体"&gt;请求的方式可以避免刷新验证码图片的问题，从而可以用同一个验证码无限次尝试登陆，直至登陆成功。&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;p style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; "&gt;&lt;/p&gt;  &lt;p style="line-height: 19px; text-indent: 0px; margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; font-size: 13px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; "&gt;&lt;/p&gt; &lt;p style="line-height: 19px; text-indent: 0px; margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; font-size: 13px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; "&gt;&lt;span style="font-family: 宋体"&gt;第三步，如果你人品继续足够好，侥幸在&lt;/span&gt;firefox&lt;span style="font-family: 宋体"&gt;或&lt;/span&gt;Chrome&lt;span style="font-family: 宋体"&gt;中登陆进系统了，那么恭喜你，赶紧进去最后一步支付吧。非&lt;/span&gt;IE&lt;span style="font-family: 宋体"&gt;用户无法使用网银，这个问题一直让人头痛，不过如果你有招商银行的信用卡或者一卡通，那么恭喜了，你可以无视这个问题了。当你选择使用招商银行进行支付时，非&lt;/span&gt;IE&lt;span style="font-family: 宋体"&gt;浏览器会打开手机支付的页面，输入你的卡号和手机号，它会将一个支付链接发到你的手机上，在手机上通过&lt;/span&gt;UCWeb&lt;span style="font-family: 宋体"&gt;浏览器打开这个链接，继续输入剩下的信息，就可以顺利完成支付了。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/2012010702.jpg" width="730" height="381" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; "&gt;&lt;span style="font-family: 宋体"&gt;第四步，如果上帝继续眷顾你，让你顺利完成了支付，没有&amp;#8220;支付超时&amp;#8220;，没有&amp;#8220;吞钱不吐票&lt;/span&gt;&lt;/span&gt;&lt;span  style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; "&gt;&amp;#8221;&lt;/span&gt;&lt;span  style="font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; font-size: 13px; line-height: 19px; "&gt;&lt;span style="font-family: 宋体"&gt;，那么这下真的要恭喜你了，你成功了！！！&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;div&gt;&lt;div style="font-size: 14px" id="blogDetailDiv"&gt; &lt;div&gt; &lt;div&gt;&lt;span style="line-height: 19px; font-size: 13px; font: normal normal normal medium/normal Simsun; "&gt;&lt;span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: normal normal normal medium/normal Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-stroke-width: 0px; "&gt;&lt;span style="line-height: 19px; font-size: 13px; "&gt;&lt;span style="widows: 2; text-transform: none; text-indent: 0px; border-collapse: separate; font: normal normal normal medium/normal Simsun; white-space: normal; orphans: 2; letter-spacing: normal; color: #000000; word-spacing: 0px; -webkit-text-size-adjust: auto; -webkit-border-horizontal-spacing: 0px; -webkit-border-vertical-spacing: 0px; -webkit-text-decorations-in-effect: none; -webkit-text-stroke-width: 0px; "&gt;&lt;span style="line-height: 19px; font-size: 13px; "&gt;  &lt;p style="line-height: 19px; text-indent: 0px; margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; font-size: 13px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; "&gt;&lt;/p&gt; &lt;p style="line-height: 19px; text-indent: 0px; margin-top: 5px; margin-right: auto; margin-bottom: 5px; margin-left: auto; font-size: 13px; font-family: Verdana, Geneva, Arial, Helvetica, sans-serif; "&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;  &amp;nbsp; Ok,&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;就总结到这里了，这应该算是目前最强大的终极火车票秒杀版本了，感谢互联网上众多无私奉献的人们，你们提供的工具，脚本，让我们能有机会买到回家的车票，却分文不取，这种精神让人敬佩，而我这几篇文章就是向诸位致敬！！！&lt;/span&gt;&lt;/p&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/phinecos/aggbug/2318514.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/phinecos/archive/2012/01/10/2318514.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/phinecos/archive/2012/01/06/2315192.html</id><title type="text">技术宅---我的网上抢火车票攻略</title><summary type="text">写在前面写这篇文章的起因是今天在12306上买火车票时，被这牛逼的网站给震撼到了，靠，牛叉得让人无语的用户体验啊。就讲讲我是如何利用一个小工具做辅助，幸运地抢到了回家的卧铺票的。希望能给有需要的兄弟们做个参考。 回顾下我今天网上购票的全过程，总结起来有四个难关，第一是登陆，第二是预定，第三是提交订单，第四是支付。本文的目的主要是为了在第一和第二关提供一些帮助。准备工作：1，firefox浏览器2，油猴脚本扩展GreaseMonkey（有园友反映这里看不懂啥意思，好吧，特别补充一段。GreaseMonkey是一个firefox扩展，当然，别再问我啥是扩展了，请自行google，简单说，就是装了这</summary><published>2012-01-06T13:49:00Z</published><updated>2012-01-06T13:49:00Z</updated><author><name>Phinecos(洞庭散人)</name><uri>http://www.cnblogs.com/phinecos/</uri></author><link rel="alternate" href="http://www.cnblogs.com/phinecos/archive/2012/01/06/2315192.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/phinecos/archive/2012/01/06/2315192.html"/><content type="html">&lt;p&gt;&lt;span style="font-family: 宋体"&gt;写在前面&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;写这篇文章的起因是今天在&lt;/span&gt;12306&lt;span style="font-family: 宋体"&gt;上买火车票时，被这牛逼的网站给震撼到了，靠，牛叉得让人无语的用户体验啊。就讲讲我是如何利用一个小工具做辅助，幸运地抢到了回家的卧铺票的。希望能给有需要的兄弟们做个参考。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体" &gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;回顾下我今天网上购票的全过程，总结起来有四个难关，第一是登陆，第二是预定，第三是提交订单，第四是支付。本文的目的主要是为了在第一和第二关提供一些帮助。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;准备工作：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;1&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;firefox&lt;span style="font-family: 宋体"&gt;浏览器&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;2&lt;span style="font-family: 宋体"&gt;，油猴脚本扩展&lt;/span&gt;GreaseMonkey&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;（有园友反映这里看不懂啥意思，好吧，特别补充一段。&lt;/span&gt;GreaseMonkey&lt;span style="font-family: 宋体"&gt;是一个&lt;/span&gt;firefox&lt;span style="font-family: 宋体"&gt;扩展，当然，别再问我啥是扩展了，请自行&lt;/span&gt;google&lt;span style="font-family: 宋体"&gt;，简单说，就是装了这个扩展，就可以再它基础上跑一些&lt;/span&gt;js&lt;span style="font-family: 宋体"&gt;脚本，对页面做一些修改什么的。。。，）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;先去这个页面下载扩展，&lt;/span&gt;&lt;a href="https://addons.mozilla.org/zh-cn/firefox/addon/greasemonkey/"&gt;https://addons.mozilla.org/zh-cn/firefox/addon/greasemonkey/&lt;/a&gt;&lt;span style="font-family: 宋体"&gt;，&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;下载到本地的是一个&lt;/span&gt;xpi&lt;span style="font-family: 宋体"&gt;文件，将其拖拽进&lt;/span&gt;firefox&lt;span style="font-family: 宋体"&gt;里面，就可以完成扩展的安装，重启&lt;/span&gt;firefox&lt;span style="font-family: 宋体"&gt;以后就生效，启用了&lt;/span&gt;GreaseMonkey&lt;/p&gt;&#xD;
&lt;p&gt;3&lt;span style="font-family: 宋体"&gt;，去这个页面安装&lt;/span&gt;12306 train ticket buyer&lt;span style="font-family: 宋体"&gt;脚本，&lt;/span&gt;&lt;a href="http://userscripts.org/scripts/show/122334"&gt;http://userscripts.org/scripts/show/122334&lt;/a&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;（完成第二步以后，就可以直接在&lt;/span&gt;firefox&lt;span style="font-family: 宋体"&gt;里打开上述链接，页面上会有一个&lt;/span&gt;&amp;#8221;Install&amp;#8221;&lt;span style="font-family: 宋体"&gt;按钮，单击后就完成了脚本在油猴里的安装了）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;下面我们就开始体验购票的整个流程吧。在&lt;/span&gt;firefox&lt;span style="font-family: 宋体"&gt;浏览器里安装好上面的油猴脚本后，首先打开登陆页面，&lt;/span&gt;&lt;a href="http://www.12306.cn/mormhweb/kyfw/"&gt;http://www.12306.cn/mormhweb/kyfw/&lt;/a&gt;&lt;span style="font-family: 宋体"&gt;，这时你就会发现页面上出现了下面这个设置区域&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/1.jpg" width="810" height="397" /&gt;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;如果你没看到，请记得去确认下&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Calibri"&gt;GreaseMonkey&lt;/font&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;扩展是否已经启用，就在地址栏最右边那个小猴子，记得点亮它，嘿嘿。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/5.jpg" width="154" height="52" /&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ok,&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;再来介绍下这个脚本的功能，它对我们闯第一，二关有一定的辅助功效，功能&lt;/span&gt;1&lt;span style="font-family: 宋体"&gt;：登录助手（自动填充用户名密码，验证码输入框自动获得焦点，无需碰鼠标即可输入验证码回车重复登录）；功能&lt;/span&gt;2&lt;span style="font-family: 宋体"&gt;：自动查询车票（根据用户事先配置的始发到站信息，自动查询）&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;先说说第一关&lt;/span&gt;---&lt;span style="font-family: 宋体"&gt;登陆，每天整点放票的时候，想登陆进去真是难如登天，每次都会弹出下面这个让人泪流满面的窗口，尼玛连个登陆进去的机会都不给啊。。。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/3.jpg" width="534" height="312" /&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体"&gt;更可恶的是，如果你用&lt;/span&gt;IE&lt;span style="font-family: 宋体"&gt;浏览器的话，密码会清空，鼠标焦点也没有选中在任何一个输入框，你不得不鼠标移到密码框，重输密码，再验证码，再鼠标单击&amp;#8220;登录&amp;#8220;，如果你用的是&lt;/span&gt;firefox&lt;span style="font-family: 宋体"&gt;呢，情况稍微好点，起码密码可以帮你保存，可还是上面的鼠标动作免不了。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;大家懂的，这时候，速度就是一切，差之毫厘，失之千里，省下那么一点点鼠标操作的时间，你就比别人多了几次登录的机会啊。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;这就是上面那个油猴脚本能帮到你的地方了，安装了以后，你会发现，登录时，你只需要使用键盘进行操作，就两个动作，输入验证码，回车，如果失败，再次回车干掉弹出框，此时鼠标焦点依旧在验证码那，继续输入验证码，回车，。。。。只要你键盘操作够快，此时的你绝对是正常登录操作的好几倍啊，有么有？哈哈&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Ok,&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;千辛万苦终于爬进系统里头来了，下一关&lt;/span&gt;&amp;#8212;&lt;span style="font-family: 宋体"&gt;就是预定，这个脚本在这里还是继续可以帮到你一点点的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;如果不用上面这个脚本的话，正常的操作流程是自己填写出发站点和到达站点，出发日期，点击&amp;#8220;重新查询&amp;#8220;按钮，完了你发现没票，囧了，又重新填一遍信息，再点，还是没票，又来一遍？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体"&gt;这时候上面的油猴脚本就可以帮我们做这种无聊的重填信息动作了，上面我们不是设置了出发站点和到达站点，出发日期嘛，这些信息就是脚本用来在车票查询的时候自动重填的，&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/6.jpg" width="998" height="238" /&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt; margin: 0cm 0cm 0pt" &gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体"&gt;你现在只管不断地点&amp;#8220;重新查询&amp;#8220;按钮，期待着宝贵的车票出现，然后你懂的，剩下的预定是否成功，订单是否提交成功，支付是否能完成，那就只有老天爷知道了。。，&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;当然，登陆不进，进去了又被踢下线，&lt;/span&gt;502 Bad Gateway&lt;span style="font-family: 宋体"&gt;，这些问题就无语了，没办法，只有不断的重试，重试，再重试，关键时刻还得拼人品，拼运气的。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;此外，网上有文章介绍如何用&lt;/span&gt;firebug&lt;span style="font-family: 宋体"&gt;修改&lt;/span&gt;html&lt;span style="font-family: 宋体"&gt;页面上的参数值，然后在提交页面来快速下订单的教程，见《&lt;/span&gt;&lt;a href="http://www.cnbeta.com/articles/168179.htm"&gt;&lt;span style="font-family: 宋体"&gt;&lt;span&gt;网友提供&lt;/span&gt;Firefox+&lt;span style="font-family: 宋体"&gt;扩展&lt;/span&gt; 15&lt;span style="font-family: 宋体"&gt;秒网上快速预定火车票教程&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family: 宋体"&gt;》，但我也试了，基本用处不大，能否提交订单成功，真的是只有上帝才知道，我基本都卡在这里，眼看着有票，可订单死活提交不上去。。。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;但起码这个脚本可以让我们节省出不少的时间，在这全民抢票的时代，时间就是机会，时间就是金钱啊，心动了么？赶紧照着我这个教程试试吧。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:宋体;"&gt;&amp;nbsp; &amp;nbsp; 最后，再推荐一个&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Chromium&lt;/span&gt;&lt;span style="font-family:宋体;"&gt;下的脚本，我使用的是&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Chromium 16&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;p&gt;1,&lt;span style="font-family:宋体;"&gt;首先在&lt;/span&gt;&lt;span style="font-size: 10.0pt;font-family:&amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Chromium&lt;/span&gt;&lt;span style="font-size: 10.0pt;font-family:宋体;"&gt;中打开下述链接，安装&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Arial&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;12306 auto query&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;脚本。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="https://gist.github.com/raw/1554666/dec45c925002ec23ccef9f5be14770572d27625c/12306.user.js"&gt;https://gist.github.com/raw/1554666/dec45c925002ec23ccef9f5be14770572d27625c/12306.user.js&lt;/a&gt;&lt;/p&gt;  &lt;/div&gt;&lt;p&gt;2&lt;span style="font-family:宋体;"&gt;，登陆到&lt;/span&gt;12306&lt;span style="font-family:宋体;"&gt;，选择&amp;#8220;车票预订&amp;#8221;，填写好信息后进行一次查询后，就会看到下面的画面。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/2012010701.jpg" alt="" /&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:宋体;"&gt;程序是会自动查询，当有票时会会高亮有票的车次。在查询期间你可以做其他事情，但要保持标签页开启（是否是当前标签页无所谓）。注意：&lt;/span&gt;1) &lt;span style="font-family:宋体;"&gt;只在&lt;/span&gt; Chromium &lt;span style="font-family:宋体;"&gt;上调试过。&lt;/span&gt;2) &lt;span style="font-family:宋体;"&gt;不支持自动订票&lt;/span&gt;,&lt;span style="font-family:宋体;"&gt;有票后请手工操作。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;这个脚本最有用的地方在哪里呢？有时候你查询车票的时候，会显示一张票都没有了，但是请不要绝望，因为还是有一点点希望的。因为有人会退票，或者是有些人会因为支付失败，超时等原因，系统会把票重新收回，这时候这个脚本就给力了，你可以比别人快一步看到这些珍稀资源，当你看到那红色高亮的&amp;#8220;一条杠&amp;#8221;的时候，该怎么做，你懂的。。。。&amp;nbsp;&lt;/p&gt;&lt;p&gt;另外，再附带吐槽一下，这系统里的硬座票和无座票是统一归在&amp;#8220;硬座票&amp;#8221;里的，因此，当你看到页面上显示硬座还有票的时候，请别高兴得太早，很可能你支付完成后就发现，你拿到手的居然是&amp;#8220;无座票&amp;#8221;，这坑爹的玩意。。。，&lt;/p&gt;&lt;p&gt;还有就是，一定要同时使用多个浏览器，甭管什么IE啊，Firefox啊，Chrome啊,总之能整上的都给它整上。。。&lt;span  style="font-family: 宋体; line-height: 19px; "&gt;在每个浏览器上都去登陆，上去了之后，就是一个字---刷，甚至你还可以制定相应的策略，分车次，分站点来刷，总而言之，就是拼命刷之,别让12306后台系统那帮龟孙子闲着。。。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:宋体;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; 最后，可能有人会问那最后一步支付咋办呢？难不成要重新换&lt;/span&gt;IE&lt;span style="font-family:宋体;"&gt;登陆上了，在限时的&lt;/span&gt;45&lt;span style="font-family:宋体;"&gt;分钟内去用网银来完成支付么？很可能是一去不复返了。。。其实，在&lt;/span&gt;firefox和chrome&lt;span style="font-family:宋体;"&gt;下也是可以完成支付的，如果你有招商银行，那么支付时就可以使用手机支付来搞定的。只要是非&lt;/span&gt;IE&lt;span style="font-family:宋体;"&gt;浏览器登录时，默认会定位到手机支付页面&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/2012010702.jpg" width="730" height="381" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&#xD;
&lt;p style="text-indent: 21pt"&gt;&lt;span style="font-family: 宋体"&gt;哈哈，反正我今天是坚持不懈的斗争&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;，终于抢到了一张回家的卧铺票，一点小经验，不敢独享，拿出来给大家分享，咱技术宅买个票就得像打仗一样，仔细研究对手，做好一切能做的准备，打持久战，不是么？&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/phinecos/aggbug/2315192.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/phinecos/archive/2012/01/06/2315192.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/phinecos/archive/2011/12/29/2306775.html</id><title type="text">一次针对批量查询处理的优化</title><summary type="text">客户调用批量查询接口对Solr核进行查询时觉得查询响应时间有些慢，接口的内部实现目前是顺序执行每个查询，再把结果汇总起来返回给调用方。因此，考虑引入线程池对查询接口的内部实现进行重构优化。先声明一个大小可随之增长的线程池，privateExecutorServiceexecutor=Executors.newCachedThreadPool();//查询请求处理线程池 然后是主线程方法的代码：publicList&amp;lt;Map&amp;lt;String,String&amp;gt;&amp;gt;queryEntityList(StringentityCode,List&amp;lt;Long&amp;gt;idList)thro</summary><published>2011-12-29T15:10:00Z</published><updated>2011-12-29T15:10:00Z</updated><author><name>Phinecos(洞庭散人)</name><uri>http://www.cnblogs.com/phinecos/</uri></author><link rel="alternate" href="http://www.cnblogs.com/phinecos/archive/2011/12/29/2306775.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/phinecos/archive/2011/12/29/2306775.html"/><content type="html">&lt;div&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 宋体"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 客户调用批量查询接口对&lt;/span&gt;Solr&lt;span style="font-family: 宋体"&gt;核进行查询时觉得查询响应时间有些慢，接口的内部实现目前是顺序执行每个查询，再把结果汇总起来返回给调用方。因此，考虑引入线程池对查询接口的内部实现进行重构优化。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;先声明一个大小可随之增长的线程池，&lt;/span&gt;&lt;span style="font-family: 宋体"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;ExecutorService&amp;nbsp;executor&amp;nbsp;=&amp;nbsp;Executors.newCachedThreadPool();&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;查询请求处理线程池&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="line-height: 19px; font-family: 'Courier New'; font-size: 13px" &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;然后是主线程方法的代码：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="line-height: 19px; font-family: 'Courier New'; font-size: 13px" &gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;List&amp;lt;Map&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;gt;&amp;nbsp;queryEntityList(String&amp;nbsp;entityCode,&amp;nbsp;List&amp;lt;Long&amp;gt;&amp;nbsp;idList)&amp;nbsp;&lt;span style="color: #0000ff"&gt;throws&lt;/span&gt;&amp;nbsp;ServiceException&amp;nbsp;{&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;Map&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;gt;&amp;nbsp;finalResult&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(idList&amp;nbsp;==&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&amp;nbsp;||&amp;nbsp;idList.size()&amp;nbsp;==&amp;nbsp;0&amp;nbsp;||&amp;nbsp;StringUtil.isBlank(entityCode))&amp;nbsp;{&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;参数合法性校验&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;finalResult;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;finalResult&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;ArrayList&amp;lt;Map&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;List&amp;lt;Future&amp;lt;Map&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;gt;&amp;gt;&amp;nbsp;futureList&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;ArrayList&amp;lt;Future&amp;lt;Map&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;gt;&amp;gt;();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;threadNum&amp;nbsp;=&amp;nbsp;idList.size();&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;查询子线程数目&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;threadNum;&amp;nbsp;i++)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Long&amp;nbsp;itemId&amp;nbsp;=&amp;nbsp;idList.get(i);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Future&amp;lt;Map&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;gt;&amp;nbsp;future&amp;nbsp;=&amp;nbsp;executor.submit(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;QueryCallable&amp;nbsp;(entityCode,&amp;nbsp;itemId));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;futureList.add(future);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;(Future&amp;lt;Map&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;gt;&amp;nbsp;future&amp;nbsp;:&amp;nbsp;futureList)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;nbsp;threadResult&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;threadResult&amp;nbsp;=&amp;nbsp;future.get();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;e)&amp;nbsp;{&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;threadResult&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&amp;nbsp;!=&amp;nbsp;threadResult&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;threadResult.size()&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;结果集不为空&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;finalResult.add(threadResult);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;finalResult;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span style="font-family: 宋体; mso-ascii-font-family: Calibri; mso-ascii-theme-font: minor-latin; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Calibri; mso-hansi-theme-font: minor-latin"&gt;&lt;font face="Verdana"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;最后是具体负责处理每个查询请求的&lt;/span&gt;&lt;span lang="EN-US"&gt;&lt;font face="Calibri"&gt;Callable &lt;/font&gt;&lt;/span&gt;&lt;/div&gt;&lt;font face="Calibri"&gt;&#xD;
&lt;/font&gt;&lt;div&gt;&lt;font face="Calibri"&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;class&lt;/span&gt;&amp;nbsp;QueryCallable&amp;nbsp;&lt;span style="color: #0000ff"&gt;implements&lt;/span&gt;&amp;nbsp;Callable&amp;lt;Map&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;String&amp;nbsp;entityCode&amp;nbsp;=&amp;nbsp;"";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;Long&amp;nbsp;itemId&amp;nbsp;=&amp;nbsp;0L;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;GetEntityListCallable(String&amp;nbsp;entityCode,&amp;nbsp;Long&amp;nbsp;itemId)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.&amp;nbsp;entityCode&amp;nbsp;=&amp;nbsp;entityCode;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.itemId&amp;nbsp;=&amp;nbsp;itemId;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;public&lt;/span&gt;&amp;nbsp;Map&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;nbsp;call()&amp;nbsp;&lt;span style="color: #0000ff"&gt;throws&lt;/span&gt;&amp;nbsp;Exception&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Map&amp;lt;String,&amp;nbsp;String&amp;gt;&amp;nbsp;entityMap&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entityMap&amp;nbsp;=&amp;nbsp;QueryServiceImpl.&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.getEntity(entityCode,&amp;nbsp;itemId);&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;先去hbase查基本信息&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;e)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;entityMap&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;return&lt;/span&gt;&amp;nbsp;entityMap;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;/font&gt;&lt;p style="margin: 0cm 0cm 0pt" &gt;&lt;font face="Calibri"&gt;&lt;/font&gt;&lt;/p&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体"&gt;通过线程池的使用，可以减少创建，销毁进程所带来的系统开销，而且线程池中的工作线程可以重复使用，极大地利用现有系统资源，增加了系统吞吐量。&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span  style="white-space:pre"&gt;	&lt;/span&gt;另外，今天也尝试了另一种合并Solr索引的方法，直接通过底层的Lucene的API进行，而不是提交Http请求，具体方法如下:&lt;/p&gt;&lt;p&gt;&lt;span  style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; "&gt;java&amp;nbsp;-cp&amp;nbsp;lucene-core-3.4.0.jar:lucene-misc-3.4.0.jar&amp;nbsp;org/apache/lucene/misc/IndexMergeTool&amp;nbsp;./newindex&amp;nbsp;./app1/solr/data/index&amp;nbsp;./app2/solr/data/index&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/phinecos/aggbug/2306775.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/phinecos/archive/2011/12/29/2306775.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/phinecos/archive/2011/11/17/2252494.html</id><title type="text">每日学习笔记(23)</title><summary type="text">1,从前端传过来的参数是&amp;quot;\u9676\u9676\u6D4B\u8BD5\u8D26\u53F701&amp;quot;这样的unicode编码，需要将其转换为中文字符串，发现java.util.Properties类中有一个loadConvert函数可以完成这件事，直接copy过来使用。publicstaticStringloadConvert(char[]in,intoff,intlen,char[]convtBuf){if(convtBuf.length&amp;lt;len){intnewLen=len*2;if(newLen&amp;lt;0){newLen=Integer.MAX_VALUE;</summary><published>2011-11-17T04:17:00Z</published><updated>2011-11-17T04:17:00Z</updated><author><name>Phinecos(洞庭散人)</name><uri>http://www.cnblogs.com/phinecos/</uri></author><link rel="alternate" href="http://www.cnblogs.com/phinecos/archive/2011/11/17/2252494.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/phinecos/archive/2011/11/17/2252494.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;1,&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;从前端传过来的参数是&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;"\u9676\u9676\u6D4B\u8BD5\u8D26\u53F701"&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;这样的&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;unicode&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;编码，需要将其转换为中文字符串，发现&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;java.util.Properties&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;类中有一个&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;loadConvert&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;函数可以完成这件事，直接&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;copy&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;过来使用。&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;String&amp;nbsp;loadConvert(&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;[]&amp;nbsp;in,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;off,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;len,&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;[]&amp;nbsp;convtBuf)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(convtBuf.length&amp;nbsp;&amp;lt;&amp;nbsp;len)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;newLen&amp;nbsp;=&amp;nbsp;len&amp;nbsp;*&amp;nbsp;2;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(newLen&amp;nbsp;&amp;lt;&amp;nbsp;0)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;newLen&amp;nbsp;=&amp;nbsp;Integer.MAX_VALUE;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;convtBuf&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;[newLen];&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;&amp;nbsp;aChar;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;[]&amp;nbsp;out&amp;nbsp;=&amp;nbsp;convtBuf;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;outLen&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;end&amp;nbsp;=&amp;nbsp;off&amp;nbsp;+&amp;nbsp;len;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&amp;nbsp;(off&amp;nbsp;&amp;lt;&amp;nbsp;end)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aChar&amp;nbsp;=&amp;nbsp;in[off++];&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(aChar&amp;nbsp;==&amp;nbsp;'\\')&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aChar&amp;nbsp;=&amp;nbsp;in[off++];&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(aChar&amp;nbsp;==&amp;nbsp;'u')&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;Read&amp;nbsp;the&amp;nbsp;xxxx&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;value&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;4;&amp;nbsp;i++)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aChar&amp;nbsp;=&amp;nbsp;in[off++];&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;switch&lt;/span&gt;&amp;nbsp;(aChar)&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'0':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'1':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'2':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'3':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'4':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'5':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'6':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'7':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'8':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'9':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value&amp;nbsp;=&amp;nbsp;(value&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;4)&amp;nbsp;+&amp;nbsp;aChar&amp;nbsp;-&amp;nbsp;'0';&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;break&lt;/span&gt;;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'a':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'b':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'c':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'d':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'e':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'f':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value&amp;nbsp;=&amp;nbsp;(value&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;4)&amp;nbsp;+&amp;nbsp;10&amp;nbsp;+&amp;nbsp;aChar&amp;nbsp;-&amp;nbsp;'a';&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;break&lt;/span&gt;;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'A':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'B':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'C':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'D':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'E':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;case&lt;/span&gt;&amp;nbsp;'F':&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value&amp;nbsp;=&amp;nbsp;(value&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;4)&amp;nbsp;+&amp;nbsp;10&amp;nbsp;+&amp;nbsp;aChar&amp;nbsp;-&amp;nbsp;'A';&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;break&lt;/span&gt;;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;default&lt;/span&gt;:&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;IllegalArgumentException(&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Malformed&amp;nbsp;\\uxxxx&amp;nbsp;encoding.");&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out[outLen++]&amp;nbsp;=&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;)&amp;nbsp;value;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(aChar&amp;nbsp;==&amp;nbsp;'t')&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aChar&amp;nbsp;=&amp;nbsp;'\t';&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(aChar&amp;nbsp;==&amp;nbsp;'r')&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aChar&amp;nbsp;=&amp;nbsp;'\r';&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(aChar&amp;nbsp;==&amp;nbsp;'n')&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aChar&amp;nbsp;=&amp;nbsp;'\n';&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&amp;nbsp;(aChar&amp;nbsp;==&amp;nbsp;'f')&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;aChar&amp;nbsp;=&amp;nbsp;'\f';&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out[outLen++]&amp;nbsp;=&amp;nbsp;aChar;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000FF;"&gt;else&lt;/span&gt;&amp;nbsp;{&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out[outLen++]&amp;nbsp;=&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;char&lt;/span&gt;)&amp;nbsp;aChar;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;String(out,&amp;nbsp;0,&amp;nbsp;outLen);&amp;nbsp;&amp;nbsp;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span  style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; "&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;} &amp;nbsp;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/phinecos/aggbug/2252494.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/phinecos/archive/2011/11/17/2252494.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/phinecos/archive/2011/11/14/2247733.html</id><title type="text">一次内存泄露问题的排查</title><summary type="text">系统对外提供的Solr查询接口，在来自外部调用的压力加大之后，就会出现solr查询报Read Timed Out的异常，从表面现象上看是此时solr核压力过大，无法响应过多的查询请求。 但实际上此时并发查询压力并不是很大，那么为何solr核会无法及时响应查询请求呢？首先用top查看了下load average，也是很低，也佐证了系统本身压力并不大。 然后，用jstack –l &amp;lt;pid&amp;gt; 查看那些cpu使用率过高的线程，发现全都是GC线程，说明GC过于频繁，而且耗时过长，导致应用线程被挂起，无法响应客户端发来的请求，这种情况就应该是有存在内存泄露的问题咯。 于是，就用jmap将进.</summary><published>2011-11-13T17:11:00Z</published><updated>2011-11-13T17:11:00Z</updated><author><name>Phinecos(洞庭散人)</name><uri>http://www.cnblogs.com/phinecos/</uri></author><link rel="alternate" href="http://www.cnblogs.com/phinecos/archive/2011/11/14/2247733.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/phinecos/archive/2011/11/14/2247733.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;font  face="宋体"&gt;&lt;/font&gt;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;font  face="宋体"&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;系统对外提供的&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Solr&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;查询接口，在来自外部调用的压力加大之后，就会出现&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;solr&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;查询报&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Read Timed Out&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;的异常，从表面现象上看是此时&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;solr&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;核压力过大，无法响应过多的查询请求。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;font  face="宋体"&gt;  &lt;p&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;但实际上此时并发查询压力并不是很大，那么为何&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;solr&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;核会无法及时响应查询请求呢？首先用&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;top&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;查看了下&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;load average&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;，也是很低，也佐证了系统本身压力并不大。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;然后，用&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;jstack &amp;#8211;l &amp;lt;pid&amp;gt; &lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;查看那些&lt;/span&gt;&lt;span style="font-size: 10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;cpu&lt;/span&gt;&lt;span style="font-size: 10.0pt;font-family:宋体;"&gt;使用率过高的线程，发现全都是&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;线程，说明&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;过于频繁，而且耗时过长，导致应用线程被挂起，无法响应客户端发来的请求，这种情况就应该是有存在内存泄露的问题咯。&lt;/span&gt;&lt;/p&gt;&lt;/font&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/2011111401.jpg" width="727" height="487" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;于是，就用&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;jmap&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;将进程的堆转储文件&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;dump&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: 宋体;"&gt;出来到&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;heap.bin&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;文件中&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;JMap -dump:format=b,file=/tmp/heap.bin &amp;lt;pid&amp;gt;&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;然后用&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Eclipse Memory Analyzer&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;（&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;MAT&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;）打开堆转储文件进行分析&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;通常我们都会采用下面的&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;&amp;#8220;&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;三步曲&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;&amp;#8221;&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;来分析内存泄露问题：&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;首先，对问题发生时刻的系统内存状态获取一个整体印象。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;第二步，找到最有可能导致内存泄露的元凶，通常也就是消耗内存最多的对象&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;接下来，进一步去查看这个内存消耗大户的具体情况，看看是否有什么异常的行为。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;下面来展示如何采用&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;&amp;#8220;&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;三步曲&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;&amp;#8221;&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;来查看生产的分析报告。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;a name="minor5.1"&gt;&lt;span style="font-size:10.0pt;font-family: 宋体;"&gt;查看报告之一：内存消耗的整体状况&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="text-indent:21.0pt"&gt;&lt;a name="minor5.1"&gt;&lt;span style="font-family:宋体;"&gt;&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/2011111402.jpg" width="750" height="439" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;p style="text-indent:21.0pt"&gt;&lt;font  face="宋体"&gt;&lt;/font&gt;&lt;/p&gt;&lt;div&gt;&lt;p style="text-indent:21.0pt"&gt;&lt;font  face="宋体"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;如上图所示，在报告上最醒目的就是一张简洁明了的饼图，从图上我们可以清晰地看到一个可疑对象消耗了系统&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;75% &lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;的内存。&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;font  face="宋体"&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;现在，让我们开始真正的寻找内存泄露之旅，点击&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;&amp;#8220;Leak &amp;nbsp;Suspects&amp;#8221;&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;链接，可以看到如下图所示对可疑对象的详细分析报告。&lt;/span&gt;&lt;/p&gt;&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/2011111403.jpg" width="692" height="434" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;&amp;nbsp;&amp;nbsp; 我们查看下从&lt;/span&gt;&lt;span style="font-size: 10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt; GC &lt;/span&gt;&lt;span style="font-size: 10.0pt;font-family:宋体;"&gt;根元素到内存消耗聚集点的最短路径&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/2011111404.jpg" width="764" height="171" alt="" /&gt;&lt;/p&gt;&lt;div&gt;&lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;我们可以很清楚的看到整个引用链，内存聚集点是一个拥有大量对象的列表，如果你对代码比较熟悉的话，相信这些信息应该能给你提供一些找到内存泄露的思路了。&lt;/span&gt;&lt;/p&gt;  &lt;span style="font-size:10.0pt;font-family:宋体;Times New Roman&amp;quot;;"&gt;接下来，我们再继续看看，这个对象集合里到底存放了什么，为什么会消耗掉如此多的内存。&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;;Times New Roman&amp;quot;;"&gt;&lt;br /&gt; &lt;img src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/2011111405.jpg" width="630" height="551" alt="" /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;p&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;在这张图上，我们可以清楚的看到，这个列表中保存了大量&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt; HashMap &lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;对象的引用，就是它导致的内存泄露。&lt;/span&gt;&lt;/p&gt;&lt;div&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;至此，我们已经拥有了足够的信息去寻找泄露点，回到代码中就发现，&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;List&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;没有&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;clear&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;或者设置为&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;null&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;，导致其包含的强引用的各个&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;HashMap&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;没有得到释放。至此，问题得到解决。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;下面我们来继续深入研究&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;java&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;的内存泄露问题。&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: 宋体;"&gt;的一个重要优点就是通过垃圾收集器&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;(Garbage Collection&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;，&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC)&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;自动管理内存的回收，程序员不需要通过调用函数来释放内存。因此，很多程序员认为&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;不存在内存泄漏问题，或者认为即使有内存泄漏也不是程序的责任，而是&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;或&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;JVM&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;的问题。其实，这种想法是不正确的，因为&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;也存在内存泄露，但它的表现与&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;C++&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;不同。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;随着越来越多的服务器程序采用&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;技术，例如&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;JSP&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;，&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Servlet&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;，&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt; EJB&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;等，服务器程序往往长期运行。另外，在很多嵌入式系统中，内存的总量非常有限。内存泄露问题也就变得十分关键，即使每次运行少量泄漏，长期运行之后，系统也是面临崩溃的危险。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;为了判断&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;中是否有内存泄露，我们首先必须了解&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;是如何管理内存的。&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;的内存管理就是对象的分配和释放问题。在&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;中，程序员需要通过关键字&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;new&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;为每个对象申请内存空间&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt; (&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: 宋体;"&gt;基本类型除外&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;)&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;，所有的对象都在堆&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt; (Heap)&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: 宋体;"&gt;中分配空间。另外，对象的释放是由&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;决定和执行的。在&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: 宋体;"&gt;中，内存的分配是由程序完成的，而内存的释放是有&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;完成的，这种收支两条线的方法确实简化了程序员的工作。但同时，它也加重了&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;JVM&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;的工作。这也是&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: 宋体;"&gt;程序运行速度较慢的原因之一。因为，&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;为了能够正确释放对象，&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: 宋体;"&gt;必须监控每一个对象的运行状态，包括对象的申请、引用、被引用、赋值等，&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;都需要进行监控。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;监视对象状态是为了更加准确地、及时地释放对象，而释放对象的根本原则就是该对象不再被引用。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;为了更好理解&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;的工作原理，我们可以将对象考虑为有向图的顶点，将引用关系考虑为图的有向边，有向边从引用者指向被引对象。另外，每个线程对象可以作为一个图的起始顶点，例如大多程序从&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;main&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;进程开始执行，那么该图就是以&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;main&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;进程顶点开始的一棵根树。在这个有向图中，根顶点可达的对象都是有效对象，&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;将不回收这些对象。如果某个对象&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt; (&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;连通子图&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;)&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;与这个根顶点不可达&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;(&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;注意，该图为有向图&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;)&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;，那么我们认为这个&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;(&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;这些&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;)&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;对象不再被引用，可以被&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: 宋体;"&gt;回收。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;以下，我们举一个例子说明如何用有向图表示内存管理。对于程序的每一个时刻，我们都有一个有向图表示&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;JVM&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;的内存分配情况。以下右图，就是左边程序运行到第&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;6&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;行的示意图。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/2011111406.jpg" width="575" height="213" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;div&gt;&lt;p&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;Java&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;使用有向图的方式进行内存管理，可以消除引用循环的问题，例如有三个对象，相互引用，只要它们和根进程不可达的，那么&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;也是可以回收它们的。这种方式的优点是管理内存的精度很高，但是效率较低。另外一种常用的内存管理技术是使用计数器，例如&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;COM&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;模型采用计数器方式管理构件，它与有向图相比，精度行低&lt;/span&gt;&lt;span style="font-size: 10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;(&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;很难处理循环引用的问题&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;)&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;，但执行效率很高。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;下面，我们就可以描述什么是内存泄漏。在&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;中，内存泄漏就是存在一些被分配的对象，这些对象有下面两个特点，首先，这些对象是可达的，即在有向图中，存在通路可以与其相连；其次，这些对象是无用的，即程序以后不会再使用这些对象。如果对象满足这两个条件，这些对象就可以判定为&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;中的内存泄漏，这些对象不会被&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;所回收，然而它却占用内存。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;在&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;C++&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;中，内存泄漏的范围更大一些。有些对象被分配了内存空间，然后却不可达，由于&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;C++&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;中没有&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;，这些内存将永远收不回来。在&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;中，这些不可达的对象都由&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;负责回收，因此程序员不需要考虑这部分的内存泄露。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;通过分析，我们得知，对于&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;C++&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;，程序员需要自己管理边和顶点，而对于&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;程序员只需要管理边就可以了&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;(&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;不需要管理顶点的释放&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;)&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;。通过这种方式，&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;提高了编程的效率。&lt;/span&gt;&lt;/p&gt;  &lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;;Times New Roman&amp;quot;;"&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/2011111407.jpg" width="493" height="241" alt="" /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;因此，通过以上分析，我们知道在&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;中也有内存泄漏，但范围比&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;C++&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;要小一些。因为&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;从语言上保证，任何对象都是可达的，所有的不可达对象都由&lt;/span&gt;&lt;span style="font-size: 10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size: 10.0pt;font-family:宋体;"&gt;管理。&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;对于程序员来说，&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;基本是透明的，不可见的。虽然，我们只有几个函数可以访问&lt;/span&gt;&lt;span style="font-size: 10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size: 10.0pt;font-family:宋体;"&gt;，例如运行&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;的函数&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;System.gc()&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;，但是根据&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Java&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;语言规范定义，&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt; &lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;该函数不保证&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;JVM&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: 宋体;"&gt;的垃圾收集器一定会执行。因为，不同的&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;JVM&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;实现者可能使用不同的算法管理&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;。通常，&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;的线程的优先级别较低。&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;JVM&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: 宋体;"&gt;调用&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;的策略也有很多种，有的是内存使用到达一定程度时，&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;才开始工作，也有定时执行的，有的是平缓执行&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;，有的是中断式执行&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: 宋体;"&gt;。但通常来说，我们不需要关心这些。除非在一些特定的场合，&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;的执行影响应用程序的性能，例如对于基于&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Web&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;的实时系统，如网络游戏等，用户不希望&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;突然中断应用程序执行而进行垃圾回收，那么我们需要调整&lt;/span&gt;&lt;span style="font-size: 10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size: 10.0pt;font-family:宋体;"&gt;的参数，让&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;能够通过平缓的方式释放内存，例如将垃圾回收分解为一系列的小步骤执行，&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Sun&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;提供的&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;HotSpot JVM&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;就支持这一特性。&lt;/span&gt;&lt;/p&gt;  &lt;/div&gt;&lt;p&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;&amp;nbsp;&amp;nbsp; 下面给出了一个简单的内存泄露的例子。在这个例子中，我们循环申请&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Object&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;对象，并将所申请的对象放入一个&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Vector&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;中，如果我们仅仅释放引用本身，那么&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Vector&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;仍然引用该对象，所以这个对象对&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;GC&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;来说是不可回收的。因此，如果对象加入到&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Vector&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;后，还必须从&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Vector&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: 宋体;"&gt;中删除，最简单的方法就是将&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Vector&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;对象设置为&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;null&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;。&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;Vector&amp;nbsp;v=&lt;span style="color: #0000ff; "&gt;new&lt;/span&gt;&amp;nbsp;Vector(10);&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&amp;nbsp;i=1;i&amp;lt;100;&amp;nbsp;i++)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Object&amp;nbsp;o=&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Object();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;v.add(o);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;o=&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/phinecos/aggbug/2247733.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/phinecos/archive/2011/11/14/2247733.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/phinecos/archive/2011/10/18/2216220.html</id><title type="text">每日学习笔记(22)</title><summary type="text">1，使用JMX监控Solr, 首先在solrconfig.xml中确保没有注释掉下述配置项，以便启用JMX。 &amp;lt;jmx /&amp;gt; 然后在启动时加入一些启动参数来支持远程连接： java-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.port=3000-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.authenticate=false-jarstart.jar Jdk提供了一个图形化的工具JConsole [JDK_HO.</summary><published>2011-10-18T03:03:00Z</published><updated>2011-10-18T03:03:00Z</updated><author><name>Phinecos(洞庭散人)</name><uri>http://www.cnblogs.com/phinecos/</uri></author><link rel="alternate" href="http://www.cnblogs.com/phinecos/archive/2011/10/18/2216220.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/phinecos/archive/2011/10/18/2216220.html"/><content type="html">&lt;div&gt;&lt;p&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;;"&gt;1&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;，使用&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;JMX&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;监控&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Solr,&lt;/span&gt;&lt;/p&gt;  &lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;首先在&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;solrconfig.xml&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;中确保没有注释掉下述配置项，以便启用&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;JMX&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;font  face="Verdana, sans-serif" size="2"&gt;&lt;span  style="line-height: 19px;"&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;&lt;div&gt;&lt;font  face="Verdana, sans-serif" size="2"&gt;&lt;span style="font-size: 13px; "&gt;&amp;nbsp;&amp;lt;jmx /&amp;gt;&lt;/span&gt;&lt;/font&gt;&lt;/div&gt;  &lt;p&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;然后在启动时加入一些启动参数来支持远程连接：&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;font  face="Verdana, sans-serif" size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;font  face="Verdana, sans-serif" size="2"&gt;java&amp;nbsp;-Dcom.sun.management.jmxremote&amp;nbsp;-Dcom.sun.management.jmxremote.port=3000&amp;nbsp;-Dcom.sun.management.jmxremote.ssl=false&amp;nbsp;-Dcom.sun.management.jmxremote.authenticate=false&amp;nbsp;-jar&amp;nbsp;&lt;span style="color: #0000FF;"&gt;start&lt;/span&gt;.jar&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;Jdk&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;提供了一个图形化的工具&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;JConsole&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;font  face="Verdana, sans-serif" size="2"&gt;&lt;/font&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;font  face="Verdana, sans-serif" size="2"&gt;[JDK_HOME]/bin/jconsole&lt;/font&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;连接&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;jmx&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;服务器&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/2011101801.jpg" width="383" height="438" alt="" /&gt;&lt;/p&gt;&lt;p&gt;&lt;span  style="font-family: 宋体; font-size: 13px; line-height: 19px; "&gt;基本监控信息：&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;img src="http://images.cnblogs.com/cnblogs_com/phinecos/20080415/2011101802.jpg" width="896" height="749" alt="" /&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/phinecos/aggbug/2216220.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/phinecos/archive/2011/10/18/2216220.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/phinecos/archive/2011/10/12/2209002.html</id><title type="text">每日学习笔记(21)</title><summary type="text">1，今天收到报警信息，说应用所在机器的硬盘空间不足了，上去一看，居然发现国庆这几天的日志信息累计达到了260多G，可看了下应用下的日志，实际只有几十M而已，进一步check后发现是调用的第三方应用在另一个日志路径下打出大量的Debug信息，回查代码后才明白是Logback和Log4J的冲突问题，于是写了一个类在应用启动时将Log4J的级别调高至ERROR级别，代码如下： publicclassLog4jInit{ privatestaticStringlogFilePath;privatefinalstaticStringDEFAULT_LOG4J_FILE_NAME=&amp;quot;log4j.</summary><published>2011-10-12T11:50:00Z</published><updated>2011-10-12T11:50:00Z</updated><author><name>Phinecos(洞庭散人)</name><uri>http://www.cnblogs.com/phinecos/</uri></author><link rel="alternate" href="http://www.cnblogs.com/phinecos/archive/2011/10/12/2209002.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/phinecos/archive/2011/10/12/2209002.html"/><content type="html">&lt;div&gt;&lt;p&gt;1&lt;span style="font-family:宋体;"&gt;，今天收到报警信息，说应用所在机器的硬盘空间不足了，上去一看，居然发现国庆这几天的日志信息累计达到了&lt;/span&gt;260&lt;span style="font-family:宋体;"&gt;多&lt;/span&gt;G&lt;span style="font-family:宋体;"&gt;，可看了下应用下的日志，实际只有几十&lt;/span&gt;M&lt;span style="font-family:宋体;"&gt;而已，进一步&lt;/span&gt;check&lt;span style="font-family:宋体;"&gt;后发现是调用的第三方应用在另一个日志路径下打出大量的&lt;/span&gt;Debug&lt;span style="font-family:宋体;"&gt;信息，回查代码后才明白是&lt;/span&gt;Logback&lt;span style="font-family:宋体;"&gt;和&lt;/span&gt;Log4J&lt;span style="font-family:宋体;"&gt;的冲突问题，于是写了一个类在应用启动时将&lt;/span&gt;Log4J&lt;span style="font-family:宋体;"&gt;的级别调高至&lt;/span&gt;ERROR&lt;span style="font-family:宋体;"&gt;级别，代码如下：&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;span style="color: #0000ff; "&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff; "&gt;class&lt;/span&gt;&amp;nbsp;Log4jInit&amp;nbsp;{&amp;nbsp;&lt;/div&gt;&lt;p&gt;&lt;span style="color: #0000FF;"&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;private&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;String&amp;nbsp;logFilePath;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;final&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;String&amp;nbsp;DEFAULT_LOG4J_FILE_NAME&amp;nbsp;=&amp;nbsp;"log4j.xml";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;org.slf4j.Logger&amp;nbsp;log&amp;nbsp;=&amp;nbsp;org.slf4j.LoggerFactory.getLogger(getClass());&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;configureLog4j()&amp;nbsp;&lt;span style="color: #0000FF;"&gt;throws&lt;/span&gt;&amp;nbsp;javax.xml.parsers.FactoryConfigurationError&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.setProperty(&amp;nbsp;"org.apache.commons.logging.Log",&amp;nbsp;"org.apache.commons.logging.impl.NoOpLog"&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Properties&amp;nbsp;p&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&amp;nbsp;Properties();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p.put("log4j.logger.httpclient.wire",&amp;nbsp;Level.ERROR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;p.put("log4j.logger.org.apache.commons.httpclient",&amp;nbsp;Level.ERROR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Logger&amp;nbsp;root&amp;nbsp;=&amp;nbsp;Logger.getRootLogger();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;boolean&lt;/span&gt;&amp;nbsp;rootIsConfigured&amp;nbsp;=&amp;nbsp;root.getAllAppenders().&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;hasMoreElements();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;(root&amp;nbsp;!=&amp;nbsp;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;root.setLevel(Level.ERROR);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;log.error("turn&amp;nbsp;off&amp;nbsp;log4j");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;String&amp;nbsp;getLogFilePath()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&amp;nbsp;logFilePath;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&amp;nbsp;setLogFilePath(String&amp;nbsp;logFilePath)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Log4jInit.logFilePath&amp;nbsp;=&amp;nbsp;logFilePath;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/phinecos/aggbug/2209002.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/phinecos/archive/2011/10/12/2209002.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/phinecos/archive/2011/09/28/2194427.html</id><title type="text">每日学习笔记(20)</title><summary type="text">1,Solr合并索引数据有两种方法，第一种是1.4版本中引入的，通过CoreAdminHandler来实现，示例如下：http://localhost:8983/solr/admin/cores?action=mergeindexes&amp;amp;core=core0&amp;amp;indexDir=/opt/solr/core1/data/index&amp;amp;indexDir=/opt/solr/core2/data/index 上述命令会将core1和core2的索引合并到core0中去，这里最值得注意的一点是：一旦合并完成，必须在core0上调用commit操作，否则索引数据的变化对于search</summary><published>2011-09-28T06:54:00Z</published><updated>2011-09-28T06:54:00Z</updated><author><name>Phinecos(洞庭散人)</name><uri>http://www.cnblogs.com/phinecos/</uri></author><link rel="alternate" href="http://www.cnblogs.com/phinecos/archive/2011/09/28/2194427.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/phinecos/archive/2011/09/28/2194427.html"/><content type="html">&lt;div&gt;&#xD;
&lt;p style="text-align: left" align="left"&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;1,&amp;nbsp;Solr&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt; courier: "&gt;合并索引数据有两种方法，第一种是&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;1.4&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt; courier: "&gt;版本中引入的，通过&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;CoreAdminHandler&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt; courier: "&gt;来实现，示例如下：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left" align="left"&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&lt;a href="http://localhost:8983/solr/admin/cores?action=mergeindexes&amp;amp;core=core0&amp;amp;indexDir=/opt/solr/core1/data/index&amp;amp;indexDir=/opt/solr/core2/data/index"&gt;http://localhost:8983/solr/admin/cores?action=mergeindexes&amp;amp;core=core0&amp;amp;indexDir=/opt/solr/core1/data/index&amp;amp;indexDir=/opt/solr/core2/data/index&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left" align="left"&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt; courier: "&gt;上述命令会将&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;core1&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt; courier: "&gt;和&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;core2&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt; courier: "&gt;的索引合并到&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;core0&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt; courier: "&gt;中去，这里最值得注意的一点是：一旦合并完成，必须在&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;core0&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt; courier: "&gt;上调用&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;commit&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt; courier: "&gt;操作，否则索引数据的变化对于&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;searchers&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt; courier: "&gt;来说是暂时不可见的，只有等到下次&lt;/span&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;core0&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt; courier: "&gt;重新装载起来时才可见。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left" align="left"&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt; courier: "&gt;实现代码如下：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&#xD;
&lt;div&gt;&lt;font  color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="line-height: 19px; font-family: 'Courier New'; color: #008000; font-size: 13px" &gt;/**&lt;/span&gt;&amp;nbsp;&lt;/font&gt;&lt;/div&gt;&#xD;
&lt;div&gt;&lt;font  color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; *&amp;nbsp;合并索引数据&lt;/font&gt;&lt;br /&gt;&lt;font  color="#008000"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;/font&gt;&lt;span style="color: #808080"&gt;@param&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;otherIndexPathList&amp;nbsp;其他待合并的索引数据路径&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080"&gt;@param&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;coreName&amp;nbsp;合并的目标solr核名称&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000"&gt;*/&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: #0000ff"&gt;void&lt;/span&gt;&amp;nbsp;mergeIndexData(List&amp;lt;String&amp;gt;&amp;nbsp;otherIndexPathList,&amp;nbsp;String&amp;nbsp;coreName)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;&amp;nbsp;!=&amp;nbsp;otherIndexPathList&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;otherIndexPathList.size()&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HttpClient&amp;nbsp;client&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;HttpClient();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client.setConnectionTimeout(20000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client.setTimeout(20000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;client.setHttpConnectionFactoryTimeout(20000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StringBuffer&amp;nbsp;sb&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;StringBuffer();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: #0000ff"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;otherIndexPathList.size();&amp;nbsp;++i)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;sb.append("&amp;amp;indexDir="&amp;nbsp;+&amp;nbsp;otherIndexPathList.get(i)&amp;nbsp;+&amp;nbsp;"/data/index");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;mergeIndexCMD&amp;nbsp;=&amp;nbsp;"http://"&amp;nbsp;+&amp;nbsp;Constants.LOCAL_ADDRESS&amp;nbsp;+&amp;nbsp;":"&amp;nbsp;+&amp;nbsp;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.port&amp;nbsp;&amp;nbsp;+&amp;nbsp;"/admin/cores?action=mergeindexes&amp;amp;core="+&amp;nbsp;coreName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(sb.length()&amp;nbsp;&amp;gt;&amp;nbsp;0)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mergeIndexCMD&amp;nbsp;+=&amp;nbsp;sb.toString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HttpMethod&amp;nbsp;method&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;new&lt;/span&gt;&amp;nbsp;GetMethod(mergeIndexCMD);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method.getParams().setContentCharset("GBK");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method.getParams().setHttpElementCharset("GBK");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;method.getParams().setCredentialCharset("GBK");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;&amp;nbsp;execute&amp;nbsp;the&amp;nbsp;method.&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(client.executeMethod(method)&amp;nbsp;==&amp;nbsp;200)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;response&amp;nbsp;=&amp;nbsp;method.getResponseBodyAsString();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;if&lt;/span&gt;&amp;nbsp;(logger.isInfoEnabled())&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.info("merge&amp;nbsp;result"&amp;nbsp;+&amp;nbsp;response);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;e)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;logger.error("合并其他索引数据失败&amp;nbsp;"&amp;nbsp;+&amp;nbsp;coreName&amp;nbsp;+&amp;nbsp;"，索引目录:&amp;nbsp;"&amp;nbsp;+&amp;nbsp;otherIndexPathList,&amp;nbsp;e);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #008000"&gt;//&lt;/span&gt;&lt;span style="color: #008000"&gt;commit操作让合并后的索引对搜索生效&lt;/span&gt;&lt;span style="color: #008000"&gt;&lt;br /&gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;StreamingUpdateSolrServer&amp;nbsp;httpSolrServer&amp;nbsp;=&amp;nbsp;&lt;span style="color: #0000ff"&gt;null&lt;/span&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;httpSolrServer&amp;nbsp;=&amp;nbsp;getSolrServer(Constants.LOCAL_ADDRESS,&amp;nbsp;&lt;span style="color: #0000ff"&gt;this&lt;/span&gt;.port,&amp;nbsp;coreName);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000ff"&gt;try&lt;/span&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;httpSolrServer.commit();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;span style="color: #0000ff"&gt;catch&lt;/span&gt;&amp;nbsp;(Exception&amp;nbsp;e)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 'Courier New'; color: black; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;&lt;/div&gt;&lt;font size="2"&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt; courier: "&gt;&lt;font face="Verdana"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;第二种方法是&lt;/span&gt;&lt;/font&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;Solr3.3&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt; courier: "&gt;中引入的，也是通过&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;CoreAdminHandler&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt; courier: "&gt;来实现，示例如下：&lt;/span&gt; &#xD;
&lt;div&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;&lt;a href="http://localhost:8983/solr/admin/cores?action=mergeindexes&amp;amp;core=core0&amp;amp;srcCore=core1&amp;amp;srcCore=core2"&gt;http://localhost:8983/solr/admin/cores?action=mergeindexes&amp;amp;core=core0&amp;amp;srcCore=core1&amp;amp;srcCore=core2&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-align: left" align="left"&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;同第一种方法一样，&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt; courier: "&gt;一旦合并完成，必须在&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;core0&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt; courier: "&gt;上调用&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;commit&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt; courier: "&gt;操作，否则索引数据的变化对于&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;searchers&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt; courier: "&gt;来说是暂时不可见的，只有等到下次&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;core0&lt;/span&gt;&lt;span style="font-family: 宋体; color: black; font-size: 10pt; courier: "&gt;重新装载起来时才可见。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;使用&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;&amp;#8221;srcCore&amp;#8221;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;和&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;&amp;#8221;indexDir&amp;#8221;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;这两种方法的区别：&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin-left: 39pt"&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;&lt;span&gt;1)&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;使用&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;&amp;#8221;indexDir&amp;#8221;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;参数，你可以合并不是与&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;Solr&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;核相关联的索引数据，比如通过&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;Lucene&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;直接创建的索引&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin-left: 39pt"&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;&lt;span&gt;2)&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;使用&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;&amp;#8221;indexDir&amp;#8221;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;参数，你必须注意索引数据不是直接写入的，这就意味着如果它是一个&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;solr&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;核的索引，必须要关闭&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;IndexWriter&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;，这样才能触发一个&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;commit&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;命令。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin-left: 39pt"&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;&lt;span&gt;3)&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;&amp;#8220;indexDir&amp;#8221;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;必须指向&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;solr&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;核所在的主机上的磁盘路径，这就限制比较多了，而相反，你可以只给&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;srcCore&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;一个&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;solr&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;核的名称，而不关心它的实际索引路径在哪。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin-left: 39pt"&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;&lt;span&gt;4)&lt;span style="font: 7pt 'Times New Roman'"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;使用&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;&amp;#8221;srcCore&amp;#8221;&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;，你必须确保即使源索引数据同时存在写操作的时候，合并后的索引页不会损坏。&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p style="text-indent: -18pt; margin-left: 39pt"&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&#xD;
&lt;p&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;2,&amp;nbsp;&amp;nbsp; solr&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;索引合并的时候，底层其实调用的还是&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;Lucene&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;，因此你&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;schema.xml&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;中配置的&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;uniqueKeys&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;它并不知道，因此当你对两个包含相同文档（由&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;uniqueKey&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;确定）的索引进行合并时，你会得到双倍的文档数，&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;solr&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;这个地方应该改下，毕竟你不是简单的&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;Lucene&lt;/span&gt;&lt;span style="font-family: 宋体; font-size: 10pt"&gt;包装嘛。。。&lt;/span&gt;&lt;span style="font-family: 'Verdana','sans-serif'; font-size: 10pt"&gt;&lt;/span&gt;&lt;/p&gt;&#xD;
&lt;p&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/phinecos/aggbug/2194427.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/phinecos/archive/2011/09/28/2194427.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/phinecos/archive/2011/08/23/2151191.html</id><title type="text">每日学习笔记(19)</title><summary type="text">今天的工作需求如下：有一个生产者负责生成源数据，将数据插入到多个工作队列中，每个工作队列由一个线程池进行处理，即每个线程池中可以启动多个线程对与其对应的工作队列中的元素取出来进行处理。 我将业务需求抽象为一个“单生产者—多消费者集群”模型，写了一个模拟代码进行测试，明天打算把模型再套回到业务中去。importjava.text.DateFormat;importjava.util.Collection;importjava.util.Date;importjava.util.HashMap;importjava.util.Map;importjava.util.Map.Entry;impo..</summary><published>2011-08-23T12:30:00Z</published><updated>2011-08-23T12:30:00Z</updated><author><name>Phinecos(洞庭散人)</name><uri>http://www.cnblogs.com/phinecos/</uri></author><link rel="alternate" href="http://www.cnblogs.com/phinecos/archive/2011/08/23/2151191.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/phinecos/archive/2011/08/23/2151191.html"/><content type="html">&lt;div&gt;&lt;p style="text-indent:21.0pt"&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;今天的工作需求如下：有一个生产者负责生成源数据，将数据插入到多个工作队列中，每个工作队列由一个线程池进行处理，即每个线程池中可以启动多个线程对与其对应的工作队列中的元素取出来进行处理。&lt;/span&gt;&lt;/p&gt;  &lt;p&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;我将业务需求抽象为一个&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;&amp;#8220;&lt;/span&gt;&lt;span style="font-size:10.0pt; font-family:宋体;"&gt;单生产者&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family: &amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;&amp;#8212;&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;多消费者集群&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:&amp;quot;Verdana&amp;quot;,&amp;quot;sans-serif&amp;quot;"&gt;&amp;#8221;&lt;/span&gt;&lt;span style="font-size:10.0pt;font-family:宋体;"&gt;模型，写了一个模拟代码进行测试，明天打算把模型再套回到业务中去。&lt;/span&gt;&lt;/p&gt;&lt;div style="background-color: #F5F5F5;border: 1px solid #CCCCCC;padding-left:5px;padding-right:5px;"&gt;&lt;div&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;java.text.DateFormat;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;java.util.Collection;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;java.util.Date;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;java.util.HashMap;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;java.util.Map;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;java.util.Map.Entry;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;java.util.Random;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;java.util.Set;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;java.util.concurrent.ArrayBlockingQueue;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;java.util.concurrent.ThreadPoolExecutor;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;import&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;java.util.concurrent.TimeUnit;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;测试工作队列和线程池&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;@author&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;fayin.dyk&lt;br /&gt;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;*&amp;nbsp;测试流程:&amp;nbsp;0,预先创建n个工作队列&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1,一个生产者线程不断生产QueueElement，将其放置到n个工作队列中&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2,每个工作队列有一个对应的线程池，其中的工作线程从队列中依次取&lt;br /&gt;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QueueElement，并进行相应的处理&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;TestWorkQueue&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Map&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;String,&amp;nbsp;WorkQueue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;workQueueList&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;n个商品库工作队列&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;QUEUE_NUM&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initWorkQueue();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;初始化n个工作队列&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;initWorkQueue()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;创建同样数量的工作队列&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;workQueueList&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;HashMap&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;String,&amp;nbsp;WorkQueue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(QUEUE_NUM);&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;队列名称与对应的工作队列&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;0&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&amp;nbsp;i&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;QUEUE_NUM;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;++&lt;/span&gt;&lt;span style="color: #000000;"&gt;i)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;entityName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;auction&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WorkQueue&amp;nbsp;workQueue&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;WorkQueue();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;workQueueList.put(entityName,&amp;nbsp;workQueue);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;单个的生产者线程,不断生产QueueElement，放置到n个工作队列中&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;@author&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;fayin.dyk&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ProducerThread&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;implements&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Runnable&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;boolean&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;isNeedToStop&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;false&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;生成行键值&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;@param&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;itemId&amp;nbsp;商品id&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;@return&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;String&amp;nbsp;generateRowKey(String&amp;nbsp;itemId)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;result&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DateFormat&amp;nbsp;format&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;java.text.SimpleDateFormat(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;yyyyMMddHHmmss&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Date&amp;nbsp;curDate&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Date();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;curDateStr&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;format.format(curDate);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;result&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;curDateStr&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;_&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;itemId;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;result;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;QueueElement&amp;nbsp;generateQueueElement()&amp;nbsp;{&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;随机生产element&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;msgType&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ItemNotifyConstants.NM_item_add;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;消息类型&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;商品id&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Random&amp;nbsp;rnd&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Random();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;rndItemId&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;String.valueOf(rnd.nextInt(&lt;/span&gt;&lt;span style="color: #000000;"&gt;10000&lt;/span&gt;&lt;span style="color: #000000;"&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;rowKey&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;generateRowKey(rndItemId);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;location&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;hz&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;title&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;auction_&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;rndItemId;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QueueElement&amp;nbsp;element&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;QueueElement(msgType,rowKey,&amp;nbsp;rndItemId,&amp;nbsp;&amp;nbsp;rndItemId,&amp;nbsp;location,&amp;nbsp;title,&amp;nbsp;rndItemId);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;return&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;element;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;分发到各个工作队列中&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;deployWorkElement(QueueElement&amp;nbsp;element)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Collection&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;WorkQueue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;queueSet&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;workQueueList.values();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(WorkQueue&amp;nbsp;workQueue&amp;nbsp;:&amp;nbsp;queueSet)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;workQueue.enQueue(element);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;run()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;isNeedToStop)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;生产QueueElement,放置到n个工作队列中&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QueueElement&amp;nbsp;element&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;generateQueueElement();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;deployWorkElement(element);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;生产者生产商品id&amp;nbsp;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;element.getItemID()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;\n&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.sleep(&lt;/span&gt;&lt;span style="color: #000000;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(InterruptedException&amp;nbsp;e)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;消费者，每个消费者是与一个队列对应的线程池，其中的线程从此队列中取element，进行相应处理&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&lt;/span&gt;&lt;span style="color: #808080;"&gt;@author&lt;/span&gt;&lt;span style="color: #008000;"&gt;&amp;nbsp;fayin.dyk&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Consumer&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;final&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;CORE_THREAD_NUM&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;20&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;final&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;MAX_THREAD_NUM&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;21&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;final&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;int&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;CAPACITY&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;1000&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;String&amp;nbsp;queueName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;当前队列名称&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;WorkQueue&amp;nbsp;workQueue&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;与其对应的工作队列&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Consumer(WorkQueue&amp;nbsp;workQueue,&amp;nbsp;String&amp;nbsp;queueName)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.workQueue&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;workQueue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.queueName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;queueName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ThreadPoolExecutor&amp;nbsp;indexerThreadPool&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ThreadPoolExecutor(&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CORE_THREAD_NUM,&amp;nbsp;MAX_THREAD_NUM,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;10&lt;/span&gt;&lt;span style="color: #000000;"&gt;,&amp;nbsp;TimeUnit.SECONDS,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ArrayBlockingQueue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Runnable&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;(CAPACITY));&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;处理对应队列的消费者线程&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;process()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;indexerThreadPool.execute(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;IndexerJobThread(workQueue,&amp;nbsp;queueName));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;indexerThreadPool.execute(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;IndexerJobThread(workQueue,&amp;nbsp;queueName));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;class&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;IndexerJobThread&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;implements&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Runnable&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;String&amp;nbsp;queueName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;""&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000; "&gt;当前队列名称&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;WorkQueue&amp;nbsp;workQueue&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;IndexerJobThread(WorkQueue&amp;nbsp;workQueue,&amp;nbsp;String&amp;nbsp;queueName)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.workQueue&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;workQueue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;this&lt;/span&gt;&lt;span style="color: #000000;"&gt;.queueName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;queueName;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;run()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;消费者,当前队列&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;queueName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;队列大小&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;workQueue.queueSize()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;消费者线程id:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Thread.currentThread().getId()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;\n&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;while&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;true&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #000000;"&gt;!&lt;/span&gt;&lt;span style="color: #000000;"&gt;workQueue.isEmpty())&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;QueueElement&amp;nbsp;element&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;workQueue.deQueue();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;if&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(element&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;!=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;null&lt;/span&gt;&lt;span style="color: #000000;"&gt;)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;消费者,当前队列&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;queueName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;商品id:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;element.getItemID()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;消费者线程id:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Thread.currentThread().getId()&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;\n&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.sleep(&lt;/span&gt;&lt;span style="color: #000000;"&gt;100&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(InterruptedException&amp;nbsp;e)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;/**&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;为各个工作队列初始化对应的消费者(每个消费者包含一个线程池来进行处理)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;*/&lt;/span&gt;&lt;span style="color: #000000;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;private&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;initConsumers()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;Entry&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;String,&amp;nbsp;WorkQueue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;queueSet&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;workQueueList.entrySet();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;for&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(Entry&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;String,&amp;nbsp;WorkQueue&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;workQueueEntry&amp;nbsp;:&amp;nbsp;queueSet)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String&amp;nbsp;queueName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;workQueueEntry.getKey();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WorkQueue&amp;nbsp;workQueue&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;workQueueEntry.getValue();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.print(&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;queueName:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;queueName&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;workQueue:&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;workQueue&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;+&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;\n&lt;/span&gt;&lt;span style="color: #000000;"&gt;"&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Consumer&amp;nbsp;consumer&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Consumer(workQueue,&amp;nbsp;queueName);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;consumer.process();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;public&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;static&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;void&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;main(String[]&amp;nbsp;args)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;生产者启动&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread&amp;nbsp;producer&amp;nbsp;&lt;/span&gt;&lt;span style="color: #000000;"&gt;=&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;Thread(&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;new&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;ProducerThread());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;producer.start();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #008000;"&gt;//&lt;/span&gt;&lt;span style="color: #008000;"&gt;启动消费者群&lt;/span&gt;&lt;span style="color: #008000;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;initConsumers();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;try&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Thread.sleep(&lt;/span&gt;&lt;span style="color: #000000;"&gt;100000&lt;/span&gt;&lt;span style="color: #000000;"&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000FF;"&gt;catch&lt;/span&gt;&lt;span style="color: #000000;"&gt;&amp;nbsp;(InterruptedException&amp;nbsp;e)&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;span  style="font-family: 'Courier New'; font-size: 13px; line-height: 19px; "&gt;}&lt;/span&gt;&amp;nbsp;&lt;/p&gt;&lt;/div&gt;&lt;img src="http://www.cnblogs.com/phinecos/aggbug/2151191.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/phinecos/archive/2011/08/23/2151191.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
