webapi+Task并行请求不同接口实例

  标题的名称定义不知道是否准确,不过我想表达的意思就是使用Task特性来同时请求多个不同的接口,然后合并数据;我想这种场景的开发对于对接过其他公司接口的人不会陌生,本人也是列属于之内,更多的是使用最原始的异步委托的方法去处理,今天抽空写了一个使用4.5新特性Task来处理这种场景;各位看客有什么疑问或者好的建议及分享请博客通知,谢谢。

  A.项目结构图

  webapi+Task并行请求不同接口实例_第1张图片

  B.namespace Pm.V.PM_BLL下面的BaseClass定义如下:

 1  public abstract class BaseClass
 2     {
 3 
 4         #region 初始化xml配置信息 BaseClass
 5 
 6         /// 
 7         /// 初始化xml配置信息
 8         /// 
 9         /// 
10         public BaseClass(string xmlConfigPath)
11         {
12 
13             try
14             {
15 
16                 if (string.IsNullOrEmpty(xmlConfigPath))
17                 {
18 
19                     //默认各个Xml配置
20                     var defaultConfigFolder = "PluginXml";
21                     var baseAddr = AppDomain.CurrentDomain.BaseDirectory;
22                     xmlConfigPath = Path.Combine(baseAddr, defaultConfigFolder, this.GetType().Name + ".xml");
23                 }
24 
25                 XmlDocument doc = new XmlDocument();
26                 doc.Load(xmlConfigPath);
27 
28                 Config = new BaseConfig();
29                 Config.Url = doc.SelectSingleNode("//Pm/Url") == null ? "" : doc.SelectSingleNode("//Pm/Url").InnerXml;
30                 Config.UserName = doc.SelectSingleNode("//Pm/UserName") == null ? "" : doc.SelectSingleNode("//Pm/UserName").InnerXml;
31                 Config.UserKey = doc.SelectSingleNode("//Pm/UserKey") == null ? "" : doc.SelectSingleNode("//Pm/UserKey").InnerXml;
32 
33                 Config.Doc = doc;
34             }
35             catch (Exception ex)
36             {
37 
38                 throw new Exception(ex.Message);
39             }
40 
41         }
42 
43         /// 
44         /// xml配置信息
45         /// 
46         public BaseConfig Config;
47         #endregion
48 
49         #region  获取文章信息 _GetArticles  +BaseResponse
50 
51         /// 
52         /// 获取文章信息
53         /// 
54         /// 
55         /// 
56         public virtual MoArticlesResponse _GetArticles(object request)
57         {
58             return null;
59         }
60         #endregion
61 
62     }
63 
64     /// 
65     /// xml配置文件信息
66     /// 
67     public class BaseConfig
68     {
69 
70         /// 
71         /// 接口地址
72         /// 
73         public string Url { get; set; }
74 
75         /// 
76         /// 账号
77         /// 
78         public string UserName { get; set; }
79 
80         /// 
81         /// 密码|秘钥
82         /// 
83         public string UserKey { get; set; }
84 
85         /// 
86         /// xml文件全部信息
87         /// 
88         public XmlDocument Doc { get; set; }
89 
90     }
View Code

  主要是在实例的时候读取各个业务模块的配置文件,初始化一些常用并且是公共的属性信息;其次创建了一个虚方法_GetArticles,注意里面的参数是object这个将再后面的时候重提;

  C.下面就是请求第三方业务实现类的代码,这里测试的时候分别使用

    1.CnblogsClass类抓取博客园首页的博客列表信息

  1    /// 
  2     /// 博客园信息(如果涉及到信息来源问题,请及时联系开源作者,谢谢)
  3     /// 
  4     public class CnblogsClass : BaseClass
  5     {
  6         /// 
  7         /// 初始化xml配置
  8         /// 
  9         public CnblogsClass() : base("") { }
 10 
 11         #region  获取文章信息 _GetArticles  +BaseResponse
 12 
 13         /// 
 14         /// 获取文章信息
 15         /// 
 16         /// 
 17         /// 
 18         public override MoArticlesResponse _GetArticles(object obj)
 19         {
 20             #region 初始化信息
 21 
 22             var request = new MoArticlesRequest();
 23             var response = new MoArticlesResponse();
 24             var sbLog = new StringBuilder(string.Empty);
 25             var url = this.Config.Url;   //这里获取配置文件的url
 26             #endregion
 27 
 28             try
 29             {
 30 
 31                 #region 接口验证数据
 32 
 33                 request = obj as MoArticlesRequest;
 34                 if (request == null)
 35                 {
 36 
 37                     response.ErrorCode = (int)EHelper.PmException.获取数据为空;
 38                     response.ErrorMsg = EHelper.PmException.获取数据为空.ToString();
 39                     return response;
 40                 }
 41 
 42                 #endregion
 43 
 44                 #region 请求数据
 45 
 46 
 47                 sbLog.AppendFormat("请求地址:{0}\n", url);
 48                 var result = PublicClass._HttpGet(url);   //这里一般都是post数据到第三方接口,测试没有第三方可以使用,所以使用抓取博客园首页数据
 49                 sbLog.AppendFormat("返回信息:{0}\n", result);
 50                 #endregion
 51 
 52                 #region 解析
 53 
 54                 //使用正则解析数据
 55                 var rgs = Regex.Matches(result, "class=\"titlelnk\"\\s+href=\"(?http://www(\\w|\\.|\\/)+\\.html)\"[^>]+>(?[^<]+)<\\/a>[^D]+a>(?<des>[^<]+)[^D]+lightblue\">(?<author>\\w+)<\\/a>[^D]+发布于(?<publishtime>\\s+(\\d|-|\\s|:)+)[^<]+</span><span style="color:#800000;">"</span><span style="color:#000000;">);
</span><span style="color:#008080;"> 56</span> 
<span style="color:#008080;"> 57</span>                 <span style="color:#0000ff;">if</span> (rgs.Count <= <span style="color:#800080;">0</span><span style="color:#000000;">)
</span><span style="color:#008080;"> 58</span> <span style="color:#000000;">                {
</span><span style="color:#008080;"> 59</span> 
<span style="color:#008080;"> 60</span>                     response.ErrorCode = (<span style="color:#0000ff;">int</span><span style="color:#000000;">)EHelper.PmException.获取数据为空;
</span><span style="color:#008080;"> 61</span>                     response.ErrorMsg =<span style="color:#000000;"> EHelper.PmException.获取数据为空.ToString();
</span><span style="color:#008080;"> 62</span>                     <span style="color:#0000ff;">return</span><span style="color:#000000;"> response;
</span><span style="color:#008080;"> 63</span> <span style="color:#000000;">                }
</span><span style="color:#008080;"> 64</span> 
<span style="color:#008080;"> 65</span>                 <span style="color:#0000ff;">foreach</span> (Match item <span style="color:#0000ff;">in</span><span style="color:#000000;"> rgs)
</span><span style="color:#008080;"> 66</span> <span style="color:#000000;">                {
</span><span style="color:#008080;"> 67</span> 
<span style="color:#008080;"> 68</span>                     <span style="color:#0000ff;">var</span> article = <span style="color:#0000ff;">new</span><span style="color:#000000;"> MoArticle();
</span><span style="color:#008080;"> 69</span> 
<span style="color:#008080;"> 70</span>                     article.Author = item.Groups[<span style="color:#800000;">"</span><span style="color:#800000;">author</span><span style="color:#800000;">"</span><span style="color:#000000;">].Value;
</span><span style="color:#008080;"> 71</span>                     article.LinkUrl = item.Groups[<span style="color:#800000;">"</span><span style="color:#800000;">link</span><span style="color:#800000;">"</span><span style="color:#000000;">].Value;
</span><span style="color:#008080;"> 72</span>                     article.Title = item.Groups[<span style="color:#800000;">"</span><span style="color:#800000;">title</span><span style="color:#800000;">"</span><span style="color:#000000;">].Value;
</span><span style="color:#008080;"> 73</span>                     article.PublishTime = item.Groups[<span style="color:#800000;">"</span><span style="color:#800000;">publishtime</span><span style="color:#800000;">"</span><span style="color:#000000;">].Value;
</span><span style="color:#008080;"> 74</span>                   <span style="color:#008000;">//</span><span style="color:#008000;">  article.Des = item.Groups["des"].Value;</span>
<span style="color:#008080;"> 75</span>                     article.DataType = (<span style="color:#0000ff;">int</span><span style="color:#000000;">)EHelper.DataType.博客园;
</span><span style="color:#008080;"> 76</span> 
<span style="color:#008080;"> 77</span>                     <span style="color:#0000ff;">if</span> (response.MoArticles.Count > <span style="color:#800080;">5</span>) { <span style="color:#0000ff;">continue</span><span style="color:#000000;">; }
</span><span style="color:#008080;"> 78</span> <span style="color:#000000;">                    response.MoArticles.Add(article);
</span><span style="color:#008080;"> 79</span> <span style="color:#000000;">                }
</span><span style="color:#008080;"> 80</span> 
<span style="color:#008080;"> 81</span>                 response.IsSuccess = <span style="color:#0000ff;">true</span><span style="color:#000000;">;
</span><span style="color:#008080;"> 82</span>                 <span style="color:#0000ff;">#endregion</span>
<span style="color:#008080;"> 83</span> <span style="color:#000000;">            }
</span><span style="color:#008080;"> 84</span>             <span style="color:#0000ff;">catch</span><span style="color:#000000;"> (Exception ex)
</span><span style="color:#008080;"> 85</span> <span style="color:#000000;">            {
</span><span style="color:#008080;"> 86</span> 
<span style="color:#008080;"> 87</span>                 sbLog.AppendFormat(<span style="color:#800000;">"</span><span style="color:#800000;">异常信息:{0}\n</span><span style="color:#800000;">"</span><span style="color:#000000;">, ex.Message);
</span><span style="color:#008080;"> 88</span>                 response.ErrorCode = (<span style="color:#0000ff;">int</span><span style="color:#000000;">)EHelper.PmException.获取数据异常;
</span><span style="color:#008080;"> 89</span>                 response.ErrorMsg =<span style="color:#000000;"> EHelper.PmException.获取数据异常.ToString();
</span><span style="color:#008080;"> 90</span> <span style="color:#000000;">            }
</span><span style="color:#008080;"> 91</span>             <span style="color:#0000ff;">finally</span>
<span style="color:#008080;"> 92</span> <span style="color:#000000;">            {
</span><span style="color:#008080;"> 93</span> 
<span style="color:#008080;"> 94</span>                 <span style="color:#0000ff;">#region</span> 第三方原始信息-日志
<span style="color:#008080;"> 95</span> 
<span style="color:#008080;"> 96</span>                 <span style="color:#008000;">//</span><span style="color:#008000;">PublicClass._WriteLog(sbLog.ToString(), "Cnblogs");</span>
<span style="color:#008080;"> 97</span> 
<span style="color:#008080;"> 98</span>                 <span style="color:#0000ff;">#endregion</span>
<span style="color:#008080;"> 99</span> <span style="color:#000000;">            }
</span><span style="color:#008080;">100</span>             <span style="color:#0000ff;">return</span><span style="color:#000000;"> response;
</span><span style="color:#008080;">101</span> <span style="color:#000000;">        }
</span><span style="color:#008080;">102</span>         <span style="color:#0000ff;">#endregion</span>
<span style="color:#008080;">103</span>     }</pre> 
    </div> 
    <span class="cnblogs_code_collapse">View Code</span> 
   </div> 
   <p>    .注意这里使用 : base("")直接继承了上面说的父类的方法,来初始化配置信息(当然这个可能不算知识点)</p> 
   <p>    .接下来就是实现的_GetArticles方法里面PublicClass._HttpGet方法封装的HttpClient获取博客园的数据</p> 
   <p>    .解析了返回的数据信息(这里使用的正则,可能有些同学觉得正则可能还不太熟悉,可以自行百度参考分析下)</p> 
   <p>    .记录日志,我这里是记录的文本日志暂时注释了,因为怕抓取的信息多,忘记删除占用空间</p> 
   <p>    以上几点就是实际情况中经常遇到的步奏,这个处理步奏在从来没有对接过第三方接口的人还是值得学习的</p> 
   <p>    2.HuJiangClass类是抓取了博客园中.Net第一页的数据,步奏和方法和上面相同,请关注代码部分</p> 
   <div class="cnblogs_code"> 
    <img id="code_img_closed_6630b4dc-1feb-4ba0-97a6-c86edcf0fad4" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> 
    <img id="code_img_opened_6630b4dc-1feb-4ba0-97a6-c86edcf0fad4" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> 
    <div id="cnblogs_code_open_6630b4dc-1feb-4ba0-97a6-c86edcf0fad4" class="cnblogs_code_hide"> 
     <pre><span style="color:#008080;">  1</span>     <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span><span style="color:#000000;"> HuJiangClass : BaseClass
</span><span style="color:#008080;">  2</span> <span style="color:#000000;">    {
</span><span style="color:#008080;">  3</span>         <span style="color:#808080;">///</span> <span style="color:#808080;"><summary></span>
<span style="color:#008080;">  4</span>         <span style="color:#808080;">///</span><span style="color:#008000;"> 初始化xml配置
</span><span style="color:#008080;">  5</span>         <span style="color:#808080;">///</span> <span style="color:#808080;"></summary></span>
<span style="color:#008080;">  6</span>         <span style="color:#0000ff;">public</span> HuJiangClass() : <span style="color:#0000ff;">base</span>(<span style="color:#800000;">""</span><span style="color:#000000;">) { }
</span><span style="color:#008080;">  7</span> 
<span style="color:#008080;">  8</span> 
<span style="color:#008080;">  9</span>         <span style="color:#0000ff;">#region</span>  获取文章信息 _GetArticles  +BaseResponse
<span style="color:#008080;"> 10</span> 
<span style="color:#008080;"> 11</span>         <span style="color:#808080;">///</span> <span style="color:#808080;"><summary></span>
<span style="color:#008080;"> 12</span>         <span style="color:#808080;">///</span><span style="color:#008000;"> 获取文章信息
</span><span style="color:#008080;"> 13</span>         <span style="color:#808080;">///</span> <span style="color:#808080;"></summary></span>
<span style="color:#008080;"> 14</span>         <span style="color:#808080;">///</span> <span style="color:#808080;"><param name="request"></param></span>
<span style="color:#008080;"> 15</span>         <span style="color:#808080;">///</span> <span style="color:#808080;"><returns></returns></span>
<span style="color:#008080;"> 16</span>         <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">override</span> MoArticlesResponse _GetArticles(<span style="color:#0000ff;">object</span><span style="color:#000000;"> obj)
</span><span style="color:#008080;"> 17</span> <span style="color:#000000;">        {
</span><span style="color:#008080;"> 18</span>             <span style="color:#0000ff;">#region</span> 初始化信息
<span style="color:#008080;"> 19</span> 
<span style="color:#008080;"> 20</span>             <span style="color:#0000ff;">var</span> request = <span style="color:#0000ff;">new</span><span style="color:#000000;"> MoArticlesRequest();
</span><span style="color:#008080;"> 21</span>             <span style="color:#0000ff;">var</span> response = <span style="color:#0000ff;">new</span><span style="color:#000000;"> MoArticlesResponse();
</span><span style="color:#008080;"> 22</span>             <span style="color:#0000ff;">var</span> sbLog = <span style="color:#0000ff;">new</span> StringBuilder(<span style="color:#0000ff;">string</span><span style="color:#000000;">.Empty);
</span><span style="color:#008080;"> 23</span>             <span style="color:#0000ff;">var</span> url = <span style="color:#0000ff;">this</span>.Config.Url;   <span style="color:#008000;">//</span><span style="color:#008000;">这里获取配置文件的url</span>
<span style="color:#008080;"> 24</span>             <span style="color:#0000ff;">#endregion</span>
<span style="color:#008080;"> 25</span> 
<span style="color:#008080;"> 26</span>             <span style="color:#0000ff;">try</span>
<span style="color:#008080;"> 27</span> <span style="color:#000000;">            {
</span><span style="color:#008080;"> 28</span> 
<span style="color:#008080;"> 29</span>                 <span style="color:#0000ff;">#region</span> 接口验证数据
<span style="color:#008080;"> 30</span> 
<span style="color:#008080;"> 31</span>                 request = obj <span style="color:#0000ff;">as</span><span style="color:#000000;"> MoArticlesRequest;
</span><span style="color:#008080;"> 32</span>                 <span style="color:#0000ff;">if</span> (request == <span style="color:#0000ff;">null</span><span style="color:#000000;">)
</span><span style="color:#008080;"> 33</span> <span style="color:#000000;">                {
</span><span style="color:#008080;"> 34</span> 
<span style="color:#008080;"> 35</span>                     response.ErrorCode = (<span style="color:#0000ff;">int</span><span style="color:#000000;">)EHelper.PmException.获取数据为空;
</span><span style="color:#008080;"> 36</span>                     response.ErrorMsg =<span style="color:#000000;"> EHelper.PmException.获取数据为空.ToString();
</span><span style="color:#008080;"> 37</span>                     <span style="color:#0000ff;">return</span><span style="color:#000000;"> response;
</span><span style="color:#008080;"> 38</span> <span style="color:#000000;">                }
</span><span style="color:#008080;"> 39</span> 
<span style="color:#008080;"> 40</span>                 <span style="color:#0000ff;">#endregion</span>
<span style="color:#008080;"> 41</span> 
<span style="color:#008080;"> 42</span>                 <span style="color:#0000ff;">#region</span> 请求数据
<span style="color:#008080;"> 43</span> 
<span style="color:#008080;"> 44</span>                 sbLog.AppendFormat(<span style="color:#800000;">"</span><span style="color:#800000;">请求地址:{0}\n</span><span style="color:#800000;">"</span><span style="color:#000000;">, url);
</span><span style="color:#008080;"> 45</span>                 <span style="color:#0000ff;">var</span> result = PublicClass._HttpGet(url);   <span style="color:#008000;">//</span><span style="color:#008000;">这里一般都是post数据到第三方接口,测试没有第三方可以使用,所以使用抓取博客园首页数据</span>
<span style="color:#008080;"> 46</span>                 sbLog.AppendFormat(<span style="color:#800000;">"</span><span style="color:#800000;">返回信息:{0}\n</span><span style="color:#800000;">"</span><span style="color:#000000;">, result);
</span><span style="color:#008080;"> 47</span>                 <span style="color:#0000ff;">#endregion</span>
<span style="color:#008080;"> 48</span> 
<span style="color:#008080;"> 49</span>                 <span style="color:#0000ff;">#region</span> 解析
<span style="color:#008080;"> 50</span> 
<span style="color:#008080;"> 51</span>                 <span style="color:#008000;">//</span><span style="color:#008000;">使用正则解析数据</span>
<span style="color:#008080;"> 52</span>                 <span style="color:#0000ff;">var</span> rgs = Regex.Matches(result, <span style="color:#800000;">"</span><span style="color:#800000;">class=\"titlelnk\"\\s+href=\"(?<link>http://www(\\w|\\.|\\/)+\\.html)\"[^>]+>(?<title>[^<]+)<\\/a>[^D]+post_item_summary\">(?<des>[^<]+)[^D]+lightblue\">(?<author>\\w+)<\\/a>[^D]+发布于(?<publishtime>\\s+(\\d|-|\\s|:)+)[^<]+</span><span style="color:#800000;">"</span><span style="color:#000000;">);
</span><span style="color:#008080;"> 53</span> 
<span style="color:#008080;"> 54</span>                 <span style="color:#0000ff;">if</span> (rgs.Count <= <span style="color:#800080;">0</span><span style="color:#000000;">)
</span><span style="color:#008080;"> 55</span> <span style="color:#000000;">                {
</span><span style="color:#008080;"> 56</span> 
<span style="color:#008080;"> 57</span>                     response.ErrorCode = (<span style="color:#0000ff;">int</span><span style="color:#000000;">)EHelper.PmException.获取数据为空;
</span><span style="color:#008080;"> 58</span>                     response.ErrorMsg =<span style="color:#000000;"> EHelper.PmException.获取数据为空.ToString();
</span><span style="color:#008080;"> 59</span>                     <span style="color:#0000ff;">return</span><span style="color:#000000;"> response;
</span><span style="color:#008080;"> 60</span> <span style="color:#000000;">                }
</span><span style="color:#008080;"> 61</span> 
<span style="color:#008080;"> 62</span>                 <span style="color:#0000ff;">foreach</span> (Match item <span style="color:#0000ff;">in</span><span style="color:#000000;"> rgs)
</span><span style="color:#008080;"> 63</span> <span style="color:#000000;">                {
</span><span style="color:#008080;"> 64</span> 
<span style="color:#008080;"> 65</span>                     <span style="color:#0000ff;">var</span> article = <span style="color:#0000ff;">new</span><span style="color:#000000;"> MoArticle();
</span><span style="color:#008080;"> 66</span> 
<span style="color:#008080;"> 67</span>                     article.Author = item.Groups[<span style="color:#800000;">"</span><span style="color:#800000;">author</span><span style="color:#800000;">"</span><span style="color:#000000;">].Value;
</span><span style="color:#008080;"> 68</span>                     article.LinkUrl = item.Groups[<span style="color:#800000;">"</span><span style="color:#800000;">link</span><span style="color:#800000;">"</span><span style="color:#000000;">].Value;
</span><span style="color:#008080;"> 69</span>                     article.Title = item.Groups[<span style="color:#800000;">"</span><span style="color:#800000;">title</span><span style="color:#800000;">"</span><span style="color:#000000;">].Value;
</span><span style="color:#008080;"> 70</span>                     article.PublishTime = item.Groups[<span style="color:#800000;">"</span><span style="color:#800000;">publishtime</span><span style="color:#800000;">"</span><span style="color:#000000;">].Value;
</span><span style="color:#008080;"> 71</span>                    <span style="color:#008000;">//</span><span style="color:#008000;"> article.Des = item.Groups["des"].Value;</span>
<span style="color:#008080;"> 72</span>                     article.DataType = (<span style="color:#0000ff;">int</span><span style="color:#000000;">)EHelper.DataType.博客园NET技术;
</span><span style="color:#008080;"> 73</span>                     <span style="color:#0000ff;">if</span> (response.MoArticles.Count > <span style="color:#800080;">5</span>) { <span style="color:#0000ff;">continue</span><span style="color:#000000;">; }
</span><span style="color:#008080;"> 74</span> <span style="color:#000000;">                    response.MoArticles.Add(article);
</span><span style="color:#008080;"> 75</span> <span style="color:#000000;">                }
</span><span style="color:#008080;"> 76</span> 
<span style="color:#008080;"> 77</span>                 response.IsSuccess = <span style="color:#0000ff;">true</span><span style="color:#000000;">;
</span><span style="color:#008080;"> 78</span>                 <span style="color:#0000ff;">#endregion</span>
<span style="color:#008080;"> 79</span> <span style="color:#000000;">            }
</span><span style="color:#008080;"> 80</span>             <span style="color:#0000ff;">catch</span><span style="color:#000000;"> (Exception ex)
</span><span style="color:#008080;"> 81</span> <span style="color:#000000;">            {
</span><span style="color:#008080;"> 82</span> 
<span style="color:#008080;"> 83</span>                 sbLog.AppendFormat(<span style="color:#800000;">"</span><span style="color:#800000;">异常信息:{0}\n</span><span style="color:#800000;">"</span><span style="color:#000000;">, ex.Message);
</span><span style="color:#008080;"> 84</span>                 response.ErrorCode = (<span style="color:#0000ff;">int</span><span style="color:#000000;">)EHelper.PmException.获取数据异常;
</span><span style="color:#008080;"> 85</span>                 response.ErrorMsg =<span style="color:#000000;"> EHelper.PmException.获取数据异常.ToString();
</span><span style="color:#008080;"> 86</span> <span style="color:#000000;">            }
</span><span style="color:#008080;"> 87</span>             <span style="color:#0000ff;">finally</span>
<span style="color:#008080;"> 88</span> <span style="color:#000000;">            {
</span><span style="color:#008080;"> 89</span> 
<span style="color:#008080;"> 90</span>                 <span style="color:#0000ff;">#region</span> 第三方原始信息-日志
<span style="color:#008080;"> 91</span> 
<span style="color:#008080;"> 92</span>                 <span style="color:#008000;">//</span><span style="color:#008000;">PublicClass._WriteLog(sbLog.ToString(), "Cnblogs");</span>
<span style="color:#008080;"> 93</span> 
<span style="color:#008080;"> 94</span>                 <span style="color:#0000ff;">#endregion</span>
<span style="color:#008080;"> 95</span> <span style="color:#000000;">            }
</span><span style="color:#008080;"> 96</span>             <span style="color:#0000ff;">return</span><span style="color:#000000;"> response;
</span><span style="color:#008080;"> 97</span> <span style="color:#000000;">        }
</span><span style="color:#008080;"> 98</span>         <span style="color:#0000ff;">#endregion</span>
<span style="color:#008080;"> 99</span> 
<span style="color:#008080;">100</span>     }</pre> 
    </div> 
    <span class="cnblogs_code_collapse">View Code</span> 
   </div> 
   <p>  D.今天要讲的主要内容来了,以上算是过度,让人了解对接第三方接口的一些处理步奏和简单的封装吧;这里将看到的是Pm.Api.Controllers空间下BlogsController里面的Post方法,代码如:</p> 
   <div class="cnblogs_code"> 
    <img id="code_img_closed_5df28404-02e8-4c0b-b3b5-1243f18ff378" class="code_img_closed" src="http://img.e-com-net.com/image/info8/b8d97b5613f94ed2ba791cad57d0b2ed.gif" alt="" width="0" height="0"> 
    <img id="code_img_opened_5df28404-02e8-4c0b-b3b5-1243f18ff378" class="code_img_opened" src="http://img.e-com-net.com/image/info8/2f88dd3f1cd145f59c0e47b51acdbd4b.gif" alt="" width="0" height="0"> 
    <div id="cnblogs_code_open_5df28404-02e8-4c0b-b3b5-1243f18ff378" class="cnblogs_code_hide"> 
     <pre><span style="color:#008080;">  1</span>  <span style="color:#008000;">//</span><span style="color:#008000;"> GET api/<controller></span>
<span style="color:#008080;">  2</span>         <span style="color:#0000ff;">public</span> IEnumerable<<span style="color:#0000ff;">string</span>><span style="color:#000000;"> Get()
</span><span style="color:#008080;">  3</span> <span style="color:#000000;">        {
</span><span style="color:#008080;">  4</span>             <span style="color:#0000ff;">return</span> <span style="color:#0000ff;">new</span> <span style="color:#0000ff;">string</span>[] { <span style="color:#800000;">"</span><span style="color:#800000;">欢迎使用-神牛步行3开源框架</span><span style="color:#800000;">"</span><span style="color:#000000;"> };
</span><span style="color:#008080;">  5</span> <span style="color:#000000;">        }
</span><span style="color:#008080;">  6</span> 
<span style="color:#008080;">  7</span>         <span style="color:#008000;">//</span><span style="color:#008000;"> POST api/<controller></span>
<span style="color:#008080;">  8</span>         <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">async</span> Task<HttpResponseMessage><span style="color:#000000;"> Post()
</span><span style="color:#008080;">  9</span> <span style="color:#000000;">        {
</span><span style="color:#008080;"> 10</span>             HttpResponseMessage response = <span style="color:#0000ff;">new</span><span style="color:#000000;"> HttpResponseMessage();
</span><span style="color:#008080;"> 11</span>             <span style="color:#0000ff;">var</span> baseResponse = <span style="color:#0000ff;">new</span><span style="color:#000000;"> BaseResponse();
</span><span style="color:#008080;"> 12</span>             <span style="color:#0000ff;">try</span>
<span style="color:#008080;"> 13</span> <span style="color:#000000;">            {
</span><span style="color:#008080;"> 14</span>                 <span style="color:#0000ff;">#region</span> 验证
<span style="color:#008080;"> 15</span> 
<span style="color:#008080;"> 16</span>                 <span style="color:#008000;">//</span><span style="color:#008000;">获取post数据</span>
<span style="color:#008080;"> 17</span>                 HttpContent content =<span style="color:#000000;"> Request.Content;
</span><span style="color:#008080;"> 18</span>                 <span style="color:#0000ff;">var</span> param = <span style="color:#0000ff;">await</span><span style="color:#000000;"> content.ReadAsStringAsync();
</span><span style="color:#008080;"> 19</span>                 <span style="color:#0000ff;">var</span> baseRequest = Newtonsoft.Json.JsonConvert.DeserializeObject<BaseRequest><span style="color:#000000;">(param);
</span><span style="color:#008080;"> 20</span>                 <span style="color:#0000ff;">if</span> (<span style="color:#0000ff;">string</span><span style="color:#000000;">.IsNullOrEmpty(baseRequest.FunName))
</span><span style="color:#008080;"> 21</span> <span style="color:#000000;">                {
</span><span style="color:#008080;"> 22</span>                     baseResponse.ErrorMsg =<span style="color:#000000;"> EHelper.PmException.请求参数为空.ToString();
</span><span style="color:#008080;"> 23</span>                     baseResponse.ErrorCode = (<span style="color:#0000ff;">int</span><span style="color:#000000;">)EHelper.PmException.请求参数为空;
</span><span style="color:#008080;"> 24</span>                     response.Content = <span style="color:#0000ff;">new</span> StringContent(<span style="color:#0000ff;">await</span><span style="color:#000000;"> JsonConvert.SerializeObjectAsync(baseResponse));
</span><span style="color:#008080;"> 25</span>                     <span style="color:#0000ff;">return</span><span style="color:#000000;"> response;
</span><span style="color:#008080;"> 26</span> <span style="color:#000000;">                }
</span><span style="color:#008080;"> 27</span>                 <span style="color:#0000ff;">else</span> <span style="color:#0000ff;">if</span> (<span style="color:#0000ff;">string</span><span style="color:#000000;">.IsNullOrEmpty(baseRequest.UserName))
</span><span style="color:#008080;"> 28</span> <span style="color:#000000;">                {
</span><span style="color:#008080;"> 29</span> 
<span style="color:#008080;"> 30</span>                     baseResponse.ErrorMsg =<span style="color:#000000;"> EHelper.PmException.账号不正确.ToString();
</span><span style="color:#008080;"> 31</span>                     baseResponse.ErrorCode = (<span style="color:#0000ff;">int</span><span style="color:#000000;">)EHelper.PmException.账号不正确;
</span><span style="color:#008080;"> 32</span>                     response.Content = <span style="color:#0000ff;">new</span> StringContent(<span style="color:#0000ff;">await</span><span style="color:#000000;"> JsonConvert.SerializeObjectAsync(baseResponse));
</span><span style="color:#008080;"> 33</span>                     <span style="color:#0000ff;">return</span><span style="color:#000000;"> response;
</span><span style="color:#008080;"> 34</span> <span style="color:#000000;">                }
</span><span style="color:#008080;"> 35</span>                 <span style="color:#0000ff;">else</span> <span style="color:#0000ff;">if</span> (!Enum.IsDefined(<span style="color:#0000ff;">typeof</span><span style="color:#000000;">(EHelper.DataType), baseRequest.DataType))
</span><span style="color:#008080;"> 36</span> <span style="color:#000000;">                {
</span><span style="color:#008080;"> 37</span>                     baseResponse.ErrorMsg =<span style="color:#000000;"> EHelper.PmException.参数不合法.ToString();
</span><span style="color:#008080;"> 38</span>                     baseResponse.ErrorCode = (<span style="color:#0000ff;">int</span><span style="color:#000000;">)EHelper.PmException.参数不合法;
</span><span style="color:#008080;"> 39</span>                     response.Content = <span style="color:#0000ff;">new</span> StringContent(<span style="color:#0000ff;">await</span><span style="color:#000000;"> JsonConvert.SerializeObjectAsync(baseResponse));
</span><span style="color:#008080;"> 40</span>                     <span style="color:#0000ff;">return</span><span style="color:#000000;"> response;
</span><span style="color:#008080;"> 41</span> <span style="color:#000000;">                }
</span><span style="color:#008080;"> 42</span>                 <span style="color:#008000;">//</span><span style="color:#008000;">验证账号及token</span>
<span style="color:#008080;"> 43</span> 
<span style="color:#008080;"> 44</span>                 <span style="color:#0000ff;">#endregion</span>
<span style="color:#008080;"> 45</span> 
<span style="color:#008080;"> 46</span>                 <span style="color:#0000ff;">#region</span> 业务
<span style="color:#008080;"> 47</span> 
<span style="color:#008080;"> 48</span>                 <span style="color:#0000ff;">var</span> dataTypes = Enum.GetValues(<span style="color:#0000ff;">typeof</span><span style="color:#000000;">(EHelper.DataType));
</span><span style="color:#008080;"> 49</span>                 <span style="color:#0000ff;">switch</span><span style="color:#000000;"> (baseRequest.FunName)
</span><span style="color:#008080;"> 50</span> <span style="color:#000000;">                {
</span><span style="color:#008080;"> 51</span>                     <span style="color:#008000;">//</span><span style="color:#008000;">获取文章集合信息</span>
<span style="color:#008080;"> 52</span>                     <span style="color:#0000ff;">case</span> <span style="color:#800000;">"</span><span style="color:#800000;">_GetArticles</span><span style="color:#800000;">"</span><span style="color:#000000;">:
</span><span style="color:#008080;"> 53</span> 
<span style="color:#008080;"> 54</span>                         <span style="color:#008000;">//</span><span style="color:#008000;">json反序列获取数据</span>
<span style="color:#008080;"> 55</span>                         <span style="color:#0000ff;">var</span> r_GetArticles = Newtonsoft.Json.JsonConvert.DeserializeObject<MoArticlesRequest><span style="color:#000000;">(param);
</span><span style="color:#008080;"> 56</span> 
<span style="color:#008080;"> 57</span>                         <span style="color:#008000;">//</span><span style="color:#008000;">初始化任务量</span>
<span style="color:#008080;"> 58</span>                         <span style="color:#0000ff;">var</span> tasks = <span style="color:#0000ff;">new</span> Task<MoArticlesResponse>[baseRequest.DataType == <span style="color:#800080;">0</span> ? dataTypes.Length : <span style="color:#800080;">1</span><span style="color:#000000;">];
</span><span style="color:#008080;"> 59</span>                         <span style="color:#0000ff;">var</span> proxy = <span style="color:#0000ff;">new</span><span style="color:#000000;"> Pm_Proxy();
</span><span style="color:#008080;"> 60</span>                         <span style="color:#0000ff;">var</span> j = <span style="color:#800080;">0</span>;  <span style="color:#008000;">//</span><span style="color:#008000;">真实任务坐标</span>
<span style="color:#008080;"> 61</span>                         <span style="color:#0000ff;">for</span> (<span style="color:#0000ff;">int</span> i = <span style="color:#800080;">0</span>; i < dataTypes.Length; i++<span style="color:#000000;">)
</span><span style="color:#008080;"> 62</span> <span style="color:#000000;">                        {
</span><span style="color:#008080;"> 63</span>                             <span style="color:#0000ff;">var</span> item =<span style="color:#000000;"> dataTypes.GetValue(i);
</span><span style="color:#008080;"> 64</span>                             <span style="color:#0000ff;">var</span> nType =<span style="color:#000000;"> Convert.ToInt32(item);
</span><span style="color:#008080;"> 65</span>                             <span style="color:#0000ff;">if</span> (nType != baseRequest.DataType && <span style="color:#800080;">0</span> != baseRequest.DataType) { <span style="color:#0000ff;">continue</span><span style="color:#000000;">; }
</span><span style="color:#008080;"> 66</span> 
<span style="color:#008080;"> 67</span>                             <span style="color:#008000;">//</span><span style="color:#008000;">使用任务做并行</span>
<span style="color:#008080;"> 68</span>                             <span style="color:#0000ff;">var</span> dataType =<span style="color:#000000;"> proxy._DataType(nType);
</span><span style="color:#008080;"> 69</span>                             <span style="color:#0000ff;">var</span> task = Task.Factory.StartNew<MoArticlesResponse><span style="color:#000000;">(dataType._GetArticles, r_GetArticles);
</span><span style="color:#008080;"> 70</span>                             tasks[j] =<span style="color:#000000;"> task;
</span><span style="color:#008080;"> 71</span>                             j++<span style="color:#000000;">;
</span><span style="color:#008080;"> 72</span> <span style="color:#000000;">                        }
</span><span style="color:#008080;"> 73</span>                         <span style="color:#008000;">//</span><span style="color:#008000;">30s等待</span>
<span style="color:#008080;"> 74</span>                         Task.WaitAll(tasks, <span style="color:#800080;">1000</span> * <span style="color:#800080;">1</span> * <span style="color:#800080;">30</span><span style="color:#000000;">);
</span><span style="color:#008080;"> 75</span> 
<span style="color:#008080;"> 76</span>                         <span style="color:#008000;">//</span><span style="color:#008000;">获取任务执行的结果(整合数据)</span>
<span style="color:#008080;"> 77</span>                         <span style="color:#0000ff;">var</span> articles = <span style="color:#0000ff;">new</span><span style="color:#000000;"> MoArticlesResponse();
</span><span style="color:#008080;"> 78</span>                         <span style="color:#0000ff;">foreach</span> (<span style="color:#0000ff;">var</span> task <span style="color:#0000ff;">in</span><span style="color:#000000;"> tasks)
</span><span style="color:#008080;"> 79</span> <span style="color:#000000;">                        {
</span><span style="color:#008080;"> 80</span>                             <span style="color:#0000ff;">if</span> (!task.IsCompleted) { <span style="color:#0000ff;">continue</span><span style="color:#000000;">; }
</span><span style="color:#008080;"> 81</span> <span style="color:#000000;">                            articles.MoArticles.AddRange(task.Result.MoArticles);
</span><span style="color:#008080;"> 82</span> <span style="color:#000000;">                        }
</span><span style="color:#008080;"> 83</span> 
<span style="color:#008080;"> 84</span>                         articles.IsSuccess = articles.MoArticles.Count > <span style="color:#800080;">0</span><span style="color:#000000;">;
</span><span style="color:#008080;"> 85</span>                         baseResponse =<span style="color:#000000;"> articles;
</span><span style="color:#008080;"> 86</span>                         <span style="color:#0000ff;">break</span><span style="color:#000000;">;
</span><span style="color:#008080;"> 87</span> 
<span style="color:#008080;"> 88</span>                     <span style="color:#0000ff;">default</span><span style="color:#000000;">:
</span><span style="color:#008080;"> 89</span>                         <span style="color:#0000ff;">break</span><span style="color:#000000;">;
</span><span style="color:#008080;"> 90</span> <span style="color:#000000;">                }
</span><span style="color:#008080;"> 91</span>                 response.Content = <span style="color:#0000ff;">new</span> StringContent(<span style="color:#0000ff;">await</span><span style="color:#000000;"> JsonConvert.SerializeObjectAsync(baseResponse));
</span><span style="color:#008080;"> 92</span>                 <span style="color:#0000ff;">#endregion</span>
<span style="color:#008080;"> 93</span> <span style="color:#000000;">            }
</span><span style="color:#008080;"> 94</span>             <span style="color:#0000ff;">catch</span><span style="color:#000000;"> (Exception ex)
</span><span style="color:#008080;"> 95</span> <span style="color:#000000;">            {
</span><span style="color:#008080;"> 96</span>                 baseResponse.ErrorMsg =<span style="color:#000000;"> EHelper.PmException.获取数据异常.ToString();
</span><span style="color:#008080;"> 97</span>                 baseResponse.ErrorCode = (<span style="color:#0000ff;">int</span><span style="color:#000000;">)EHelper.PmException.获取数据异常;
</span><span style="color:#008080;"> 98</span> <span style="color:#000000;">            }
</span><span style="color:#008080;"> 99</span>             <span style="color:#0000ff;">return</span><span style="color:#000000;"> response;
</span><span style="color:#008080;">100</span>         }</pre> 
    </div> 
    <span class="cnblogs_code_collapse">View Code</span> 
   </div> 
   <p>    1.首先使用了var baseRequest = Newtonsoft.Json.JsonConvert.DeserializeObject<BaseRequest>(param); 来第一次返序列化,得到验证的基本信息如账号,token等</p> 
   <p>    2.常用的接口形式使用参数节点名称来确定将要执行的方法,或者直接在节点值中标注方法的名称,因此有了这么一句switch (baseRequest.FunName)来判断程序的走向</p> 
   <p>    3.在此反序列得到真实调用者post给接口的数据(上面第一次反序列使用的是基类,基类里面就包含了验证需要的属性,为什么这里不直接使用第一次反序列的对象呢,因为这里将要传递给后面方法参数的值是子类里面封装的)</p> 
   <p>    4.开始定义Task任务的数量,一般根据有几个第三方接口第一几个吧,Task<MoArticlesResponse>[]保证后面产生的任务量</p> 
   <p>    5.Task.Factory.StartNew<MoArticlesResponse>(dataType._GetArticles, r_GetArticles) 方法来创建任务,这里要说的是dataType._GetArticles是之前上面说的请求第三方接口定义的方法,r_GetArticles这个是需要传递的值是object的,这也是StartNew固定的参数类型;再通过Task<MoArticlesResponse>[]存储创建的任务;</p> 
   <p>    6.Task.WaitAll(tasks, 1000 * 1 * 30);这个WaitAll是自带的,意思是等待任务执行多少毫秒,也算是知识点吧,第一个参数是任务数组,是数组的形式,第二个是毫秒单位的等待时间</p> 
   <p>    7.最后通过foreach (var task in tasks) 来循环整合task.Result返回的结果</p> 
   <p> 之后是效果截图DataType表示不同的数据来源:</p> 
   <p> <a href="http://img.e-com-net.com/image/info8/8e5f664ac2d041c59a1219848e6f36cb.png" target="_blank"><img src="http://img.e-com-net.com/image/info8/8e5f664ac2d041c59a1219848e6f36cb.png" alt="webapi+Task并行请求不同接口实例_第2张图片" width="561" height="777" style="border:1px solid black;"></a></p> 
   <p> </p> 
   <p>  大致就是这些吧,不知道说的东西是否说明白了,这就是处理对接第三方不同接口的业务逻辑,也是使用task来并行处理的方法;如果有朋友觉得可能说的不太好或者有什么错误地方,还请直接发博客信息,谢谢;</p> 
   <p>  源码地址:https://github.com/shenniubuxing3/Niu.Pm</p> 
   <p> </p> 
  </div> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1296324693510397952"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(webapi+Task并行请求不同接口实例)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1950230114205757440.htm"
                           title="现在发挥你的优势" target="_blank">现在发挥你的优势</a>
                        <span class="text-muted">爱生活的佑嘉</span>

                        <div>来和我做咨询的一些朋友,涉及到定位的,都会说,我不知道我的优势是什么,你能不能帮我看看?还有一些朋友,喜欢做各种测试来了解自己,测试过后,然并卵。今天,我想来聊聊优势,如何能了解自己的优势是什么。首先,我们要知道,如果要成为“不一般”的人,我们所做的事情,就要基于自身的优势。我做管理者十多年,看到每个员工都有不同的特长,有的擅长数字,有的擅长人际,有的擅长写作。这些知道自己优势并且在这方面刻意练习</div>
                    </li>
                    <li><a href="/article/1950229922647699456.htm"
                           title="实时数据流计算引擎Flink和Spark剖析" target="_blank">实时数据流计算引擎Flink和Spark剖析</a>
                        <span class="text-muted">程小舰</span>
<a class="tag" taget="_blank" href="/search/flink/1.htm">flink</a><a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/kafka/1.htm">kafka</a><a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a>
                        <div>在过去几年,业界的主流流计算引擎大多采用SparkStreaming,随着近两年Flink的快速发展,Flink的使用也越来越广泛。与此同时,Spark针对SparkStreaming的不足,也继而推出了新的流计算组件。本文旨在深入分析不同的流计算引擎的内在机制和功能特点,为流处理场景的选型提供参考。(DLab数据实验室w.x.公众号出品)一.SparkStreamingSparkStreamin</div>
                    </li>
                    <li><a href="/article/1950228285266915328.htm"
                           title="Git 与 GitHub 的对比与使用指南" target="_blank">Git 与 GitHub 的对比与使用指南</a>
                        <span class="text-muted">一念&</span>
<a class="tag" taget="_blank" href="/search/%E5%85%B6%E5%AE%83/1.htm">其它</a><a class="tag" taget="_blank" href="/search/git/1.htm">git</a><a class="tag" taget="_blank" href="/search/github/1.htm">github</a>
                        <div>Git与GitHub的对比与使用指南在软件开发中,Git和GitHub是两个密切相关但本质不同的工具。下面我将逐步解释它们的定义、区别、核心概念以及如何协同使用,确保内容真实可靠,基于广泛的技术实践。1.什么是Git?Git是一个分布式版本控制系统,由LinusTorvalds于2005年创建。它的核心功能是跟踪代码文件的变化,帮助开发者管理项目历史记录、协作和回滚错误。Git是开源的,可以在本地</div>
                    </li>
                    <li><a href="/article/1950228031524106240.htm"
                           title="Spring进阶 - SpringMVC实现原理之DispatcherServlet处理请求的过程" target="_blank">Spring进阶 - SpringMVC实现原理之DispatcherServlet处理请求的过程</a>
                        <span class="text-muted">倾听铃的声</span>
<a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</a>
                        <div>前文我们有了IOC的源码基础以及SpringMVC的基础,我们便可以进一步深入理解SpringMVC主要实现原理,包含DispatcherServlet的初始化过程和DispatcherServlet处理请求的过程的源码解析。本文是第二篇:DispatcherServlet处理请求的过程的源码解析。@pdaiSpring进阶-SpringMVC实现原理之DispatcherServlet处理请求的</div>
                    </li>
                    <li><a href="/article/1950228032513961984.htm"
                           title="ARM 和 AMD 架构的区别" target="_blank">ARM 和 AMD 架构的区别</a>
                        <span class="text-muted">m0_69576880</span>
<a class="tag" taget="_blank" href="/search/arm%E5%BC%80%E5%8F%91/1.htm">arm开发</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a>
                        <div>ARM架构和AMD架构是两种不同的计算机处理器架构,它们有以下几个主要区别:设计出发点、兼容性、性能特点、市场定价。设计出发点:①ARM构架:ARM架构最初是为嵌入式系统设计的,旨在提供低功耗和高效能的解决方案。它主要应用于移动设备、嵌入式系统和物联网设备②AMD架构:AMD架构是基于x86架构的扩展,旨在提供与Intel架构兼容的处理器。它主要用于台式机、服务器和工作站等计算机系统。兼容性:AR</div>
                    </li>
                    <li><a href="/article/1950226011559882752.htm"
                           title="什么是缓存雪崩?缓存击穿?缓存穿透?分别如何解决?什么是缓存预热?" target="_blank">什么是缓存雪崩?缓存击穿?缓存穿透?分别如何解决?什么是缓存预热?</a>
                        <span class="text-muted">daixin8848</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%93%E5%AD%98/1.htm">缓存</a><a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>缓存雪崩:在一个时间段内,有大量的key过期,或者Redis服务宕机,导致大量的请求到达数据库,带来巨大压力-给key设置不同的TTL、利用Redis集群提高服务的高可用性、添加多级缓存、添加降级流策略缓存击穿:给某一个key设置了过期时间,当key过期的时间,恰好这个时间点有大量的并发请求访问这个key,可能会瞬间把数据库压垮-互斥锁:缓存失败时,只允许一个请求去加载数据并更新缓存,其他请求阻塞</div>
                    </li>
                    <li><a href="/article/1950225785054883840.htm"
                           title="Java | 多线程经典问题 - 售票" target="_blank">Java | 多线程经典问题 - 售票</a>
                        <span class="text-muted">Ada54</span>

                        <div>一、售票需求1)同一个票池2)多个窗口卖票,不能出售同一张票二、售票问题代码实现(线程与进程小总结,请戳:Java|线程和进程,创建线程)step1:定义SaleWindow类实现Runnable接口,覆盖run方法step2:实例化SaleWindow对象,创建Thread对象,将SaleWindow作为参数传给Thread类的构造函数,然后通过Thread.start()方法启动线程step3</div>
                    </li>
                    <li><a href="/article/1950225381961297920.htm"
                           title="SpringMVC的执行流程" target="_blank">SpringMVC的执行流程</a>
                        <span class="text-muted"></span>

                        <div>1、什么是MVCMVC是一种设计模式。MVC的原理图如下所示M-Model模型(完成业务逻辑:有javaBean构成,service+dao+entity)V-View视图(做界面的展示jsp,html……)C-Controller控制器(接收请求—>调用模型—>根据结果派发页面2、SpringMVC是什么SpringMVC是一个MVC的开源框架,SpringMVC=Struts2+Spring,</div>
                    </li>
                    <li><a href="/article/1950224745093984256.htm"
                           title="在线人数统计业务设计(场景八股文)" target="_blank">在线人数统计业务设计(场景八股文)</a>
                        <span class="text-muted"></span>

                        <div>业务问题在当经的网站中,在线人数的实时统计已经是一个必不可少的模块了,并且该统计功能最好能够按不同的时间间隔做的统计,现在需要你设计一个在线人数统计的模块,你应该怎么进行设计的呢?背景一个网校下会有多个学员。目前平台大概有十个,平台对应的网校大概五十几个,平均一个网校会有5w个用户,预计总人数为200w,最该学员的在线人数在10w左右。设计思路最开始的时候,想到的就是使用mysql直接实现,但是明</div>
                    </li>
                    <li><a href="/article/1950224616647618560.htm"
                           title="JAVA接口机结构解析" target="_blank">JAVA接口机结构解析</a>
                        <span class="text-muted">秃狼</span>
<a class="tag" taget="_blank" href="/search/SpringBoot/1.htm">SpringBoot</a><a class="tag" taget="_blank" href="/search/%E5%85%AB%E8%82%A1%E6%96%87/1.htm">八股文</a><a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a>
                        <div>什么是接口机在Java项目中,接口机通常指用于与外部系统进行数据交互的中间层,负责处理请求和响应的转换、协议适配、数据格式转换等任务。接口机的结构我们的接口机的结构分为两个大部分,外部接口机和内部接口机,在业务的调度上也是通过mq来实现的,只要的目的就是为了解耦合和做差异化。在接口机中主要的方法就是定时任务,消息的发送和消费,其他平台调用接口机只能提供外部接口机的方法进行调用,外部接口机可以提供消</div>
                    </li>
                    <li><a href="/article/1950224618606358528.htm"
                           title="Aop +反射 实现方法版本动态切换" target="_blank">Aop +反射 实现方法版本动态切换</a>
                        <span class="text-muted"></span>

                        <div>需求分析在做技术选型的时候一直存在着两个声音,mongo作为数据库比较mysql好,mysql做为该数据比mongo好。当然不同数据库都有有着自己的优势,我们在做技术选型的时候无非就是做到对数据库的扬长避短。mysql最大的优势就是支持事务,事务的五大特性保证的业务可靠性,随之而来的就是事务会产生的问题:脏读、幻读、不可重复度,当然我们也会使用不同的隔离级别来解决。(最典型的业务问题:银行存取钱)</div>
                    </li>
                    <li><a href="/article/1950222723200380928.htm"
                           title="LVS+Keepalived实现高可用和负载均衡" target="_blank">LVS+Keepalived实现高可用和负载均衡</a>
                        <span class="text-muted">2401_84412895</span>
<a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/lvs/1.htm">lvs</a><a class="tag" taget="_blank" href="/search/%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1/1.htm">负载均衡</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>2、开启网卡子接口配置VIP[root@a~]#cd/etc/sysconfig/network-scripts/[root@anetwork-scripts]#cp-aifcfg-ens32ifcfg-ens32:0[root@anetwork-scripts]#catifcfg-ens32:0BOOTPROTO=staticDEVICE=ens32:0ONBOOT=yesIPADDR=10.1</div>
                    </li>
                    <li><a href="/article/1950219036667211776.htm"
                           title="你好,2020年" target="_blank">你好,2020年</a>
                        <span class="text-muted">瑄瑄妍妍的妈咪</span>

                        <div>早上好,今天是2020年的第一天,也就是元旦,新年新的一天开始了。新的开始,重新规划未来的一年。从今天开始,用了一个新的记账软件,之前的随手记软件,也没有删除,只是重新下载了一个别的软件,开始一个新的记账旅程,对于理财开支,有个新的规划。通过小红书视频软件,学习了不少育儿知识,和各种不同的美食,以后动手制作,给宝宝做健康美味的营养餐。学习方面,继续学英语吧!虽然是抽出时间学的,进度也比较慢,但是积</div>
                    </li>
                    <li><a href="/article/1950217936077647872.htm"
                           title="Java 队列" target="_blank">Java 队列</a>
                        <span class="text-muted">tryxr</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E9%98%9F%E5%88%97/1.htm">队列</a>
                        <div>队列一般用什么哪种结构实现队列的特性数据入队列时一定是从尾部插入吗数据出队列时一定是从头部删除吗队列的基本运算有什么队列支持随机访问吗队列的英文表示什么是队列队列从哪进、从哪出队列的进出顺序队列是用哪种结构实现的Queue和Deque有什么区别Queue接口的方法Queue中的add与offer的区别offer、poll、peek的模拟实现如何利用链表实现队列如何利用顺序表实现队列什么叫做双端队列</div>
                    </li>
                    <li><a href="/article/1950216170401492992.htm"
                           title="常规笔记本和加固笔记本的区别" target="_blank">常规笔记本和加固笔记本的区别</a>
                        <span class="text-muted">luchengtech</span>
<a class="tag" taget="_blank" href="/search/%E7%94%B5%E8%84%91/1.htm">电脑</a><a class="tag" taget="_blank" href="/search/%E4%B8%89%E9%98%B2%E7%AC%94%E8%AE%B0%E6%9C%AC/1.htm">三防笔记本</a><a class="tag" taget="_blank" href="/search/%E5%8A%A0%E5%9B%BA%E8%AE%A1%E7%AE%97%E6%9C%BA/1.htm">加固计算机</a><a class="tag" taget="_blank" href="/search/%E5%8A%A0%E5%9B%BA%E7%AC%94%E8%AE%B0%E6%9C%AC/1.htm">加固笔记本</a>
                        <div>在现代科技产品中,笔记本电脑因其便携性和功能性被广泛应用。根据使用场景和需求的不同,笔记本可分为常规笔记本和加固笔记本,二者在多个方面存在显著区别。适用场景是区分二者的重要标志。常规笔记本主要面向普通消费者和办公人群,适用于家庭娱乐、日常办公、学生学习等相对稳定的室内环境。比如,人们在家用它追剧、处理文档,学生在教室用它完成作业。而加固笔记本则专为特殊行业设计,像军事、野外勘探、工业制造、交通运输</div>
                    </li>
                    <li><a href="/article/1950214458265628672.htm"
                           title="心力践行营十二期一阶学习打卡" target="_blank">心力践行营十二期一阶学习打卡</a>
                        <span class="text-muted">LX_王彤彤</span>

                        <div>姓名:王彤彤时间:2021年4月24日一:朗读师父的十大人生哲学二:师父的早安分享感悟很喜欢这句话:所有的行动都是基于目标的尝试,没有所谓的失败,只是不同尝试后得到的不同结果,让我们更好地调整下一次的行动。三:感恩日记1.我太幸福了,我很感恩姑姑,因为姑姑放假又投喂了我,还给我带了饺子回家,这让我感觉很幸福。谢谢,谢谢,谢谢。2.我太幸福了,我很感恩师父晚上的直播,因为听他的分享我知道怎么更好的去</div>
                    </li>
                    <li><a href="/article/1950213689143521280.htm"
                           title="社交电商平台有哪些?社交电商怎么做?" target="_blank">社交电商平台有哪些?社交电商怎么做?</a>
                        <span class="text-muted">氧惠评测</span>

                        <div>社交电商平台有很多,以下是一些常见的社交电商平台:氧惠APP是与以往完全不同的抖客+淘客app!2024全新模式,我的直推也会放到你下面。主打:带货高补贴,深受各位带货团队长喜爱(训练营导师每天出单带货几万单)。注册即可享受高补贴+0撸+捡漏等带货新体验。送万元推广大礼包,教你如何1年做到百万团队。珊珊导师氧惠邀请码888999,注册送万元推广大礼包,教你如何1年做到百万团队。氧惠app:氧惠ap</div>
                    </li>
                    <li><a href="/article/1950211901589876736.htm"
                           title="无题" target="_blank">无题</a>
                        <span class="text-muted">回归自然HAO</span>

                        <div>“横看成岭侧成峰,远看高低各不同。"世间的事,对与错,都是站的角度不同,而得出了不同的结论。慨叹故人的寥寥数语,就告诉了世人朴素主义哲学的真意:和谐生存,尊重自然。古人说:读万卷书,行万里路。刻苦读书,回归自然,不会有错。因为书中自有清目剂,自然就是个大讲堂。图片发自App</div>
                    </li>
                    <li><a href="/article/1950210887264563200.htm"
                           title="人不能两次踏进同一条河流" target="_blank">人不能两次踏进同一条河流</a>
                        <span class="text-muted">就是源</span>

                        <div>这是古希腊学家赫拉克利特的名言,在我原先看来就是万事万物都在不断的变化,强调事物的运动性。可后来了解到他还有个徒弟更深的进行了解读,人哪怕一次也不能踏进同一条河流,因为当你踏进的时候,已经不是你最初想的那天河流了。这确实也说明了事物无时无刻不在运动,可感觉毫无意义,如果一切都这样去算,那么每一秒甚至每一个更加微小的时间上都会有一个不同的结论,这根本无法指明生活的方向和解决困顿,只会让人更加困顿。这</div>
                    </li>
                    <li><a href="/article/1950209621381672960.htm"
                           title="Android 应用权限管理详解" target="_blank">Android 应用权限管理详解</a>
                        <span class="text-muted"></span>

                        <div>文章目录1.权限类型2.权限请求机制3.权限组和分级4.权限管理的演进5.权限监控和SELinux强制访问控制6.应用权限审核和GooglePlayProtect7.开发者最佳实践8.用户权限管理9.Android应用沙箱模型10.ScopedStorage(分区存储)11.背景位置权限(BackgroundLocationAccess)12.权限回收和自动清理13.权限请求的用户体验设计14.G</div>
                    </li>
                    <li><a href="/article/1950209238135533568.htm"
                           title="农场种蔬菜赚钱小游戏有哪些 五大可以赚钱的小游戏APP" target="_blank">农场种蔬菜赚钱小游戏有哪些 五大可以赚钱的小游戏APP</a>
                        <span class="text-muted">氧惠帮朋友一起省</span>

                        <div>喜欢种菜吗?我特意带来农场种蔬菜赚钱小游戏排行榜2022,线上汇集了超多模拟种菜玩法,玩家可以免费种植赚钱哦!每天都有大量的种植任务,线上完成就能赚钱哦!快来下载吧!1.氧惠APP购物、看电影、点外卖、用氧惠APP!更优惠!氧惠(全网优惠上氧惠)——是与以往完全不同的抖客+淘客app!2023全新模式,我的直推也会放到你下面,送1:1超级补贴(邀请好友自购多少,你就推广得多少,非常厉害),欢迎各位</div>
                    </li>
                    <li><a href="/article/1950207854388506624.htm"
                           title="深入理解 Tomcat Wrapper 原理" target="_blank">深入理解 Tomcat Wrapper 原理</a>
                        <span class="text-muted">北漂老男人</span>
<a class="tag" taget="_blank" href="/search/Tomcat/1.htm">Tomcat</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>深入理解TomcatWrapper原理一、引言在Tomcat的分层容器架构中,Wrapper作为最底层的容器,专门负责管理单个Servlet的生命周期及请求分发。每一个Servlet(包括JSP、Filter等)都对应一个Wrapper。Wrapper是Servlet规范与Tomcat容器实现之间的桥梁,直接关系到请求的分发效率、Servlet的加载与重用、安全隔离等。本文将系统剖析Wrapper</div>
                    </li>
                    <li><a href="/article/1950207717931020288.htm"
                           title="斗罗大陆:没有魂环的唐三紫极魔瞳加鬼影迷踪战力有多强" target="_blank">斗罗大陆:没有魂环的唐三紫极魔瞳加鬼影迷踪战力有多强</a>
                        <span class="text-muted">嘚瑟_a3a5</span>

                        <div>自从唐三穿越到斗罗大陆以后,由于修炼体系和前世的不同,虽然玄天功也是勤修不辍可是无论怎样修炼都毫无进展,总是难以突破瓶颈,而紫极魔瞳和鬼影迷踪也因为内力的限制发挥不出其真正的威力。后来通过在素云涛那里了解了一些斗罗大陆修炼的方法和体系之后,唐三才知道魂力也就是他前世的内力需要突破的话需要附加魂环以后才可以进入下一阶段的修炼。而在小刚老师详细介绍和针对唐三的具体情况分析指导以后,唐三也不再迷茫决定重</div>
                    </li>
                    <li><a href="/article/1950206053383729152.htm"
                           title="直返APP的创始人是谁他们的创业背景和经历如何?" target="_blank">直返APP的创始人是谁他们的创业背景和经历如何?</a>
                        <span class="text-muted">氧惠帮朋友一起省</span>

                        <div>直返的创始人是李明,他是一位富有创新精神的电商专家。他看到了传统电商模式的局限,并决心打破这些局限,为消费者带来更实惠、更便捷的购物体验。于是,他创立了直返这一独特的电商模式,通过省去中间环节、直接返还利润给消费者,实现了购物的简单与实惠。氧惠APP(带货领导者)——是与以往完全不同的抖客+淘客app!2024全新模式,我的直推也会放到你下面。主打:带货高补贴,深受各位带货团队长喜爱(每天出单带货</div>
                    </li>
                    <li><a href="/article/1950203001385840640.htm"
                           title="民事诉讼后,发现与刑事案件有关联怎么办" target="_blank">民事诉讼后,发现与刑事案件有关联怎么办</a>
                        <span class="text-muted">邓粤龙</span>

                        <div>在一些民事案件中,当事人发起民事诉讼后,经过法院审理,发现该案件和刑事案件还有关联,这时就涉及到交叉案件的处理。民事诉讼的发起人是案件的当事人,而刑事诉讼通常是由检察院提请公诉的,两者并不属于同一程序,那么,民事诉讼后多久到刑事诉讼?下面我们一起看看小编的分析。一、民事诉讼后多久到刑事诉讼?民事诉讼和刑事诉讼性质不同,是独立的。普通民事纠纷适用民事诉讼,构成犯罪则进行刑事诉讼,二者之间一般没有转化</div>
                    </li>
                    <li><a href="/article/1950202938941042688.htm"
                           title="大模型量化终极对决:FP8 vs AWQ INT4,谁才是性能与精度的王者?" target="_blank">大模型量化终极对决:FP8 vs AWQ INT4,谁才是性能与精度的王者?</a>
                        <span class="text-muted">曦紫沐</span>
<a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B%E9%87%8F%E5%8C%96/1.htm">大模型量化</a><a class="tag" taget="_blank" href="/search/FP8/1.htm">FP8</a><a class="tag" taget="_blank" href="/search/AWQ_INT4/1.htm">AWQ_INT4</a>
                        <div>摘要在大模型部署与优化中,量化技术是突破性能瓶颈的关键。FP8量化与AWQINT4量化作为当前主流方案,分别以“高精度”和“极致压缩”为核心优势。本文通过表格对比二者的数据格式、精度损失、硬件依赖及适用场景,助您在不同需求下精准选择最优方案。一、数据格式:浮点与整数的底层差异FP8量化采用浮点数(FP8),包含E4M3(4位阶码+3位尾数)和E5M2(5位阶码+2位尾数)两种格式,保留动态范围;而</div>
                    </li>
                    <li><a href="/article/1950201675297910784.htm"
                           title="大数据之路:阿里巴巴大数据实践——大数据领域建模综述" target="_blank">大数据之路:阿里巴巴大数据实践——大数据领域建模综述</a>
                        <span class="text-muted"></span>

                        <div>为什么需要数据建模核心痛点数据冗余:不同业务重复存储相同数据(如用户基础信息),导致存储成本激增。计算资源浪费:未经聚合的明细数据直接参与计算(如全表扫描),消耗大量CPU/内存资源。数据一致性缺失:同一指标在不同业务线的口径差异(如“活跃用户”定义不同),引发决策冲突。开发效率低下:每次分析需重新编写复杂逻辑,无法复用已有模型。数据建模核心价值性能提升:分层设计(ODS→DWD→DWS→ADS)</div>
                    </li>
                    <li><a href="/article/1950200414989250560.htm"
                           title="面试必考题:Android Binder 机制详解" target="_blank">面试必考题:Android Binder 机制详解</a>
                        <span class="text-muted">大模型大数据攻城狮</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/binder/1.htm">binder</a><a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95/1.htm">面试</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/native/1.htm">native</a><a class="tag" taget="_blank" href="/search/kotlin/1.htm">kotlin</a><a class="tag" taget="_blank" href="/search/dalvik/1.htm">dalvik</a><a class="tag" taget="_blank" href="/search/retrofit/1.htm">retrofit</a>
                        <div>目录第一章:Binder的基本概念什么是Binder?多角度解读Binder第二章:Binder的工作机制Binder的整体流程服务注册:从零到有的第一步服务查询:找到目标的“地图”服务调用:请求与响应的旅程Binder驱动的幕后功劳为什么Binder这么快?第三章:Binder在系统架构中的角色Activity:界面背后的通信枢纽Binder的角色实例分析Service:后台任务的跨进程支柱Bi</div>
                    </li>
                    <li><a href="/article/1950198560637120512.htm"
                           title="我应该如何使用直返APP才能获得更多的返利?" target="_blank">我应该如何使用直返APP才能获得更多的返利?</a>
                        <span class="text-muted">氧惠好物</span>

                        <div>要想在直返APP获得更多返利,您可以尝试以下几个方法:氧惠APP(带货领导者)——是与以往完全不同的抖客+淘客app!2024全新模式,我的直推也会放到你下面。主打:带货高补贴,深受各位带货团队长喜爱(每天出单带货几十万单)。注册即可享受高补贴+0撸+捡漏等带货新体验。送万元推广大礼包,教你如何1年做到百万团队。首先,注册并完善账户信息。注册后,您将获得新人专享优惠券,以及更多的返利机会。同时,确</div>
                    </li>
                    <li><a href="/article/1950196514932453376.htm"
                           title="谣言" target="_blank">谣言</a>
                        <span class="text-muted">凡客文辉</span>

                        <div>三人成虎的道理简单易懂,因此我们在一些有实质影响的事情面前是应该不轻易相信,不随便传言的。然而真正到现实生活中许多人还是做不到这一点,也许是因为枯燥的生活需要一丝不同来增加味道,也许是为了个人某些方面的利益而受到怂恿,也许是为了满足内心小小的虚荣以此来显示自己与别人的不同,种种原因导致谣言的诞生,我们一定要理性去思考判断,无论何时都应该经过思考在做出决定。人之所以能够主宰地球,成为生物顶端的动物,</div>
                    </li>
                                <li><a href="/article/127.htm"
                                       title="用MiddleGenIDE工具生成hibernate的POJO(根据数据表生成POJO类)" target="_blank">用MiddleGenIDE工具生成hibernate的POJO(根据数据表生成POJO类)</a>
                                    <span class="text-muted">AdyZhang</span>
<a class="tag" taget="_blank" href="/search/POJO/1.htm">POJO</a><a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/MiddleGenIDE/1.htm">MiddleGenIDE</a>
                                    <div>推荐:MiddlegenIDE插件,   是一个Eclipse   插件.     用它可以直接连接到数据库,   根据表按照一定的HIBERNATE规则作出BEAN和对应的XML ,用完后你可以手动删除它加载的JAR包和XML文件!     今天开始试着使用</div>
                                </li>
                                <li><a href="/article/254.htm"
                                       title=".9.png" target="_blank">.9.png</a>
                                    <span class="text-muted">Cb123456</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                                    <div>  “点九”是andriod平台的应用软件开发里的一种特殊的图片形式,文件扩展名为:.9.png 
  智能手机中有自动横屏的功能,同一幅界面会在随着手机(或平板电脑)中的方向传感器的参数不同而改变显示的方向,在界面改变方向后,界面上的图形会因为长宽的变化而产生拉伸,造成图形的失真变形。 
  我们都知道android平台有多种不同的分辨率,很多控件的切图文件在被放大拉伸后,边</div>
                                </li>
                                <li><a href="/article/381.htm"
                                       title="算法的效率" target="_blank">算法的效率</a>
                                    <span class="text-muted">天子之骄</span>
<a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95%E6%95%88%E7%8E%87/1.htm">算法效率</a><a class="tag" taget="_blank" href="/search/%E5%A4%8D%E6%9D%82%E5%BA%A6/1.htm">复杂度</a><a class="tag" taget="_blank" href="/search/%E6%9C%80%E5%9D%8F%E6%83%85%E5%86%B5%E8%BF%90%E8%A1%8C%E6%97%B6%E9%97%B4/1.htm">最坏情况运行时间</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7O%E9%98%B6/1.htm">大O阶</a><a class="tag" taget="_blank" href="/search/%E5%B9%B3%E5%9D%87%E6%83%85%E5%86%B5%E8%BF%90%E8%A1%8C%E6%97%B6%E9%97%B4/1.htm">平均情况运行时间</a>
                                    <div>算法的效率 
效率是速度和空间消耗的度量。集中考虑程序的速度,也称运行时间或执行时间,用复杂度的阶(O)这一标准来衡量。空间的消耗或需求也可以用大O表示,而且它总是小于或等于时间需求。 
  
以下是我的学习笔记: 
  
1.求值与霍纳法则,即为秦九韶公式。 
  
2.测定运行时间的最可靠方法是计数对运行时间有贡献的基本操作的执行次数。运行时间与这个计数成正比。 </div>
                                </li>
                                <li><a href="/article/508.htm"
                                       title="java数据结构" target="_blank">java数据结构</a>
                                    <span class="text-muted">何必如此</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a>
                                    <div>Java 数据结构 
 
Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类: 
 
枚举(Enumeration) 
位集合(BitSet) 
向量(Vector) 
栈(Stack) 
字典(Dictionary) 
哈希表(Hashtable) 
属性(Properties) 
以上这些类是传统遗留的,在Java2中引入了一种新的框架-集合框架(Collect</div>
                                </li>
                                <li><a href="/article/635.htm"
                                       title="MybatisHelloWorld" target="_blank">MybatisHelloWorld</a>
                                    <span class="text-muted">3213213333332132</span>

                                    <div>
//测试入口TestMyBatis   
package com.base.helloworld.test;

import java.io.IOException;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibat</div>
                                </li>
                                <li><a href="/article/762.htm"
                                       title="Java|urlrewrite|URL重写|多个参数" target="_blank">Java|urlrewrite|URL重写|多个参数</a>
                                    <span class="text-muted">7454103</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a>
                                    <div> 个人工作经验! 如有不当之处,敬请指点    
1.0  web -info 目录下建立     urlrewrite.xml  文件 类似如下: 
<?xml version="1.0" encoding="UTF-8" ?>  
  <!DOCTYPE u</div>
                                </li>
                                <li><a href="/article/889.htm"
                                       title="达梦数据库+ibatis" target="_blank">达梦数据库+ibatis</a>
                                    <span class="text-muted">darkranger</span>
<a class="tag" taget="_blank" href="/search/sql/1.htm">sql</a><a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/ibatis/1.htm">ibatis</a><a class="tag" taget="_blank" href="/search/SQL+Server/1.htm">SQL Server</a>
                                    <div>--插入数据方面 
 
如果您需要数据库自增... 
那么在插入的时候不需要指定自增列. 
 
如果想自己指定ID列的值, 那么要设置 
set identity_insert  数据库名.模式名.表名; 
----然后插入数据; 
example: 
create table zhabei.test( 
id bigint identity(1,1) primary key, 
nam</div>
                                </li>
                                <li><a href="/article/1016.htm"
                                       title="XML 解析 四种方式" target="_blank">XML 解析 四种方式</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a>
                                    <div>XML现在已经成为一种通用的数据交换格式,平台的无关性使得很多场合都需要用到XML。本文将详细介绍用Java解析XML的四种方法。   
 
  
 
    
 
XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便。对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这里面包括的内容有DOM(Document Object </div>
                                </li>
                                <li><a href="/article/1143.htm"
                                       title="spring中配置文件占位符的使用" target="_blank">spring中配置文件占位符的使用</a>
                                    <span class="text-muted">avords</span>

                                    <div>1.类 
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.o</div>
                                </li>
                                <li><a href="/article/1270.htm"
                                       title="前端工程化-公共模块的依赖和常用的工作流" target="_blank">前端工程化-公共模块的依赖和常用的工作流</a>
                                    <span class="text-muted">bee1314</span>
<a class="tag" taget="_blank" href="/search/webpack/1.htm">webpack</a>
                                    <div>题记: 一个人的项目,还有工程化的问题嘛?       我们在推进模块化和组件化的过程中,肯定会不断的沉淀出我们项目的模块和组件。对于这些沉淀出的模块和组件怎么管理?另外怎么依赖也是个问题?   你真的想这样嘛?       var BreadCrumb = require(‘../../../../uikit/breadcrumb’); //真心ugly。     </div>
                                </li>
                                <li><a href="/article/1397.htm"
                                       title="上司说「看你每天准时下班就知道你工作量不饱和」,该如何回应?" target="_blank">上司说「看你每天准时下班就知道你工作量不饱和」,该如何回应?</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86/1.htm">项目管理</a><a class="tag" taget="_blank" href="/search/%E6%B2%9F%E9%80%9A/1.htm">沟通</a><a class="tag" taget="_blank" href="/search/IT%E8%81%8C%E4%B8%9A%E8%A7%84%E5%88%92/1.htm">IT职业规划</a>
                                    <div>问题:上司说「看你每天准时下班就知道你工作量不饱和」,如何回应 
        正常下班时间6点,只要是6点半前下班的,上司都认为没有加班。 
  
Eno-Bea回答,注重感受,不一定是别人的 
        虽然我不知道你具体从事什么工作与职业,但是我大概猜测,你是从事一项不太容易出现阶段性成果的工作</div>
                                </li>
                                <li><a href="/article/1524.htm"
                                       title="TortoiseSVN,过滤文件" target="_blank">TortoiseSVN,过滤文件</a>
                                    <span class="text-muted">征客丶</span>
<a class="tag" taget="_blank" href="/search/SVN/1.htm">SVN</a>
                                    <div>环境: 
TortoiseSVN 1.8 
 
配置: 
在文件夹空白处右键 
选择  TortoiseSVN -> Settings 
在 Global ignote pattern 中添加要过滤的文件: 
多类型用英文空格分开 
*name : 过滤所有名称为 name 的文件或文件夹 
*.name : 过滤所有后缀为 name 的文件或文件夹 
 
 
 
--------</div>
                                </li>
                                <li><a href="/article/1651.htm"
                                       title="【Flume二】HDFS sink细说" target="_blank">【Flume二】HDFS sink细说</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/Flume/1.htm">Flume</a>
                                    <div>1. Flume配置 
  
a1.sources=r1  
a1.channels=c1  
a1.sinks=k1  

###Flume负责启动44444端口
  
a1.sources.r1.type=avro  
a1.sources.r1.bind=0.0.0.0  
a1.sources.r1.port=44444  
a1.sources.r1.chan</div>
                                </li>
                                <li><a href="/article/1778.htm"
                                       title="The Eight Myths of Erlang Performance" target="_blank">The Eight Myths of Erlang Performance</a>
                                    <span class="text-muted">bookjovi</span>
<a class="tag" taget="_blank" href="/search/erlang/1.htm">erlang</a>
                                    <div>erlang有一篇guide很有意思: http://www.erlang.org/doc/efficiency_guide 
里面有个The Eight Myths of Erlang Performance: http://www.erlang.org/doc/efficiency_guide/myths.html 
  
  
Myth: Funs are sl</div>
                                </li>
                                <li><a href="/article/1905.htm"
                                       title="java多线程网络传输文件(非同步)-2008-08-17" target="_blank">java多线程网络传输文件(非同步)-2008-08-17</a>
                                    <span class="text-muted">ljy325</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">多线程</a><a class="tag" taget="_blank" href="/search/socket/1.htm">socket</a>
                                    <div>利用 Socket 套接字进行面向连接通信的编程。客户端读取本地文件并发送;服务器接收文件并保存到本地文件系统中。 
使用说明:请将TransferClient, TransferServer, TempFile三个类编译,他们的类包是FileServer. 
客户端: 
修改TransferClient: serPort, serIP, filePath, blockNum,的值来符合您机器的系</div>
                                </li>
                                <li><a href="/article/2032.htm"
                                       title="读《研磨设计模式》-代码笔记-模板方法模式" target="_blank">读《研磨设计模式》-代码笔记-模板方法模式</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a>
                                    <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ 
 
 



import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;</div>
                                </li>
                                <li><a href="/article/2159.htm"
                                       title="配置心得" target="_blank">配置心得</a>
                                    <span class="text-muted">chenyu19891124</span>
<a class="tag" taget="_blank" href="/search/%E9%85%8D%E7%BD%AE/1.htm">配置</a>
                                    <div>时间就这样不知不觉的走过了一个春夏秋冬,转眼间来公司已经一年了,感觉时间过的很快,时间老人总是这样不停走,从来没停歇过。 
作为一名新手的配置管理员,刚开始真的是对配置管理是一点不懂,就只听说咱们公司配置主要是负责升级,而具体该怎么做却一点都不了解。经过老员工的一点点讲解,慢慢的对配置有了初步了解,对自己所在的岗位也慢慢的了解。 
做了一年的配置管理给自总结下: 
1.改变 
从一个以前对配置毫无</div>
                                </li>
                                <li><a href="/article/2286.htm"
                                       title="对“带条件选择的并行汇聚路由问题”的再思考" target="_blank">对“带条件选择的并行汇聚路由问题”的再思考</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E8%BD%AF%E4%BB%B6%E6%B5%8B%E8%AF%95/1.htm">软件测试</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F/1.htm">嵌入式</a><a class="tag" taget="_blank" href="/search/%E9%A2%86%E5%9F%9F%E6%A8%A1%E5%9E%8B/1.htm">领域模型</a>
                                    <div>2008年上半年,我在设计并开发基于”JWFD流程系统“的商业化改进型引擎的时候,由于采用了新的嵌入式公式模块而导致出现“带条件选择的并行汇聚路由问题”(请参考2009-02-27博文),当时对这个问题的解决办法是采用基于拓扑结构的处理思想,对汇聚点的实际前驱分支节点通过算法预测出来,然后进行处理,简单的说就是找到造成这个汇聚模型的分支起点,对这个起始分支节点实际走的路径数进行计算,然后把这个实际</div>
                                </li>
                                <li><a href="/article/2413.htm"
                                       title="Oracle 10g 的clusterware 32位 下载地址" target="_blank">Oracle 10g 的clusterware 32位 下载地址</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a>
                                    <div>Oracle 10g 的clusterware 32位 下载地址 
 
http://pan.baidu.com/share/link?shareid=531580&uk=421021908 
 
 
http://pan.baidu.com/share/link?shareid=137223&uk=321552738 
 
http://pan.baidu.com/share/l</div>
                                </li>
                                <li><a href="/article/2540.htm"
                                       title="非常好的介绍:Linux定时执行工具cron" target="_blank">非常好的介绍:Linux定时执行工具cron</a>
                                    <span class="text-muted">dongwei_6688</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                                    <div>Linux经过十多年的发展,很多用户都很了解Linux了,这里介绍一下Linux下cron的理解,和大家讨论讨论。cron是一个Linux 定时执行工具,可以在无需人工干预的情况下运行作业,本文档不讲cron实现原理,主要讲一下Linux定时执行工具cron的具体使用及简单介绍。 
新增调度任务推荐使用crontab -e命令添加自定义的任务(编辑的是/var/spool/cron下对应用户的cr</div>
                                </li>
                                <li><a href="/article/2667.htm"
                                       title="Yii assets目录生成及修改" target="_blank">Yii assets目录生成及修改</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/yii/1.htm">yii</a>
                                    <div>assets的作用是方便模块化,插件化的,一般来说出于安全原因不允许通过url访问protected下面的文件,但是我们又希望将module单独出来,所以需要使用发布,即将一个目录下的文件复制一份到assets下面方便通过url访问。 
assets设置对应的方法位置 \framework\web\CAssetManager.php 
  
assets配置方法 在m</div>
                                </li>
                                <li><a href="/article/2794.htm"
                                       title="mac工作软件推荐" target="_blank">mac工作软件推荐</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/mac/1.htm">mac</a>
                                    <div>mac上的Terminal + bash + screen组合现在已经非常好用了,但是还是经不起iterm+zsh+tmux的冲击。在同事的强烈推荐下,趁着升级mac系统的机会,顺便也切换到iterm+zsh+tmux的环境下了。 
我为什么要要iterm2 
切换过来也是脑袋一热的冲动,我也调查过一些资料,看了下iterm的一些优点: 
 
 * 兼容性好,远程服务器 vi 什么的低版本能很好兼</div>
                                </li>
                                <li><a href="/article/2921.htm"
                                       title="Memcached(三)、封装Memcached和Ehcache" target="_blank">Memcached(三)、封装Memcached和Ehcache</a>
                                    <span class="text-muted">frank1234</span>
<a class="tag" taget="_blank" href="/search/memcached/1.htm">memcached</a><a class="tag" taget="_blank" href="/search/ehcache/1.htm">ehcache</a><a class="tag" taget="_blank" href="/search/spring+ioc/1.htm">spring ioc</a>
                                    <div>本文对Ehcache和Memcached进行了简单的封装,这样对于客户端程序无需了解ehcache和memcached的差异,仅需要配置缓存的Provider类就可以在二者之间进行切换,Provider实现类通过Spring IoC注入。 
cache.xml 
 
<?xml version="1.0" encoding="UTF-8"?>
</div>
                                </li>
                                <li><a href="/article/3048.htm"
                                       title="Remove Duplicates from Sorted List II" target="_blank">Remove Duplicates from Sorted List II</a>
                                    <span class="text-muted">hcx2013</span>
<a class="tag" taget="_blank" href="/search/remove/1.htm">remove</a>
                                    <div>Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numbers from the original list. 
For example,Given 1->2->3->3->4->4->5,</div>
                                </li>
                                <li><a href="/article/3175.htm"
                                       title="Spring4新特性——注解、脚本、任务、MVC等其他特性改进" target="_blank">Spring4新特性——注解、脚本、任务、MVC等其他特性改进</a>
                                    <span class="text-muted">jinnianshilongnian</span>
<a class="tag" taget="_blank" href="/search/spring4/1.htm">spring4</a>
                                    <div>Spring4新特性——泛型限定式依赖注入 
Spring4新特性——核心容器的其他改进 
Spring4新特性——Web开发的增强 
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC  
Spring4新特性——Groovy Bean定义DSL 
Spring4新特性——更好的Java泛型操作API  
Spring4新</div>
                                </li>
                                <li><a href="/article/3302.htm"
                                       title="MySQL安装文档" target="_blank">MySQL安装文档</a>
                                    <span class="text-muted">liyong0802</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                                    <div>  工作中用到的MySQL可能安装在两种操作系统中,即Windows系统和Linux系统。以Linux系统中情况居多。 
  安装在Windows系统时与其它Windows应用程序相同按照安装向导一直下一步就即,这里就不具体介绍,本文档只介绍Linux系统下MySQL的安装步骤。 
  Linux系统下安装MySQL分为三种:RPM包安装、二进制包安装和源码包安装。二</div>
                                </li>
                                <li><a href="/article/3429.htm"
                                       title="使用VS2010构建HotSpot工程" target="_blank">使用VS2010构建HotSpot工程</a>
                                    <span class="text-muted">p2p2500</span>
<a class="tag" taget="_blank" href="/search/HotSpot/1.htm">HotSpot</a><a class="tag" taget="_blank" href="/search/OpenJDK/1.htm">OpenJDK</a><a class="tag" taget="_blank" href="/search/VS2010/1.htm">VS2010</a>
                                    <div>1. 下载OpenJDK7的源码: 
     
http://download.java.net/openjdk/jdk7 
     
http://download.java.net/openjdk/ 
     
2. 环境配置 
    ▶</div>
                                </li>
                                <li><a href="/article/3556.htm"
                                       title="Oracle实用功能之分组后列合并" target="_blank">Oracle实用功能之分组后列合并</a>
                                    <span class="text-muted">seandeng888</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E7%BB%84/1.htm">分组</a><a class="tag" taget="_blank" href="/search/%E5%AE%9E%E7%94%A8%E5%8A%9F%E8%83%BD/1.htm">实用功能</a><a class="tag" taget="_blank" href="/search/%E5%90%88%E5%B9%B6/1.htm">合并</a>
                                    <div>1       实例解析  
由于业务需求需要对表中的数据进行分组后进行合并的处理,鉴于Oracle10g没有现成的函数实现该功能,且该功能如若用JAVA代码实现会比较复杂,因此,特将SQL语言的实现方式分享出来,希望对大家有所帮助。如下: 
表test 数据如下: 
ID,SUBJECTCODE,DIMCODE,VALUE 
1&nbs</div>
                                </li>
                                <li><a href="/article/3683.htm"
                                       title="Java定时任务注解方式实现" target="_blank">Java定时任务注解方式实现</a>
                                    <span class="text-muted">tuoni</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/jvm/1.htm">jvm</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a><a class="tag" taget="_blank" href="/search/jni/1.htm">jni</a>
                                    <div>Spring 注解的定时任务,有如下两种方式: 
第一种: 
<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

 xmlns:xsi="http</div>
                                </li>
                                <li><a href="/article/3810.htm"
                                       title="11大Java开源中文分词器的使用方法和分词效果对比" target="_blank">11大Java开源中文分词器的使用方法和分词效果对比</a>
                                    <span class="text-muted">yangshangchuan</span>
<a class="tag" taget="_blank" href="/search/word%E5%88%86%E8%AF%8D%E5%99%A8/1.htm">word分词器</a><a class="tag" taget="_blank" href="/search/ansj%E5%88%86%E8%AF%8D%E5%99%A8/1.htm">ansj分词器</a><a class="tag" taget="_blank" href="/search/Stanford%E5%88%86%E8%AF%8D%E5%99%A8/1.htm">Stanford分词器</a><a class="tag" taget="_blank" href="/search/FudanNLP%E5%88%86%E8%AF%8D%E5%99%A8/1.htm">FudanNLP分词器</a><a class="tag" taget="_blank" href="/search/HanLP%E5%88%86%E8%AF%8D%E5%99%A8/1.htm">HanLP分词器</a>
                                    <div>本文的目标有两个: 
1、学会使用11大Java开源中文分词器 
2、对比分析11大Java开源中文分词器的分词效果 
本文给出了11大Java开源中文分词的使用方法以及分词结果对比代码,至于效果哪个好,那要用的人结合自己的应用场景自己来判断。 
11大Java开源中文分词器,不同的分词器有不同的用法,定义的接口也不一样,我们先定义一个统一的接口: 
/**
 * 获取文本的所有分词结果, 对比</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>