-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathatom.xml
More file actions
406 lines (315 loc) · 221 KB
/
Copy pathatom.xml
File metadata and controls
406 lines (315 loc) · 221 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>bee.gs的博客</title>
<subtitle>啦啦啦,啦啦啦,我是搬砖的小行家</subtitle>
<link href="/atom.xml" rel="self"/>
<link href="http://bee.gs/"/>
<updated>2017-05-20T01:43:08.561Z</updated>
<id>http://bee.gs/</id>
<author>
<name>bee.gs 博客</name>
<email>coding99@163.com</email>
</author>
<generator uri="http://hexo.io/">Hexo</generator>
<entry>
<title>people.run</title>
<link href="http://bee.gs/2017/05/18/feel/life-run/"/>
<id>http://bee.gs/2017/05/18/feel/life-run/</id>
<published>2017-05-18T12:00:00.000Z</published>
<updated>2017-05-20T01:43:08.561Z</updated>
<content type="html"><![CDATA[<h2 id="people-run"><a href="#people-run" class="headerlink" title="people.run"></a>people.run</h2><iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width="330" height="86" src="//music.163.com/outchain/player?type=2&id=2920947&auto=0&height=66"></iframe>
<h3 id="还记得我的-people-run"><a href="#还记得我的-people-run" class="headerlink" title="还记得我的 people.run"></a>还记得我的 <a href="http://people.run" target="_blank" rel="external">people.run</a></h3><h3 id="不知道啥时候才有精力去弄"><a href="#不知道啥时候才有精力去弄" class="headerlink" title="不知道啥时候才有精力去弄"></a>不知道啥时候才有精力去弄</h3><h3 id="也许是很多年后的事了"><a href="#也许是很多年后的事了" class="headerlink" title="也许是很多年后的事了"></a>也许是很多年后的事了</h3><p><img src="/assets/img/article/run.jpg" alt="img8"></p>
]]></content>
<summary type="html">
<h2 id="people-run"><a href="#people-run" class="headerlink" title="people.run"></a>people.run</h2><iframe frameborder="no" border="0" margi
</summary>
<category term="life" scheme="http://bee.gs/tags/life/"/>
</entry>
<entry>
<title>自定义功能模块设计</title>
<link href="http://bee.gs/2016/12/20/tech/%E8%87%AA%E5%AE%9A%E4%B9%89%E5%8A%9F%E8%83%BD%E6%A8%A1%E5%9D%97%E8%AE%BE%E8%AE%A1/"/>
<id>http://bee.gs/2016/12/20/tech/自定义功能模块设计/</id>
<published>2016-12-19T16:00:00.000Z</published>
<updated>2016-12-27T14:58:17.249Z</updated>
<content type="html"><![CDATA[<h2 id="自定义功能模块设计"><a href="#自定义功能模块设计" class="headerlink" title="自定义功能模块设计"></a>自定义功能模块设计</h2><p>项目搭建架构图在线地址<a href="http://www.processon.com/view/5850b60de4b05021859c4232" target="_blank" rel="external">点击查看架构图</a>。</p>
<a id="more"></a>
<p>数据表设计如下:</p>
<figure class="highlight sql"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div></pre></td><td class="code"><pre><div class="line"><span class="comment">--自定义数据源表</span></div><div class="line"><span class="keyword">create</span> <span class="keyword">table</span> CUSTOM_DATA</div><div class="line">(</div><div class="line"> <span class="keyword">id</span> primary <span class="keyword">key</span> <span class="built_in">VARCHAR</span>(<span class="number">64</span>) <span class="keyword">not</span> <span class="literal">null</span>,</div><div class="line"> <span class="keyword">name</span> <span class="built_in">VARCHAR</span>(<span class="number">200</span>),</div><div class="line"> <span class="keyword">sql</span> <span class="keyword">CLOB</span>,</div><div class="line"> <span class="keyword">url</span> <span class="built_in">varchar</span>(<span class="number">2000</span>),</div><div class="line"> method <span class="built_in">varchar</span>(<span class="number">10</span>),</div><div class="line"> data_source <span class="built_in">varchar</span>(<span class="number">30</span>),</div><div class="line"> page <span class="built_in">char</span>(<span class="number">1</span>);</div><div class="line"> control_type char(1);</div><div class="line"> source_type char(1);</div><div class="line"> description varchar(2000),</div><div class="line"> status CHAR(1),</div><div class="line"> create_id varchar(64),</div><div class="line"> create_time timestamp,</div><div class="line"> modify_id varchar(64),</div><div class="line"> modify_time timestamp</div><div class="line">)</div><div class="line"></div><div class="line"><span class="comment">--表 注释</span></div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">table</span> CUSTOM_DATA <span class="keyword">is</span> <span class="string">'自定义数据源表'</span>;</div><div class="line"><span class="comment">--列 注释</span></div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_DATA.id <span class="keyword">is</span> <span class="string">'uuid主键'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_DATA.name <span class="keyword">is</span> <span class="string">'名称'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_DATA.sql <span class="keyword">is</span> <span class="string">'SQL语句'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_DATA.url <span class="keyword">is</span> <span class="string">'请求地址'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_DATA.method <span class="keyword">is</span> <span class="string">'请求方式'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_DATA.data_source <span class="keyword">is</span> <span class="string">'数据库连接池'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_DATA.page <span class="keyword">is</span> <span class="string">'0不分页,1分页'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_DATA.control_type <span class="keyword">is</span> <span class="string">'控件类型:0、table 1、chart'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_DATA.source_type <span class="keyword">is</span> <span class="string">'数据源类型:0、sql 1、http请求'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_DATA.description <span class="keyword">is</span> <span class="string">'描述'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_DATA.status <span class="keyword">is</span> <span class="string">'状态'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_DATA.create_id <span class="keyword">is</span> <span class="string">'创建人'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_DATA.create_time <span class="keyword">is</span> <span class="string">'创建时间'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_DATA.modify_id <span class="keyword">is</span> <span class="string">'修改人'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_DATA.modify_time <span class="keyword">is</span> <span class="string">'修改时间'</span>;</div><div class="line"></div><div class="line"><span class="comment">-- 注释 自定义页面page表或者组件</span></div><div class="line"><span class="keyword">create</span> <span class="keyword">table</span> CUSTOM_PAGE</div><div class="line">(</div><div class="line"> <span class="keyword">id</span> primary <span class="keyword">key</span> <span class="built_in">VARCHAR</span>(<span class="number">64</span>) <span class="keyword">not</span> <span class="literal">null</span>,</div><div class="line"> <span class="keyword">name</span> <span class="built_in">VARCHAR</span>(<span class="number">100</span>),</div><div class="line"> html_code <span class="keyword">CLOB</span>,</div><div class="line"> rest_id <span class="built_in">VARCHAR</span>(<span class="number">32</span>),</div><div class="line"> query_ids <span class="built_in">VARCHAR</span>(<span class="number">2000</span>),</div><div class="line"> <span class="keyword">type</span> <span class="built_in">char</span>(<span class="number">1</span>),</div><div class="line"> description <span class="built_in">VARCHAR</span>(<span class="number">2000</span>),</div><div class="line"> create_id <span class="built_in">varchar</span>(<span class="number">64</span>),</div><div class="line"> create_time <span class="keyword">timestamp</span>,</div><div class="line"> modify_id <span class="built_in">varchar</span>(<span class="number">64</span>),</div><div class="line"> modify_time <span class="keyword">timestamp</span></div><div class="line">)</div><div class="line"></div><div class="line"><span class="comment">-- 表注释 </span></div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">table</span> CUSTOM_PAGE <span class="keyword">is</span> <span class="string">'自定义页面page表'</span>;</div><div class="line"><span class="comment">-- 列注释</span></div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_PAGE.id <span class="keyword">is</span> <span class="string">'uuid主键'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_PAGE.name <span class="keyword">is</span> <span class="string">'名称'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_PAGE.html_code <span class="keyword">is</span> <span class="string">'存储页面所有代码'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_PAGE.rest_id <span class="keyword">is</span> <span class="string">'此id为32位数字,开放给其它平台用'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_PAGE.query_ids <span class="keyword">is</span> <span class="string">'query的id集合, 用分号隔开,方便统计用'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_PAGE.type <span class="keyword">is</span> <span class="string">'页面类型:0代表页面 主要用于APP中 2代表组件 用于页面局部自定义功能'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_PAGE.description <span class="keyword">is</span> <span class="string">'页面使用说明'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_PAGE.create_id <span class="keyword">is</span> <span class="string">'创建人'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_PAGE.create_time <span class="keyword">is</span> <span class="string">'创建时间'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_PAGE.modify_id <span class="keyword">is</span> <span class="string">'修改人'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_PAGE.modify_time <span class="keyword">is</span> <span class="string">'修改时间'</span>;</div><div class="line"></div><div class="line"><span class="comment">-- 自定义APP</span></div><div class="line"><span class="keyword">create</span> <span class="keyword">table</span> CUSTOM_APP</div><div class="line">(</div><div class="line"> <span class="keyword">id</span> primary <span class="keyword">key</span> <span class="built_in">VARCHAR</span>(<span class="number">64</span>) <span class="keyword">not</span> <span class="literal">null</span>,</div><div class="line"> <span class="keyword">name</span> VARCHAR2(<span class="number">100</span>),</div><div class="line"> icon VARCHAR2(<span class="number">100</span>),</div><div class="line"> description <span class="built_in">VARCHAR</span>(<span class="number">2000</span>),</div><div class="line"> <span class="keyword">status</span> <span class="built_in">char</span>(<span class="number">1</span>),</div><div class="line"> create_id <span class="built_in">varchar</span>(<span class="number">64</span>),</div><div class="line"> create_time <span class="keyword">timestamp</span>,</div><div class="line"> modify_id <span class="built_in">varchar</span>(<span class="number">64</span>),</div><div class="line"> modify_time <span class="keyword">timestamp</span></div><div class="line">)</div><div class="line"><span class="comment">-- 表注释</span></div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP.category <span class="keyword">is</span> <span class="string">'应用标签'</span>;</div><div class="line"><span class="comment">-- 字段注释</span></div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP.id <span class="keyword">is</span> <span class="string">'uuid主键'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP.name <span class="keyword">is</span> <span class="string">'名称'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP.icon <span class="keyword">is</span> <span class="string">'图标'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP.description <span class="keyword">is</span> <span class="string">'描述'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP.status <span class="keyword">is</span> <span class="string">'状态0启用 1禁用'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP.create_id <span class="keyword">is</span> <span class="string">'创建人'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP.create_time <span class="keyword">is</span> <span class="string">'创建时间'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP.modify_id <span class="keyword">is</span> <span class="string">'修改人'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP.modify_time <span class="keyword">is</span> <span class="string">'修改时间'</span>;</div><div class="line"></div><div class="line"><span class="comment">--app和页面建立关联 菜单表</span></div><div class="line"><span class="keyword">create</span> <span class="keyword">table</span> CUSTOM_APP_PAGE</div><div class="line">(</div><div class="line"> <span class="keyword">id</span> primary <span class="keyword">key</span> <span class="built_in">VARCHAR</span>(<span class="number">64</span>) <span class="keyword">not</span> <span class="literal">null</span>,</div><div class="line"> <span class="keyword">name</span> VARCHAR2(<span class="number">100</span>),</div><div class="line"> icon VARCHAR2(<span class="number">100</span>),</div><div class="line"> app_id <span class="built_in">VARCHAR</span>(<span class="number">64</span>) <span class="keyword">not</span> <span class="literal">null</span>,</div><div class="line"> page_id <span class="built_in">VARCHAR</span>(<span class="number">64</span>) <span class="keyword">not</span> <span class="literal">null</span>,</div><div class="line"> description <span class="built_in">VARCHAR</span>(<span class="number">2000</span>),</div><div class="line"> <span class="keyword">status</span> <span class="built_in">char</span>(<span class="number">1</span>),</div><div class="line"> create_id <span class="built_in">varchar</span>(<span class="number">64</span>),</div><div class="line"> create_time <span class="keyword">timestamp</span>,</div><div class="line"> modify_id <span class="built_in">varchar</span>(<span class="number">64</span>),</div><div class="line"> modify_time <span class="keyword">timestamp</span></div><div class="line">)</div><div class="line"><span class="comment">-- 表注释</span></div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP_PAGE.category <span class="keyword">is</span> <span class="string">'app菜单表'</span>;</div><div class="line"><span class="comment">-- 字段注释</span></div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP_PAGE.id <span class="keyword">is</span> <span class="string">'uuid主键'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP_PAGE.name <span class="keyword">is</span> <span class="string">'名称'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP_PAGE.icon <span class="keyword">is</span> <span class="string">'图标'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP_PAGE.app_id <span class="keyword">is</span> <span class="string">'app_id和APP表建立关联'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP_PAGE.page_id <span class="keyword">is</span> <span class="string">'page_id和页面表建立关联'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP_PAGE.description <span class="keyword">is</span> <span class="string">'描述'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP_PAGE.status <span class="keyword">is</span> <span class="string">'状态0启用 1禁用'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP_PAGE.create_id <span class="keyword">is</span> <span class="string">'创建人'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP_PAGE.create_time <span class="keyword">is</span> <span class="string">'创建时间'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP_PAGE.modify_id <span class="keyword">is</span> <span class="string">'修改人'</span>;</div><div class="line"><span class="keyword">comment</span> <span class="keyword">on</span> <span class="keyword">column</span> CUSTOM_APP_PAGE.modify_time <span class="keyword">is</span> <span class="string">'修改时间'</span>;</div></pre></td></tr></table></figure>]]></content>
<summary type="html">
<h2 id="自定义功能模块设计"><a href="#自定义功能模块设计" class="headerlink" title="自定义功能模块设计"></a>自定义功能模块设计</h2><p>项目搭建架构图在线地址<a href="http://www.processon.com/view/5850b60de4b05021859c4232">点击查看架构图</a>。</p>
</summary>
<category term="Java" scheme="http://bee.gs/tags/Java/"/>
<category term="架构图" scheme="http://bee.gs/tags/%E6%9E%B6%E6%9E%84%E5%9B%BE/"/>
<category term="自定义" scheme="http://bee.gs/tags/%E8%87%AA%E5%AE%9A%E4%B9%89/"/>
<category term="sql" scheme="http://bee.gs/tags/sql/"/>
</entry>
<entry>
<title>Java-springmvc-项目搭建架构图</title>
<link href="http://bee.gs/2016/11/25/tech/java-springmvc%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA%E6%9E%B6%E6%9E%84%E5%9B%BE%E8%AE%BE%E8%AE%A1/"/>
<id>http://bee.gs/2016/11/25/tech/java-springmvc项目搭建架构图设计/</id>
<published>2016-11-24T16:00:00.000Z</published>
<updated>2017-05-20T01:42:41.977Z</updated>
<content type="html"><![CDATA[<h2 id="Java-springmvc-项目搭建架构图"><a href="#Java-springmvc-项目搭建架构图" class="headerlink" title="Java-springmvc-项目搭建架构图"></a>Java-springmvc-项目搭建架构图</h2><p>项目搭建架构图在线地址<a href="http://www.processon.com/view/582f2488e4b0645c0ec38987" target="_blank" rel="external">点击查看架构图</a></p>
]]></content>
<summary type="html">
<h2 id="Java-springmvc-项目搭建架构图"><a href="#Java-springmvc-项目搭建架构图" class="headerlink" title="Java-springmvc-项目搭建架构图"></a>Java-springmvc-项目搭建架
</summary>
<category term="Java" scheme="http://bee.gs/tags/Java/"/>
<category term="springmvd" scheme="http://bee.gs/tags/springmvd/"/>
<category term="架构图" scheme="http://bee.gs/tags/%E6%9E%B6%E6%9E%84%E5%9B%BE/"/>
<category term="项目搭建" scheme="http://bee.gs/tags/%E9%A1%B9%E7%9B%AE%E6%90%AD%E5%BB%BA/"/>
</entry>
<entry>
<title>java-springmvc+ehcache缓存实现</title>
<link href="http://bee.gs/2016/11/24/tech/java-springmvc+ehcache%E7%BC%93%E5%AD%98%E5%AE%9E%E7%8E%B0/"/>
<id>http://bee.gs/2016/11/24/tech/java-springmvc+ehcache缓存实现/</id>
<published>2016-11-23T16:00:00.000Z</published>
<updated>2016-12-27T14:58:17.249Z</updated>
<content type="html"><![CDATA[<h2 id="ehcache介绍"><a href="#ehcache介绍" class="headerlink" title="ehcache介绍"></a>ehcache介绍</h2><p><a href="http://www.ehcache.org" target="_blank" rel="external">Ehcache</a>是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider(hibernate-ehcache )。当然也可以和mybatis(mybatis-ehcache)结合,它具有内存和磁盘存储,ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便,如果大规模集群还是考虑用memcached或redis。如果是单个应用或者对缓存访问要求很高的应用,用ehcache。</p>
<hr>
<h4 id="ehcache结构设计图"><a href="#ehcache结构设计图" class="headerlink" title="ehcache结构设计图"></a>ehcache结构设计图</h4><p><img src="http://img.blog.csdn.net/20161124234325494" alt="这里写图片描述"></p>
<a id="more"></a>
<p>CacheManager:缓存管理器,一般单例模式,当然也可以多个实例,里面主要存放各个缓存区域Cache<br>Cache:所有cache都实现了Ehcache接口,类似一个HashMap,里面存放着各种键值对element,每个cache都可以设置存活时间,访问间歇时间等。<br>element:单条缓存数据的组成单位,由key和value组成</p>
<h4 id="Cache的元素的属性"><a href="#Cache的元素的属性" class="headerlink" title="Cache的元素的属性"></a>Cache的元素的属性</h4><ol>
<li>name:缓存名称。 </li>
<li>maxElementsInMemory:缓存最大个数。 </li>
<li>eternal:对象是否永久有效,一但设置了,timeout将不起作用。 </li>
<li>timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。 </li>
<li>timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。 </li>
<li>overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中</li>
<li>diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。 </li>
<li>maxElementsOnDisk:硬盘最大缓存个数。 </li>
<li>diskPersistent:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false. </li>
<li>diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。 </li>
<li>memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。 </li>
<li>clearOnFlush:内存数量最大时是否清除。 </li>
</ol>
<h4 id="spring结合ehcache"><a href="#spring结合ehcache" class="headerlink" title="spring结合ehcache"></a>spring结合ehcache</h4><p>1、配置所需的相关jar包<br><figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div></pre></td><td class="code"><pre><div class="line"><span class="comment"><!--缓存start--></span></div><div class="line"><span class="comment"><!--ehcache缓存核心包--></span></div><div class="line"> <span class="tag"><<span class="name">dependency</span>></span></div><div class="line"> <span class="tag"><<span class="name">groupId</span>></span>net.sf.ehcache<span class="tag"></<span class="name">groupId</span>></span></div><div class="line"> <span class="tag"><<span class="name">artifactId</span>></span>ehcache-core<span class="tag"></<span class="name">artifactId</span>></span></div><div class="line"> <span class="tag"><<span class="name">version</span>></span>2.6.9<span class="tag"></<span class="name">version</span>></span></div><div class="line"> <span class="tag"></<span class="name">dependency</span>></span></div><div class="line"> <span class="comment"><!--做ehcache监控用的,mvn仓库里没有需要下载ehcache</span></div><div class="line">的监控插件ehcache-monitor-kit-1.0.3,从里面提供的lib复制出来,后面会有相关介绍--></div><div class="line"> <span class="tag"><<span class="name">dependency</span>></span></div><div class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.terracotta<span class="tag"></<span class="name">groupId</span>></span></div><div class="line"> <span class="tag"><<span class="name">artifactId</span>></span>ehcache-probe<span class="tag"></<span class="name">artifactId</span>></span></div><div class="line"> <span class="tag"><<span class="name">version</span>></span>1.0.3<span class="tag"></<span class="name">version</span>></span></div><div class="line"> <span class="tag"></<span class="name">dependency</span>></span></div><div class="line"> <span class="comment"><!--spring注解对ehcache的操作--></span></div><div class="line"> <span class="tag"><<span class="name">dependency</span>></span></div><div class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.googlecode.ehcache-spring-annotations<span class="tag"></<span class="name">groupId</span>></span></div><div class="line"> <span class="tag"><<span class="name">artifactId</span>></span>ehcache-spring-annotations<span class="tag"></<span class="name">artifactId</span>></span></div><div class="line"> <span class="tag"><<span class="name">version</span>></span>1.2.0<span class="tag"></<span class="name">version</span>></span></div><div class="line"> <span class="tag"></<span class="name">dependency</span>></span></div><div class="line"> <span class="comment"><!--end--></span></div></pre></td></tr></table></figure></p>
<p>2、配置ehcache和spring结合时的相关配置文件,ehcache.xsd<a href="http://ehcache.org/ehcache.xsd" target="_blank" rel="external">下载地址</a></p>
<figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div></pre></td><td class="code"><pre><div class="line"><?xml version="1.0" encoding="UTF-8"?></div><div class="line"><span class="tag"><<span class="name">ehcache</span> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></div><div class="line"> <span class="attr">xsi:noNamespaceSchemaLocation</span>=<span class="string">"ehcache.xsd"</span></div><div class="line"> <span class="attr">updateCheck</span>=<span class="string">"true"</span> <span class="attr">monitoring</span>=<span class="string">"autodetect"</span></div><div class="line"> <span class="attr">dynamicConfig</span>=<span class="string">"true"</span>></div><div class="line"> <span class="comment"><!-- 默认缓存配置. 自动失效:最后一次访问时间间隔300秒失效,若没有访问过自创建时间600秒失效。--></span></div><div class="line"> <span class="tag"><<span class="name">defaultCache</span> <span class="attr">maxEntriesLocalHeap</span>=<span class="string">"1000"</span></span></div><div class="line"> <span class="attr">eternal</span>=<span class="string">"false"</span></div><div class="line"> <span class="attr">timeToIdleSeconds</span>=<span class="string">"300"</span></div><div class="line"> <span class="attr">timeToLiveSeconds</span>=<span class="string">"600"</span></div><div class="line"> <span class="attr">overflowToDisk</span>=<span class="string">"true"</span></div><div class="line"> <span class="attr">statistics</span>=<span class="string">"true"</span>/></div><div class="line"></div><div class="line"> <span class="comment"><!-- 系统缓存 --></span></div><div class="line"> <span class="tag"><<span class="name">cache</span> <span class="attr">name</span>=<span class="string">"sysCache"</span> <span class="attr">maxEntriesLocalHeap</span>=<span class="string">"1000"</span></span></div><div class="line"> <span class="attr">eternal</span>=<span class="string">"true"</span></div><div class="line"> <span class="attr">overflowToDisk</span>=<span class="string">"true"</span></div><div class="line"> <span class="attr">statistics</span>=<span class="string">"true"</span>/></div><div class="line"></div><div class="line"> <span class="comment"><!-- 用户缓存 --></span></div><div class="line"> <span class="tag"><<span class="name">cache</span> <span class="attr">name</span>=<span class="string">"userCache"</span></span></div><div class="line"> <span class="attr">maxEntriesLocalHeap</span>=<span class="string">"1000"</span></div><div class="line"> <span class="attr">eternal</span>=<span class="string">"true"</span></div><div class="line"> <span class="attr">overflowToDisk</span>=<span class="string">"true"</span></div><div class="line"> <span class="attr">statistics</span>=<span class="string">"true"</span>/></div><div class="line"><span class="comment"><!--配置ehcache缓存监控的相关地址,端口--></span></div><div class="line"> <span class="tag"><<span class="name">cacheManagerPeerListenerFactory</span></span></div><div class="line"> <span class="attr">class</span>=<span class="string">"org.terracotta.ehcachedx.monitor.probe.ProbePeerListenerFactory"</span></div><div class="line"> <span class="attr">properties</span>=<span class="string">"monitorAddress=localhost, monitorPort=9889,</span></div><div class="line"> memoryMeasurement=true" /></div><div class="line"></div><div class="line"><span class="tag"></<span class="name">ehcache</span>></span></div></pre></td></tr></table></figure>
<p>springmvc对ehcache的初始化配置</p>
<figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div></pre></td><td class="code"><pre><div class="line"><?xml version="1.0" encoding="UTF-8"?></div><div class="line"><span class="tag"><<span class="name">beans</span> <span class="attr">xmlns</span>=<span class="string">"http://www.springframework.org/schema/beans"</span></span></div><div class="line"> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></div><div class="line"> <span class="attr">xmlns:cache</span>=<span class="string">"http://www.springframework.org/schema/cache"</span></div><div class="line"> <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://www.springframework.org/schema/beans</span></div><div class="line"> http://www.springframework.org/schema/beans/spring-beans-3.0.xsd</div><div class="line"> http://www.springframework.org/schema/cache</div><div class="line"> http://www.springframework.org/schema/cache/spring-cache-3.2.xsd"></div><div class="line"><span class="comment"><!-- 启用缓存注解功能--></span></div><div class="line"> <span class="tag"><<span class="name">cache:annotation-driven</span> <span class="attr">cache-manager</span>=<span class="string">"ehcacheManager"</span>/></span></div><div class="line"> </div><div class="line"><span class="comment"><!-- 基于spring实现的缓存管理器--></span></div><div class="line"> <span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"ehcacheManager"</span> <span class="attr">class</span>=<span class="string">"org.springframework.cache.ehcache.EhCacheCacheManager"</span>></span></div><div class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"cacheManager"</span> <span class="attr">ref</span>=<span class="string">"cacheManagerFactory"</span>/></span></div><div class="line"> <span class="tag"></<span class="name">bean</span>></span></div><div class="line"> </div><div class="line"> <span class="comment"><!--加载ehcache的相关配置--></span></div><div class="line"> <span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"cacheManagerFactory"</span> <span class="attr">class</span>=<span class="string">"org.springframework.cache.ehcache.EhCacheManagerFactoryBean"</span>></span></div><div class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"configLocation"</span> <span class="attr">value</span>=<span class="string">"classpath:cache/ehcache.xml"</span>/></span></div><div class="line"> <span class="tag"></<span class="name">bean</span>></span></div><div class="line"> </div><div class="line"><span class="comment"><!--创建工具类ApplicationUtil,以便普通class根据bean id动态获取spring管理的bean--></span></div><div class="line"> <span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"applicationUtil"</span> <span class="attr">class</span>=<span class="string">"com.personal.core.utils.ApplicationUtil"</span>></span><span class="tag"></<span class="name">bean</span>></span></div><div class="line"></div><div class="line"></div><div class="line"><span class="tag"></<span class="name">beans</span>></span></div></pre></td></tr></table></figure>
<p>3、实现动态获取bean的工具类ApplicationUtil</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">package</span> com.personal.core.utils;</div><div class="line"></div><div class="line"><span class="keyword">import</span> org.springframework.beans.BeansException;</div><div class="line"><span class="keyword">import</span> org.springframework.context.ApplicationContext;</div><div class="line"><span class="keyword">import</span> org.springframework.context.ApplicationContextAware;</div><div class="line"></div><div class="line"><span class="comment">/**</span></div><div class="line"> * 注释</div><div class="line"> *</div><div class="line"> * <span class="doctag">@author</span>: coding99</div><div class="line"> * <span class="doctag">@Date</span>: 16-11-24</div><div class="line"> * <span class="doctag">@Time</span>: 下午8:05</div><div class="line"> */</div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ApplicationUtil</span> <span class="keyword">implements</span> <span class="title">ApplicationContextAware</span></span>{</div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> ApplicationContext applicationContext;</div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setApplicationContext</span><span class="params">(ApplicationContext applicationContext)</span> <span class="keyword">throws</span> BeansException </span>{</div><div class="line"> ApplicationUtil.applicationContext = applicationContext;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title">getBean</span><span class="params">(String name)</span></span>{</div><div class="line"> <span class="keyword">return</span> applicationContext.getBean(name);</div><div class="line"> }</div><div class="line"></div><div class="line">}</div></pre></td></tr></table></figure>
<p>5、实现动态创建cache缓存块的工具类EHCacheUtils</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div><div class="line">141</div><div class="line">142</div><div class="line">143</div><div class="line">144</div><div class="line">145</div><div class="line">146</div><div class="line">147</div><div class="line">148</div><div class="line">149</div><div class="line">150</div><div class="line">151</div><div class="line">152</div><div class="line">153</div><div class="line">154</div><div class="line">155</div><div class="line">156</div><div class="line">157</div><div class="line">158</div><div class="line">159</div><div class="line">160</div><div class="line">161</div><div class="line">162</div><div class="line">163</div><div class="line">164</div><div class="line">165</div><div class="line">166</div><div class="line">167</div><div class="line">168</div><div class="line">169</div><div class="line">170</div><div class="line">171</div><div class="line">172</div><div class="line">173</div><div class="line">174</div><div class="line">175</div><div class="line">176</div><div class="line">177</div><div class="line">178</div><div class="line">179</div><div class="line">180</div><div class="line">181</div><div class="line">182</div><div class="line">183</div><div class="line">184</div><div class="line">185</div><div class="line">186</div><div class="line">187</div><div class="line">188</div><div class="line">189</div><div class="line">190</div><div class="line">191</div><div class="line">192</div><div class="line">193</div><div class="line">194</div><div class="line">195</div><div class="line">196</div><div class="line">197</div><div class="line">198</div><div class="line">199</div><div class="line">200</div><div class="line">201</div><div class="line">202</div><div class="line">203</div><div class="line">204</div><div class="line">205</div><div class="line">206</div><div class="line">207</div><div class="line">208</div><div class="line">209</div><div class="line">210</div><div class="line">211</div><div class="line">212</div><div class="line">213</div><div class="line">214</div><div class="line">215</div><div class="line">216</div><div class="line">217</div><div class="line">218</div><div class="line">219</div><div class="line">220</div><div class="line">221</div><div class="line">222</div><div class="line">223</div><div class="line">224</div><div class="line">225</div><div class="line">226</div><div class="line">227</div><div class="line">228</div><div class="line">229</div><div class="line">230</div><div class="line">231</div><div class="line">232</div><div class="line">233</div><div class="line">234</div><div class="line">235</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">package</span> com.personal.core.utils;</div><div class="line"><span class="keyword">import</span> net.sf.ehcache.Cache;</div><div class="line"><span class="keyword">import</span> net.sf.ehcache.CacheManager;</div><div class="line"><span class="keyword">import</span> net.sf.ehcache.Element;</div><div class="line"><span class="keyword">import</span> org.springframework.cache.ehcache.EhCacheCacheManager;</div><div class="line"></div><div class="line"><span class="keyword">import</span> java.util.List;</div><div class="line"></div><div class="line"><span class="comment">/**</span></div><div class="line"> * 注释</div><div class="line"> *</div><div class="line"> * <span class="doctag">@author</span>: coding99</div><div class="line"> * <span class="doctag">@Date</span>: 16-11-24</div><div class="line"> * <span class="doctag">@Time</span>: 下午8:03</div><div class="line"> */</div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">EHCacheUtils</span> </span>{</div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> CacheManager cacheManager = <span class="keyword">null</span>;</div><div class="line"></div><div class="line"> <span class="keyword">static</span> {</div><div class="line"> EHCacheUtils.initCacheManager();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 初始化缓存管理容器</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> CacheManager <span class="title">initCacheManager</span><span class="params">()</span> </span>{</div><div class="line"></div><div class="line"> <span class="keyword">try</span>{</div><div class="line"> <span class="keyword">if</span>(cacheManager == <span class="keyword">null</span>) {</div><div class="line"> EhCacheCacheManager ehCacheCacheManager = (EhCacheCacheManager)ApplicationUtil.getBean(<span class="string">"ehcacheManager"</span>);</div><div class="line"> cacheManager = ehCacheCacheManager.getCacheManager();</div><div class="line"> }</div><div class="line"> }<span class="keyword">catch</span> (Exception e) {</div><div class="line"> e.printStackTrace();</div><div class="line"> }</div><div class="line"> <span class="keyword">return</span> cacheManager;</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 初始化内存块</div><div class="line"> * <span class="doctag">@param</span> cacheName</div><div class="line"> * <span class="doctag">@param</span> maxElementsInMemory</div><div class="line"> * <span class="doctag">@param</span> overflowToDisk</div><div class="line"> * <span class="doctag">@param</span> eternal</div><div class="line"> * <span class="doctag">@param</span> timeToIdleSeconds</div><div class="line"> * <span class="doctag">@param</span> timeToLiveSeconds</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Cache <span class="title">initCache</span><span class="params">(String cacheName,<span class="keyword">int</span> maxElementsInMemory,<span class="keyword">boolean</span> overflowToDisk,<span class="keyword">boolean</span> eternal,<span class="keyword">long</span> timeToLiveSeconds,<span class="keyword">long</span> timeToIdleSeconds)</span> </span>{</div><div class="line"></div><div class="line"> Cache cache = cacheManager.getCache(cacheName);</div><div class="line"></div><div class="line"> <span class="keyword">try</span> {</div><div class="line"></div><div class="line"> <span class="keyword">if</span>(<span class="keyword">null</span> == cache) {</div><div class="line"> cache = <span class="keyword">new</span> Cache(cacheName,maxElementsInMemory,overflowToDisk,eternal,timeToLiveSeconds,timeToIdleSeconds);</div><div class="line"> cacheManager.addCache(cache);</div><div class="line"> }</div><div class="line"></div><div class="line"> } <span class="keyword">catch</span> (Exception e) {</div><div class="line"> e.printStackTrace();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">return</span> cache;</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 初始化内存块</div><div class="line"> * <span class="doctag">@param</span> cacheName</div><div class="line"> * <span class="doctag">@param</span> timeToIdleSeconds</div><div class="line"> * <span class="doctag">@param</span> timeToLiveSeconds</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Cache <span class="title">initCache</span><span class="params">(String cacheName,<span class="keyword">long</span> timeToLiveSeconds,<span class="keyword">long</span> timeToIdleSeconds)</span> </span>{</div><div class="line"></div><div class="line"> <span class="keyword">return</span> initCache(cacheName, EHCacheConfig.MAX_ELEMENTS_IN_MEMORY, EHCacheConfig.OVER_FLOW_TO_DISK,</div><div class="line"> EHCacheConfig.ETERNAL,timeToLiveSeconds,timeToIdleSeconds);</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 移除缓存</div><div class="line"> * <span class="doctag">@param</span> cacheName</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">removeCache</span><span class="params">(String cacheName)</span> </span>{</div><div class="line"> checkCacheManager();</div><div class="line"> Cache cache = cacheManager.getCache(cacheName);</div><div class="line"> <span class="keyword">if</span>(<span class="keyword">null</span> != cache) {</div><div class="line"> cacheManager.removeCache(cacheName);</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> *</div><div class="line"> * 获取所有的cache名称</div><div class="line"> *</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> */</div><div class="line"></div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String[] getAllCaches() {</div><div class="line"> checkCacheManager();</div><div class="line"> <span class="keyword">return</span> cacheManager.getCacheNames();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 移除所有cache</div><div class="line"> */</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">removeAllCache</span><span class="params">()</span> </span>{</div><div class="line"> checkCacheManager();</div><div class="line"> cacheManager.removalAll();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 初始化缓存</div><div class="line"> *</div><div class="line"> * <span class="doctag">@param</span> cacheName</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Cache <span class="title">initCache</span><span class="params">(String cacheName)</span> </span>{</div><div class="line"></div><div class="line"> checkCacheManager();</div><div class="line"> <span class="keyword">if</span>(<span class="keyword">null</span> == cacheManager.getCache(cacheName)) {</div><div class="line"> cacheManager.addCache(cacheName);</div><div class="line"> }</div><div class="line"> <span class="keyword">return</span> cacheManager.getCache(cacheName);</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 添加缓存</div><div class="line"> * <span class="doctag">@param</span> cache 缓存块</div><div class="line"> * <span class="doctag">@param</span> key 关键字</div><div class="line"> * <span class="doctag">@param</span> value 值</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">put</span><span class="params">(Cache cache,Object key, Object value)</span> </span>{</div><div class="line"> checkCache(cache);</div><div class="line"> Element element = <span class="keyword">new</span> Element(key,value);</div><div class="line"> cache.put(element);</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 获取值</div><div class="line"> * <span class="doctag">@param</span> cache 缓存块</div><div class="line"> * <span class="doctag">@param</span> key</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Object <span class="title">get</span><span class="params">(Cache cache,Object key)</span> </span>{</div><div class="line"> checkCache(cache);</div><div class="line"> Element element = cache.get(key);</div><div class="line"> <span class="keyword">if</span>(<span class="keyword">null</span> == element) {</div><div class="line"> <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line"> }</div><div class="line"> <span class="keyword">return</span> element.getObjectValue();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 移除key</div><div class="line"> * <span class="doctag">@param</span> cache 缓存块</div><div class="line"> * <span class="doctag">@param</span> key</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">remove</span><span class="params">(Cache cache,String key)</span> </span>{</div><div class="line"> checkCache(cache);</div><div class="line"> cache.remove(key);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 移除所有元素</div><div class="line"> * <span class="doctag">@param</span> cache 缓存块</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">removeAllKey</span><span class="params">(Cache cache)</span> </span>{</div><div class="line"> checkCache(cache);</div><div class="line"> cache.removeAll();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 获取 所有的key</div><div class="line"> * <span class="doctag">@param</span> cache 缓存块</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> List <span class="title">getKeys</span><span class="params">(Cache cache)</span> </span>{</div><div class="line"> checkCache(cache);</div><div class="line"> <span class="keyword">return</span> cache.getKeys();</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 检测内存管理器是否初始化</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">checkCacheManager</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">if</span>(<span class="keyword">null</span> == cacheManager) {</div><div class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"调用前请先初始化CacheManager值:EHCacheUtil.initCacheManager"</span>);</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 检查内存块是否存在</div><div class="line"> * <span class="doctag">@param</span> cache</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">checkCache</span><span class="params">(Cache cache)</span> </span>{</div><div class="line"> <span class="keyword">if</span>(<span class="keyword">null</span> == cache) {</div><div class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> IllegalArgumentException(<span class="string">"调用前请先初始化Cache值:EHCacheUtil.initCache(参数)"</span>);</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> *</div><div class="line"> * <span class="doctag">@param</span> args</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> </span>{</div><div class="line"></div><div class="line"> Cache cache1 = EHCacheUtils.initCache(<span class="string">"cache1"</span>, <span class="number">60</span>, <span class="number">30</span>);</div><div class="line"> EHCacheUtils.put(cache1, <span class="string">"A"</span>, <span class="string">"a"</span>);</div><div class="line"> Cache cache2 = EHCacheUtils.initCache(<span class="string">"cache2"</span>, <span class="number">50</span>, <span class="number">20</span>);</div><div class="line"> EHCacheUtils.put(cache2, <span class="string">"A"</span>, <span class="string">"b"</span>);</div><div class="line"></div><div class="line"> System.out.println(EHCacheUtils.cacheManager.getCache(<span class="string">"cache1"</span>));</div><div class="line"> System.out.println(EHCacheUtils.cacheManager.getCache(<span class="string">"cache2"</span>));</div><div class="line"> System.out.println(EHCacheUtils.cacheManager.getCache(<span class="string">"sysCache"</span>));</div><div class="line"> System.out.println(EHCacheUtils.cacheManager.getCache(<span class="string">"userCache"</span>));</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line">}</div></pre></td></tr></table></figure>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">package</span> com.personal.core.utils;</div><div class="line"></div><div class="line"><span class="comment">/**</span></div><div class="line"> * 注释</div><div class="line"> *</div><div class="line"> * <span class="doctag">@author</span>: coding99</div><div class="line"> * <span class="doctag">@Date</span>: 16-11-24</div><div class="line"> * <span class="doctag">@Time</span>: 下午8:03</div><div class="line"> */</div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">EHCacheConfig</span> </span>{</div><div class="line"></div><div class="line"> <span class="comment">//元素最大数量</span></div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">int</span> MAX_ELEMENTS_IN_MEMORY = <span class="number">1000</span>;</div><div class="line"> <span class="comment">//是否把溢出数据持久化到硬盘</span></div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">boolean</span> OVER_FLOW_TO_DISK = <span class="keyword">true</span>;</div><div class="line"> <span class="comment">//是否会死亡</span></div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">boolean</span> ETERNAL = <span class="keyword">false</span>;</div><div class="line"> <span class="comment">//缓存间歇时间</span></div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">int</span> TIME_TO_IDLE_SECONDS = <span class="number">300</span>;</div><div class="line"> <span class="comment">//缓存存活时间</span></div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">int</span> TIME_TO_LIVE_SECONDS = <span class="number">600</span>;</div><div class="line"> <span class="comment">//是否需要持久化到硬盘</span></div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">boolean</span> DISK_PERSISTENT = <span class="keyword">false</span>;</div><div class="line"> <span class="comment">//内存存取策略</span></div><div class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String MEMORY_STORE_EVICTION_POLICY = <span class="string">"LRU"</span>;</div><div class="line"></div><div class="line">}</div></pre></td></tr></table></figure>
<p>6、基于spring注解的的ehcache的用法<br> 使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”。下面是几个使用参数作为key的示例</p>
<ul>
<li>@Cacheable可作用与类或者方法上,主要用于把返回的数据存入相应的缓存块里</li>
<li>@CacheEvict主要用于在方法执行前或者执行后清除指定缓存块里的相应元素</li>
<li>相关属性请百度相应的用法</li>
</ul>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div></pre></td><td class="code"><pre><div class="line"><span class="meta">@Cacheable</span>(value=<span class="string">"userCache"</span>, key=<span class="string">"#id"</span>)</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> User <span class="title">find</span><span class="params">(Integer id)</span> </span>{</div><div class="line"></div><div class="line"> returnnull;</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> </div><div class="line"> <span class="meta">@Cacheable</span>(value=<span class="string">"userCache"</span>, key=<span class="string">"#p0"</span>)</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> User <span class="title">find</span><span class="params">(Integer id)</span> </span>{</div><div class="line"></div><div class="line"> returnnull;</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> </div><div class="line"> <span class="meta">@Cacheable</span>(value=<span class="string">"userCache"</span>, key=<span class="string">"#user.id"</span>)</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> User <span class="title">find</span><span class="params">(User user)</span> </span>{</div><div class="line"></div><div class="line"> returnnull;</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> </div><div class="line"></div><div class="line"> <span class="meta">@Cacheable</span>(value=<span class="string">"userCache"</span>, key=<span class="string">"#p0.id"</span>)</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> User <span class="title">find</span><span class="params">(User user)</span> </span>{</div><div class="line"></div><div class="line"> <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="meta">@Cacheable</span>({<span class="string">"cache1"</span>, <span class="string">"cache2"</span>})<span class="comment">//Cache是发生在cache1和cache2上的</span></div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> User <span class="title">find</span><span class="params">(Integer id)</span> </span>{</div><div class="line"></div><div class="line"> <span class="keyword">return</span> <span class="keyword">null</span>;</div><div class="line"></div><div class="line"> } </div><div class="line"> </div><div class="line"><span class="meta">@CacheEvict</span>(value=<span class="string">"userCache"</span>, beforeInvocation=<span class="keyword">true</span>)</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">delete</span><span class="params">(Integer id)</span> </span>{</div><div class="line"></div><div class="line"> System.out.println(<span class="string">"delete user by id: "</span> + id);</div><div class="line"></div><div class="line"> }</div></pre></td></tr></table></figure>
<h4 id="ehcache监控"><a href="#ehcache监控" class="headerlink" title="ehcache监控"></a>ehcache监控</h4><p>监控 ehcache缓存:</p>
<p>1.<a href="http://terracotta.org/downloads/open-source/destination?name=ehcache-monitor-kit-1.0.3-distribution.tar.gz&bucket=tcdistributions&file=ehcache-monitor-kit-1.0.3-distribution.tar.gz" target="_blank" rel="external">下载地址</a></p>
<p>2.解压缩到目录下,复制ehcache-monitor-kit-1.0.0\lib\ehcache-probe-1.0.0.jar到项目里面,如上面的通过pom.xml文件引入等方式</p>
<p>3.将以下配置copy的ehcache.xml文件的ehcache标签中</p>
<figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line"><span class="tag"><<span class="name">cacheManagerPeerListenerFactory</span></span></div><div class="line"> <span class="attr">class</span>=<span class="string">"org.terracotta.ehcachedx.monitor.probe.ProbePeerListenerFactory"</span></div><div class="line"> <span class="attr">properties</span>=<span class="string">"monitorAddress=localhost, monitorPort=9889"</span> /></div></pre></td></tr></table></figure>
<p>如果有提示报错,请对properties里面的元素做换行或者空格处理,具体也不知道为啥</p>
<p>4.在\ehcache-monitor-kit-1.0.0\etc\ehcache-monitor.conf中可以配置监控的ip和端口号。<br>如把相应的#去掉</p>
<p>5.删除 startup.bat中的行 -j %PRGDIR%\etc\jetty.xml<br>启动被监控的web application和ehcache-monitor-kit-1.0.0\bin目录下的startup.bat(在windows环境下)</p>
<p>6.在浏览器中输入 <a href="http://localhost:9889/monitor/即可开始监控。" target="_blank" rel="external">http://localhost:9889/monitor/即可开始监控。</a><br><img src="http://img.blog.csdn.net/20161128202649310" alt="这里写图片描述"></p>
]]></content>
<summary type="html">
<h2 id="ehcache介绍"><a href="#ehcache介绍" class="headerlink" title="ehcache介绍"></a>ehcache介绍</h2><p><a href="http://www.ehcache.org">Ehcache</a>是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider(hibernate-ehcache )。当然也可以和mybatis(mybatis-ehcache)结合,它具有内存和磁盘存储,ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便,如果大规模集群还是考虑用memcached或redis。如果是单个应用或者对缓存访问要求很高的应用,用ehcache。</p>
<hr>
<h4 id="ehcache结构设计图"><a href="#ehcache结构设计图" class="headerlink" title="ehcache结构设计图"></a>ehcache结构设计图</h4><p><img src="http://img.blog.csdn.net/20161124234325494" alt="这里写图片描述"></p>
</summary>
<category term="Java" scheme="http://bee.gs/tags/Java/"/>
<category term="springmvc" scheme="http://bee.gs/tags/springmvc/"/>
<category term="ehcache" scheme="http://bee.gs/tags/ehcache/"/>
<category term="缓存" scheme="http://bee.gs/tags/%E7%BC%93%E5%AD%98/"/>
</entry>
<entry>
<title>Ubuntu-Nginx+Tomcat+Redis集群配置</title>
<link href="http://bee.gs/2016/10/24/tech/ubuntu-Nginx+Tomcat+redis%E9%9B%86%E7%BE%A4%E9%85%8D%E7%BD%AE/"/>
<id>http://bee.gs/2016/10/24/tech/ubuntu-Nginx+Tomcat+redis集群配置/</id>
<published>2016-10-24T14:54:00.000Z</published>
<updated>2016-12-27T14:58:17.249Z</updated>
<content type="html"><![CDATA[<h2 id="Nginx-安装及配置"><a href="#Nginx-安装及配置" class="headerlink" title="Nginx 安装及配置"></a>Nginx 安装及配置</h2><blockquote>
<p>简介:<br>中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。Ngnix是一个负载均衡服务器,其特点是占有内存少,并发能力强<br>nginx一般用来做静态服务器,本身不具备动态解析功能,需要结合其它插件或软件使用,如tomcat,php等,在性能方面:如果,不做集群调优等情况下,tomcat(tomcat是动态服务器,需要依赖于jdk)一般支持并发100个左右,而nginx在静态方面可以达到几万并发。</p>
</blockquote>
<hr>
<a id="more"></a>
<blockquote>
<p>nginx(下载:<a href="http://nginx.org/en/download.html)nginx-1.9.3.tar.gz" target="_blank" rel="external">http://nginx.org/en/download.html)nginx-1.9.3.tar.gz</a></p>
<p>模块依赖性<br>gzip模块需要 zlib 库( 下载: <a href="http://www.zlib.net/)zlib-1.2.8.tar.gz" target="_blank" rel="external">http://www.zlib.net/)zlib-1.2.8.tar.gz</a> :<br>gzip可以加快我们网站打开的速度,原理是通过服务器压缩,客户端浏览器快速解压,大大的节省了网站的流量,提高了网页打开的速度,<br>但与此同时也会增加cpu的开销。<br>rewrite模块需要 pcre 库 ( 下载: <a href="http://www.pcre.org/" target="_blank" rel="external">http://www.pcre.org/</a>) pcre-8.38.tar.gz :<br>rewrite主要时实现url的重写,通过pcre的perl兼容正则表达式进行匹配,通过rewrite规则,可实现规范的URL,或者动态的URL地址需要伪装成静态的HTML,便于搜索引擎抓到,旧URL可以通过rewrite跳转到新URL上。<br>ssl 功能需要openssl库( 下载: <a href="http://www.openssl.org/" target="_blank" rel="external">http://www.openssl.org/</a> )openssl-1.1.0.tar.gz:<br>openssl可以生成数字证书,自带功能加密功能,增加nginx的ssl安全性。</p>
</blockquote>
<p>#安装:<br><img src="http://img.blog.csdn.net/20160910100926952?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="img1"><br>sudo su切换到root用户<br>1、下载完包后,我们把它们移动到一个nginx的文件夹里(mv openssl-1.1.0.tar.gz nginx-1.9.3.tar.gz pcre-8.38.tar.gz zlib-1.2.8.tar.gz /opt/nginx),再解压(tar -zxvf openssl-1.1.0.tar.gz nginx-1.9.3.tar.gz pcre-8.38.tar.gz zlib-1.2.8.tar.gz)<br>2、安装pcre(cd pcre-8.38 ./configure make&make install)<br>3、安装zlib(cd zlib-1.2.8 ./configure make&make install)<br>4、安装openssl(cd openssl-1.1.0 ./config make&make install)<br>5、安装nginx(cd nginx-1.9.3 ./configure make&make install) 执行./configure如果提示找不到上面安装的相关模块时,则可以使用一下命令<br>用–with-openssl=<openssl_dir>、–with-pcre=<pcre_dir>、–with-zlib=<zlib_dir>指定依赖的模块目录。如./configure –width-openssl=/opt/nginx<br>/nginx-1.9.3 在make&make install, 如果编译通过,则默认安装即可。</zlib_dir></pcre_dir></openssl_dir></p>
<p>使用:(注意,nignx安装后的使用目录是/usr/local/nginx/)下面的说明用开始安装的目录也行。<br><img src="http://img.blog.csdn.net/20160910103040861?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="img2"></p>
<p>我们切换到这个目录下,通过./nginx启动nginx服务器,浏览器输入<a href="http://localhost,显示以下信息,则安装成功。" target="_blank" rel="external">http://localhost,显示以下信息,则安装成功。</a><br><img src="http://img.blog.csdn.net/20160910103622136?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="img3"><br>如果要要重启nginx,使用./nginx -s reload即可<br>关闭方式有以下几种</p>
<p>1、直接输入 ./nginx -s stop</p>
<p>2、 查询nginx主进程号</p>
<p> ps -ef | grep nginx</p>
<p> 从容停止 kill -QUIT 主进程号</p>
<p> 快速停止 kill -TERM 主进程号</p>
<p> 强制停止 kill -9 nginx</p>
<p>若nginx.conf配置了pid文件路径,如果没有,则在logs目录下</p>
<p>kill -信号类型 /usr/local/nginx/logs/nginx.pid</p>
<p>判断配置文件是否正确可用./nginx -t</p>
<p>配置文件介绍:<br><img src="http://img.blog.csdn.net/20160910104859002?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="img4"></p>
<p>除了nginx.conf,其余配置文件,一般只需要使用默认提供即可。</p>
<p>nginx.conf</p>
<p>在conf文件下的nginx.conf时主要配置文件,其内容如上图:<br>worker_process表示工作进程的数量,一般设置为cpu的核数(上图没截取到)<br>worker_connections表示每个工作进程的最大连接数(上图没截取到)<br> server{}块定义了虚拟主机<br> listener 监听端口,默认为80<br> server_name监听的域名<br> location{}是用来匹配URI进行配置,URI即语法中的’/uri/‘。location{}配置任何查询,因为<br>素有请求都以/开头。<br>root 指定对应uri的资源查找路径,这里html为相对路径,完整路径为/opt/nginx/nginx-1.9.3/html<br>index指定首页index文件的名称,可用配置多个,以空格分开,如有多个,按配置顺序查找。<br>error_page服务器发生错误请求时候,它会自动根据错误状态码跳转到相应的50页面。<br>mime.types 定义的文件扩展名与文件类型映射关系<br>fastcgi_params ginx配置Fastcgi解析时会调用fastcgi_params配置文件来传递服务器变量,这样CGI中可以获取到这些变量的值。默认传递以下变量:<br>uwsgi_params 与fastcgi_params一样,传递哪些服务器变量,只有前缀不一样,以uwsgi_param开始而非fastcgi_param。<br>scgi_params 与fastcgi_params一样,传递哪些服务器变量,只有前缀不一样,以uwsgi_param开始而非fastcgi_param。<br>koi-utf、koi-win、win-utf<br>这三个文件都是与编码转换映射文件,用于在输出内容到客户端时,将一种编码转换到另一种编码。<br>koi-win: charset_map koi8-r < – > windows-1251<br>koi-utf: charset_map koi8-r < – > utf-8<br>win-utf: charset_map windows-1251 < – > utf-8</p>
<p>Redis 的安装</p>
<p>wget <a href="http://download.redis.io/releases/redis-2.8.9.tar.gz" target="_blank" rel="external">http://download.redis.io/releases/redis-2.8.9.tar.gz</a> 下载软件安装包<br> tar -zxvf redis-2.8.9.tar.gz -c /opt/nginx 解压到指定的目录<br>cd /redis-2.8.9 切换到该目录下<br>sudo make & make install安装redis<br>软件安装完毕,接下来我们可以测试是否安装成功<br><img src="http://img.blog.csdn.net/20160911225943023?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="img5"></p>
<p><img src="http://img.blog.csdn.net/20160911225953788?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="img6"></p>
<p>Tomcat + Redis + Nginx集群配置<br><img src="http://img.blog.csdn.net/20160911234334878?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="img7"><br><img src="http://img.blog.csdn.net/20160911230510843?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="img8"></p>
<p>1、wget <a href="http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.70/bin/apache-tomcat-7.0.70.tar.gz" target="_blank" rel="external">http://mirror.bit.edu.cn/apache/tomcat/tomcat-7/v7.0.70/bin/apache-tomcat-7.0.70.tar.gz</a></p>
<p>2、tar -zxvf apache-tomcat-7.0.70.tar.gz , mv apache-tomcat-7.0.70 tomcat1</p>
<p>3 、tar -zxvf apache-tomcat-7.0.70.tar.gz ,mv apache-tomcat-7.0.70 tomcat2</p>
<p>4、tar -zxvf apache-tomcat-7.0.70.tar.gz, mv apache-tomcat-7.0.70 tomcat3</p>
<p> 5、修改tomcat2里的端口依次为8006 8081 8010 修改tomcat3里的端口依次为8007 8082 8011 </p>
<p>6、之后我们创建一个文件夹test(mkdir test) 再创建一个index(vim index.jsp)内容如下</p>
<figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div></pre></td><td class="code"><pre><div class="line"><span class="tag"><<span class="name">%@</span> <span class="attr">page</span> <span class="attr">language</span>=<span class="string">"java"</span> %></span></div><div class="line"><span class="tag"><<span class="name">html</span>></span></div><div class="line"> <span class="tag"><<span class="name">head</span>></span><span class="tag"><<span class="name">title</span>></span>TomcatA<span class="tag"></<span class="name">title</span>></span><span class="tag"></<span class="name">head</span>></span></div><div class="line"> <span class="tag"><<span class="name">body</span>></span></div><div class="line"></div><div class="line"> <span class="tag"><<span class="name">table</span> <span class="attr">align</span>=<span class="string">"centre"</span> <span class="attr">border</span>=<span class="string">"1"</span>></span></div><div class="line"> <span class="tag"><<span class="name">tr</span>></span></div><div class="line"> <span class="tag"><<span class="name">td</span>></span>Session ID<span class="tag"></<span class="name">td</span>></span></div><div class="line"> <span class="tag"><<span class="name">td</span>></span><span class="tag"><<span class="name">%=</span> <span class="attr">session.getId</span>() %></span><span class="tag"></<span class="name">td</span>></span></div><div class="line"> <span class="tag"></<span class="name">tr</span>></span></div><div class="line"> <span class="tag"><<span class="name">tr</span>></span></div><div class="line"> <span class="tag"><<span class="name">td</span>></span>Created on<span class="tag"></<span class="name">td</span>></span></div><div class="line"> <span class="tag"><<span class="name">td</span>></span><span class="tag"><<span class="name">%=</span> <span class="attr">session.getCreationTime</span>() %></span><span class="tag"></<span class="name">td</span>></span></div><div class="line"> <span class="tag"></<span class="name">tr</span>></span></div><div class="line"> <span class="tag"></<span class="name">table</span>></span></div><div class="line"> <span class="tag"></<span class="name">body</span>></span></div><div class="line"><span class="tag"></<span class="name">html</span>></span></div><div class="line">sessionID:<span class="tag"><<span class="name">%=session.getId()%</span>></span></div><div class="line"><span class="tag"><<span class="name">br</span>></span></div><div class="line">SessionIP:<span class="tag"><<span class="name">%=request.getServerName()%</span>></span></div><div class="line"><span class="tag"><<span class="name">br</span>></span></div><div class="line">SessionPort:<span class="tag"><<span class="name">%=request.getServerPort()%</span>></span></div><div class="line"><span class="tag"><<span class="name">%</span></span></div><div class="line">//为了区分,第二个可以是<span class="attr">222</span></div><div class="line"><span class="attr">out.println</span>("<span class="attr">This</span> <span class="attr">is</span> <span class="attr">Tomcat</span> <span class="attr">Server</span> <span class="attr">1111</span>");</div><div class="line">%></div></pre></td></tr></table></figure>
<p>7、之后分别修改tomcat1 tomcat2 tomcat3的server.xml,在<host>内为其指定web项目的路径</host></p>
<figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line"><span class="tag"><<span class="name">Context</span> <span class="attr">path</span>=<span class="string">""</span> <span class="attr">reloadable</span>=<span class="string">"true"</span> <span class="attr">docBase</span>=<span class="string">"/opt/nginx/test"</span>/></span></div></pre></td></tr></table></figure>
<p>8、cd /usr/local/nginx/conf切换到nignx安装后的目录下,修改nginx.conf(vim nginx.conf)配置文件</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div><div class="line">141</div><div class="line">142</div><div class="line">143</div><div class="line">144</div><div class="line">145</div><div class="line">146</div><div class="line">147</div><div class="line">148</div><div class="line">149</div><div class="line">150</div><div class="line">151</div><div class="line">152</div><div class="line">153</div><div class="line">154</div><div class="line">155</div><div class="line">156</div><div class="line">157</div><div class="line">158</div><div class="line">159</div><div class="line">160</div><div class="line">161</div><div class="line">162</div><div class="line">163</div><div class="line">164</div><div class="line">165</div><div class="line">166</div><div class="line">167</div><div class="line">168</div><div class="line">169</div><div class="line">170</div><div class="line">171</div><div class="line">172</div><div class="line">173</div><div class="line">174</div><div class="line">175</div><div class="line">176</div><div class="line">177</div><div class="line">178</div><div class="line">179</div><div class="line">180</div><div class="line">181</div><div class="line">182</div><div class="line">183</div><div class="line">184</div><div class="line">185</div><div class="line">186</div><div class="line">187</div><div class="line">188</div><div class="line">189</div><div class="line">190</div><div class="line">191</div><div class="line">192</div></pre></td><td class="code"><pre><div class="line"><span class="comment">#user nobody;</span></div><div class="line"> </div><div class="line"><span class="comment"># 进程数,一般这个和cpu核心数相等</span></div><div class="line"> </div><div class="line">worker_processes 2;</div><div class="line"> </div><div class="line"><span class="comment"># 错误日志配置</span></div><div class="line"> </div><div class="line"><span class="comment">#error_log logs/error.log;</span></div><div class="line"> </div><div class="line"><span class="comment">#error_log logs/error.log notice;</span></div><div class="line"> </div><div class="line"><span class="comment">#error_log logs/error.log info;</span></div><div class="line"> </div><div class="line"> <span class="comment"># pid 进程</span></div><div class="line"> </div><div class="line"><span class="comment">#pid logs/nginx.pid;</span></div><div class="line"> </div><div class="line"><span class="comment">#工作模式及连接数上限</span></div><div class="line">events {</div><div class="line"> </div><div class="line"> <span class="comment"># work 进程连接数</span></div><div class="line"> use epoll; </div><div class="line"> worker_connections 2048;</div><div class="line"></div><div class="line"> <span class="comment"># 并发总数是 worker_processes 和 worker_connections 的乘积</span></div><div class="line"> <span class="comment"># 即 max_clients = worker_processes * worker_connections</span></div><div class="line"> <span class="comment"># 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4 为什么</span></div><div class="line"> <span class="comment"># 为什么上面反向代理要除以4,应该说是一个经验值</span></div><div class="line"> <span class="comment"># 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000</span></div><div class="line"> <span class="comment"># worker_connections 值的设置跟物理内存大小有关</span></div><div class="line"> <span class="comment"># 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数</span></div><div class="line"> <span class="comment"># 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右</span></div><div class="line"> <span class="comment"># 我们来看看360M内存的VPS可以打开的文件句柄数是多少:</span></div><div class="line"> <span class="comment"># $ cat /proc/sys/fs/file-max</span></div><div class="line"> <span class="comment"># 输出 34336</span></div><div class="line"> <span class="comment"># 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内</span></div><div class="line"> <span class="comment"># 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置</span></div><div class="line"> <span class="comment"># 使得并发总数小于操作系统可以打开的最大文件数目</span></div><div class="line"> <span class="comment"># 其实质也就是根据主机的物理CPU和内存进行配置</span></div><div class="line"> <span class="comment"># 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。</span></div><div class="line"> <span class="comment"># ulimit -SHn 65535</span></div><div class="line"></div><div class="line">}</div><div class="line"> </div><div class="line"></div><div class="line"> </div><div class="line">http {</div><div class="line"></div><div class="line"> <span class="comment">#设定mime类型,类型由mime.type文件定义</span></div><div class="line"> include mime.types;</div><div class="line"></div><div class="line"> default_type application/octet-stream;</div><div class="line"></div><div class="line"> <span class="comment">#设定日志格式</span></div><div class="line"> <span class="comment">#log_format main '$remote_addr - $remote_user[$time_local] "$request" '</span></div><div class="line"></div><div class="line"> <span class="comment"># '$status $body_bytes_sent"$http_referer" '</span></div><div class="line"></div><div class="line"> <span class="comment"># '"$http_user_agent""$http_x_forwarded_for"';</span></div><div class="line"></div><div class="line"> <span class="comment">#access_log logs/access.log main;</span></div><div class="line"></div><div class="line"> <span class="comment"># 开启高效文件传输模式,调用sendfile 进行文件的传输,但一般为了和网速的io进行平衡,</span></div><div class="line"></div><div class="line"> <span class="comment">#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,</span></div><div class="line"> <span class="comment">#对于普通应用,必须设为 on,</span></div><div class="line"> <span class="comment">#如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,</span></div><div class="line"> <span class="comment">#以平衡磁盘与网络I/O处理速度,降低系统的uptime.</span></div><div class="line"></div><div class="line"> sendfile on;</div><div class="line"></div><div class="line"> <span class="comment">#tcp_nopush on;</span></div><div class="line"></div><div class="line"> <span class="comment">#连接超时时间</span></div><div class="line"> <span class="comment">#keepalive_timeout 0;</span></div><div class="line"></div><div class="line"> keepalive_timeout 65;</div><div class="line"></div><div class="line"> tcp_nodelay on;</div><div class="line"></div><div class="line"> <span class="comment"># 是否开启gzip压缩输出</span></div><div class="line"></div><div class="line"> <span class="comment">#开启zip网页压缩</span></div><div class="line"> gzip on;</div><div class="line"> gzip_min_length 1k;</div><div class="line"> gzip_buffers 4 8k;</div><div class="line"> gzip_http_version 1.1;</div><div class="line"> gzip_types text/plain application/x-javascript text/css application/xml;</div><div class="line"></div><div class="line"> <span class="comment">#设定请求缓冲</span></div><div class="line"> client_header_buffer_size 128k;</div><div class="line"> large_client_header_buffers 4 128k;</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">#负载均衡配置,nginx 是做反向代理的,访问nginx就是在访问负载均衡配置的这个server,这个可以通过log查看</span></div><div class="line"></div><div class="line"> <span class="comment"># 查看的error log 从中可以清晰看到 负载均衡的地址:client: 127.0.0.1, server: localhost,request: "GET /index.jsp # HTTP/1.1", upstream: "http://127.0.0.1:18081/index.jsp", host: "localhost"</span></div><div class="line"></div><div class="line"> upstream localhost{</div><div class="line"></div><div class="line"> <span class="comment">#ip_hash iphash 实现负载均衡,这里使用了轮回的方式实现</span></div><div class="line"></div><div class="line"> <span class="comment"># nginx 转发的后台tomcat服务器配置,以及其权重的配置,权重越大要承载的量越大</span></div><div class="line"></div><div class="line"> <span class="comment">#ip_hash; #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题</span></div><div class="line"> server localhost:8080 weight=1 max_fails=2 fail_timeout=30s;</div><div class="line"></div><div class="line"> server localhost:8081 weight=1 max_fails=2 fail_timeout=30s;</div><div class="line"></div><div class="line"> server localhost:8082 weight=1 max_fails=2 fail_timeout=30s;</div><div class="line"></div><div class="line"> }</div><div class="line"> </div><div class="line"> <span class="comment"># 虚拟主机的配置</span></div><div class="line"> </div><div class="line"> server {</div><div class="line"> </div><div class="line"> <span class="comment"># 就是nginx服务的端口</span></div><div class="line"> </div><div class="line"> listen 80;</div><div class="line"> </div><div class="line"> <span class="comment">#这个就是访问域名</span></div><div class="line"> </div><div class="line"> server_name localhost;</div><div class="line"> </div><div class="line"> <span class="comment"># 字符编码的设置</span></div><div class="line"> </div><div class="line"> charset utf-8;</div><div class="line"> </div><div class="line"></div><div class="line"> <span class="comment">#access_log logs/host.access.log main;</span></div><div class="line"> </div><div class="line"> <span class="comment"># 动静分离,动态的反向到负载均衡的tomcat上</span></div><div class="line"> </div><div class="line"> </div><div class="line"> location / {</div><div class="line"> <span class="comment"># nginx 的根目录,当发送静态请求时会默认到这个目录下去查找</span></div><div class="line"> root /opt/nginx/<span class="built_in">test</span>;</div><div class="line"> <span class="comment">#定义首页索引文件的名称</span></div><div class="line"> index index.html index.htm index.jsp index.do;</div><div class="line"> } </div><div class="line"></div><div class="line"> <span class="comment">#error_page 404 /404.html;</span></div><div class="line"> <span class="comment"># 定义错误提示页面 /50x.html</span></div><div class="line"></div><div class="line"></div><div class="line"> error_page 500 502 503 504 /50x.html;</div><div class="line"></div><div class="line"> location = /50x.html {</div><div class="line"> <span class="comment">#root html;</span></div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment"># 静态页面由 nginx处理</span></div><div class="line"></div><div class="line"> location ~ ^/(images|javascript|js|css|flash|media|static)/ {</div><div class="line"></div><div class="line"> <span class="comment">#过期30天,静态文件不怎么更新,过期可以设大一点,</span></div><div class="line"> <span class="comment">#如果频繁更新,则可以设置得小一点。</span></div><div class="line"></div><div class="line"> <span class="comment">#expires 30d;</span></div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">#jsp,do等页面交由tomcat处理</span></div><div class="line"> location ~ \.(jsp|<span class="keyword">do</span>)$ {</div><div class="line"></div><div class="line"> <span class="comment"># 代理路径,和负载均衡的 upstream localhost 这个localhost路径是一致的,但http是不能忘!</span></div><div class="line"></div><div class="line"> proxy_pass http://localhost;</div><div class="line"> proxy_redirect off; </div><div class="line"> proxy_set_header Host <span class="variable">$host</span>; </div><div class="line"> proxy_set_header X-Real-IP <span class="variable">$remote_addr</span>; </div><div class="line"> proxy_set_header X-Forwarded-For <span class="variable">$proxy_add_x_forwarded_for</span>; </div><div class="line"> client_max_body_size 10m; </div><div class="line"> client_body_buffer_size 128k; </div><div class="line"> proxy_buffers 32 4k; </div><div class="line"> proxy_connect_timeout 3; </div><div class="line"> proxy_send_timeout 30; </div><div class="line"> proxy_read_timeout 30; </div><div class="line"> </div><div class="line"> }</div><div class="line"></div><div class="line"> </div><div class="line"> <span class="comment">#禁止访问 .htxxx 文件</span></div><div class="line"> location ~ /.ht {</div><div class="line"> deny all;</div><div class="line"> }</div><div class="line"> </div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<p>9、cd ../sbin/ 切换到启动命令文件夹下,执行sudo ./nginx -t测试配置文件配置是否有误如果提示成功,我们分别启动tomcat1 tomcat2 tomcat3,<br> 再执行sudo ./nginx 启动nginx,然后访问<a href="http://localhost,不断f5刷新,可以看到访问被分配到不同的tomcat,这样就起到负载均衡的作用,如果" target="_blank" rel="external">http://localhost,不断f5刷新,可以看到访问被分配到不同的tomcat,这样就起到负载均衡的作用,如果</a><br> 我们尝试把tomcat1关掉,访问就被分配到剩下的两个tomcat下,但是有一个问题,就是每次访问不到不同的tomcat,session就发生了变化,<br> 这时后我们可以采用redis来做session共享。</p>
<p>10、Tomcat 结合 Redis做session共享需要jedis-2.8.1.jar commons-pool2-2.4.2.jar tomcat-redis-session-manager-2.0.0.jar这几个包,<br>jedis-2.8.1.jar commons-pool2-2.4.2.jar 可以从<a href="http://mvnrepository.com/" target="_blank" rel="external">http://mvnrepository.com/</a> 上下载, tomcat-redis-session-manager-2.0.0.jar这个包比较<br>麻烦,需要自己用gradle编译,因为tomcat-redis-session-manager的作者把源码开放到git上,打包方式是gradle,编译方式如下:<br> 1、 如果自己系统上没有gradle,请先安装gradle, sudo apt-get install gradle,<br> 2、git clone <a href="https://github.com/jcoleman/tomcat-redis-session-manager.git" target="_blank" rel="external">https://github.com/jcoleman/tomcat-redis-session-manager.git</a><br> 3、修改build.gradle,在signing节点中添加required = false以及删掉或注释掉文件中的sonatype的repository代码即可<br> 4、执行gradle build,编译结束后生成build,在里面的libs文件夹下可以找到 tomcat-redis-session-manager-2.0.0.jar这个包</p>
<p>11、分别把jedis-2.8.1.jar commons-pool2-2.4.2.jar tomcat-redis-session-manager-2.0.0.jar复制到 tomcat1 tomct2 tomcat3的libs目录下,</p>
<p> 再一次修改tomcat1 tomcat2 tomcat3的conf里的 context.xml 文件,在里头的context节点里增加如下内容</p>
<figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div></pre></td><td class="code"><pre><div class="line"></div><div class="line"><span class="tag"><<span class="name">Valve</span> <span class="attr">className</span>=<span class="string">"com.orangefunction.tomcat.redissessions.RedisSessionHandlerValve"</span> /></span></div><div class="line"></div><div class="line"> <span class="tag"><<span class="name">Manager</span> <span class="attr">className</span>=<span class="string">"com.orangefunction.tomcat.redissessions.RedisSessionManager"</span></span></div><div class="line"></div><div class="line"> <span class="attr">host</span>=<span class="string">"localhost"</span></div><div class="line"></div><div class="line"> <span class="attr">port</span>=<span class="string">"6379"</span></div><div class="line"></div><div class="line"> <span class="attr">database</span>=<span class="string">"10"</span></div><div class="line"></div><div class="line"> <span class="attr">maxInactiveInterval</span>=<span class="string">"60"</span>/></div></pre></td></tr></table></figure>
<pre><code>11、最后,启动redis,tomcat1,tomcat2,tomcat3,nginx,访问http://localhost,不断按f5刷新,可以看到都是同样内容,除非关闭浏览器再重新启动才能看到session id的变化,说明已经实现了 tomcat集群和session共享。
</code></pre><p><img src="http://img.blog.csdn.net/20160912001114210?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="img10"></p>
]]></content>
<summary type="html">
<h2 id="Nginx-安装及配置"><a href="#Nginx-安装及配置" class="headerlink" title="Nginx 安装及配置"></a>Nginx 安装及配置</h2><blockquote>
<p>简介:<br>中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。Ngnix是一个负载均衡服务器,其特点是占有内存少,并发能力强<br>nginx一般用来做静态服务器,本身不具备动态解析功能,需要结合其它插件或软件使用,如tomcat,php等,在性能方面:如果,不做集群调优等情况下,tomcat(tomcat是动态服务器,需要依赖于jdk)一般支持并发100个左右,而nginx在静态方面可以达到几万并发。</p>
</blockquote>
<hr>
</summary>
<category term="Ubuntu" scheme="http://bee.gs/tags/Ubuntu/"/>
<category term="Linux" scheme="http://bee.gs/tags/Linux/"/>
<category term="Nginx" scheme="http://bee.gs/tags/Nginx/"/>
<category term="Tomcat" scheme="http://bee.gs/tags/Tomcat/"/>
<category term="Redis - 安装" scheme="http://bee.gs/tags/Redis-%E5%AE%89%E8%A3%85/"/>
</entry>
<entry>
<title>Ubuntu -Jdk-Mysql安装</title>
<link href="http://bee.gs/2016/10/23/tech/ubuntu-jdk-mysql/"/>
<id>http://bee.gs/2016/10/23/tech/ubuntu-jdk-mysql/</id>
<published>2016-10-23T15:23:00.000Z</published>
<updated>2016-12-27T14:58:17.249Z</updated>
<content type="html"><![CDATA[<h2 id="ubuntu下的Jdk-Mysql安装"><a href="#ubuntu下的Jdk-Mysql安装" class="headerlink" title="ubuntu下的Jdk Mysql安装"></a>ubuntu下的Jdk Mysql安装</h2><p> 软件环境 :</p>
<p> 操作系统:Ubuntu 14.04.2 LTS(cat /etc/issue) x86_64(uname -m)</p>
<p> JAVA版本:jdk-7u71-linux-x64.tar.gz</p>
<p> 软件下载地址:<a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html" target="_blank" rel="external">http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html</a></p>
<p> 也可以在线下载(由于oracle下载需要选择确认,所以我们下载时需要设置请求头的Cookie):<br> wget –no-check-certificate –no-cookies –header “Cookie: oraclelicense=accept-securebackup-cookie” <a href="http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-linux-x64.tar.gz" target="_blank" rel="external">http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-linux-x64.tar.gz</a></p>
<a id="more"></a>
<p> 安装软件的方法如下:<br> 1、切换到root用户 sudo su 输入密码<br> 2、mkdir /usr/local/Java 创建jdk存放的文件夹叫java<br> 3、cp jdk-7u71-Linux-x64.tar.gz /usr/local/java 复制jdk到指定文件<br> 4、tar -zxvf jdk-7u71-linux-x64.tar.gz 解压jdk<br> 5、chmod -R 777 /usr/local/java 更改文件夹的权限,让任何操作者都可以访问<br> 6、设置环境变量 ,ubuntu设置环境变量的文件有哪些?</p>
<p> /etc/profile:<br> 在登录时,操作系统定制用户环境时使用的第一个文件,此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。<br>/etc/environment在登录时操作系统使用的第二个文件,系统在读取你自己的profile前,设置环境文件的环境变量;<br>/etc/bashrc<br> —— 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取;<br>~/.profile<br> —— 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,它设置一些环境变量,执行用户的.bashrc文件;<br>~/.bashrc<br> —— 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该文件被读取<br>这时候我们可选择修改/etc/profile文件<br>vim /etc/profile件<br>加入一下环境变量<br>#<br> java enviroment</p>
<p>export JAVA_HOME=/usr/local/java/jdk1.7.0_71</p>
<p>export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$CLASSPATH</p>
<p>export PATH=$JAVA_HOME/bin:$PATH<br>按下esc<br> 输入wq<br> 7、让环境变量立即生效 source /etc/profile<br>8、设置默认JDK<br>sudo<br> update-alternatives –install “/usr/bin/java” “java” “/usr/local/java/jdk1.7.0_71/bin/java” 300</p>
<p>sudo update-alternatives –install “/usr/bin/javac” “javac” “/usr/local/java/jdk1.7.0_71/bin/javac”<br> 300</p>
<p>sudo update-alternatives –install “/usr/bin/javaws” “javaws” “/usr/local/java/jdk1.7.0_71/bin/javaws”<br> 300</p>
<p>9、测试 java -version显示jdk版本配置成功<br>java version “1.7.0_71”</p>
<p>Java(TM) SE Runtime Environment (build 1.7.0_71-b14)</p>
<p>Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)<br>查看环境变量可以echo<br> $JAVA_HOME显示=/usr/local/java/jdk1.7.0_71</p>
<p>ubuntu下的Mysql安装</p>
<p> 1、跟新源,sudo<br> apt-get update<br>2、首先检查系统中是否已经安装了MySQL<br> 在终端输入sudo netstat -tap|grep mysql 如果没有反应则未安装,如果已经安装则显示<br> tcp 0 0 localhost:mysql <em>:</em> LISTEN<br> 3、如果没有安装,则安装MySQL.<br> 在终端输入 sudo apt-get install mysql-server mysql-client<br> 在此安装过程中会让你输入root用户(管理MySQL数据库用户,非Linux系统用户)密码,按照要求输入即可。如下所示<br> 4、如何判断mysql是否安装成功<br> 输入sudo service mysql restart 如果成功则显示mysql启动成功<br> 5、登陆mysql,在终端输入mysql -u root -p 输入刚刚设置的密码即可登陆mysql</p>
<p>ubuntu下的Mysql卸载</p>
<p>Mysql卸载一定要卸载干净,避免再次安装时出现莫名奇妙的错误</p>
<p> 1、sudo apt-get autoremove mysql* –purge<br> 2、sudo rm /var/lib/mysql/ -R<br> 3、sudo rm /etc/mysql/ -R</p>
]]></content>
<summary type="html">
<h2 id="ubuntu下的Jdk-Mysql安装"><a href="#ubuntu下的Jdk-Mysql安装" class="headerlink" title="ubuntu下的Jdk Mysql安装"></a>ubuntu下的Jdk Mysql安装</h2><p> 软件环境 :</p>
<p> 操作系统:Ubuntu 14.04.2 LTS(cat /etc/issue) x86_64(uname -m)</p>
<p> JAVA版本:jdk-7u71-linux-x64.tar.gz</p>
<p> 软件下载地址:<a href="http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html">http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html</a></p>
<p> 也可以在线下载(由于oracle下载需要选择确认,所以我们下载时需要设置请求头的Cookie):<br> wget –no-check-certificate –no-cookies –header “Cookie: oraclelicense=accept-securebackup-cookie” <a href="http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-linux-x64.tar.gz">http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-linux-x64.tar.gz</a></p>
</summary>
<category term="Ubuntu" scheme="http://bee.gs/tags/Ubuntu/"/>
<category term="Linux" scheme="http://bee.gs/tags/Linux/"/>
<category term="Jdk" scheme="http://bee.gs/tags/Jdk/"/>
<category term="Mysql" scheme="http://bee.gs/tags/Mysql/"/>
<category term="安装" scheme="http://bee.gs/tags/%E5%AE%89%E8%A3%85/"/>
</entry>
<entry>
<title>Ubuntu -Sublime-安装</title>
<link href="http://bee.gs/2016/10/22/tech/ubuntu-sublime-install/"/>
<id>http://bee.gs/2016/10/22/tech/ubuntu-sublime-install/</id>
<published>2016-10-21T17:01:00.000Z</published>
<updated>2016-12-27T14:58:17.249Z</updated>
<content type="html"><![CDATA[<h2 id="web前端的开发神器"><a href="#web前端的开发神器" class="headerlink" title="web前端的开发神器"></a>web前端的开发神器</h2><blockquote>
<p><strong>WebStrom和Sublime堪称史上最强的web开发神器:</strong></p>
<p>提供了智能的代码提示,智能补全,各种强大的轻量级的插件支持。WebStrom相对智能一点,但是耗内存大,有时会卡顿现象,界面不简洁,Sublime相对灵活轻巧,界面清爽,功能齐全,插件快速安装等特点。</p>
</blockquote>
<a id="more"></a>
<p>###ubuntu上安装教程:</p>
<blockquote>
<p><strong>1、安装<a href="http://www.sublimetext.com/3" target="_blank" rel="external">Sublime Text 3</a> 及常用的神器插件</strong><br>首先添加sublime text 3的仓库:<code>sudo add-apt-repository ppa:webupd8team/sublime-text-3</code><br>根据提示按ENTER 继续,建立信任数据库<br>再添加sublime text 3的仓库:<code>sudo apt update</code><br>最后安装Sublime Text 3:<code>sudo apt install sublime-text-installer</code><br>软件安装成功。<br><strong>2、安装Package Control</strong><br>输入命令subl打开Sublime Text 3<br>按快捷键ctrl+`(Esc下面的按键),在弹出的控制台输入一下代码回车<br>import urllib.request,os,hashlib; h = ‘2915d1851351e5ee549c20394736b442’ + ‘8bc59f460fa1548d1514676163dafc88’; pf = ‘Package Control.sublime-package’; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( ‘<a href="http://packagecontrol.io/" target="_blank" rel="external">http://packagecontrol.io/</a>‘ + pf.replace(‘ ‘, ‘%20’)).read(); dh = hashlib.sha256(by).hexdigest(); print(‘Error validating download (got %s instead of %s), please try manual install’ % (dh, h)) if dh != h else open(os.path.join( ipp, pf), ‘wb’ ).write(by)<br>重启软件后可以在Preference菜单下找到Package Control命令,单击运行Packeage Control,输入</p>
</blockquote>
<hr>
<p>###常用插件</p>
<p>####<em>安装方法ctrl+shift+p>输入install>按下enter>查找插件>确认</em><br><figure class="highlight plain"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div></pre></td><td class="code"><pre><div class="line"></div><div class="line">1.Git</div><div class="line">常用的git社区有csdn、github、开源中国,还有自己搭建的git服务器,在开过程中我们习</div><div class="line">惯了在软件里直接使用git,而不是去切换到终端运行相应的命令。</div><div class="line"></div><div class="line">2.GitGutter</div><div class="line">GitGutter 更好的帮助开发者查看文件之前的改动和差异,提升开发效率,</div><div class="line">减少错误的提交,代码冲突。</div><div class="line"></div><div class="line">3.Emmet</div><div class="line">Emmet 项目的前身是前端开发人员熟知的 Zen Coding(快速编写 HTML/CSS 代码的方案)。</div><div class="line">在 Sublime Text 编辑器中搭配 Emmet 插件真的是让你编码快上加快。</div><div class="line"></div><div class="line">4.SublimeREPL</div><div class="line">这个插件允许你在Sublime里面运行各种语言(如NodeJs,Python,Scala等等),</div><div class="line">所以编程少不了它</div><div class="line"></div><div class="line">5.DocBlockr</div><div class="line">如果你遵循的编码的风格很严格,这款插件能够使你的任务更容易。DocBlokr 帮助你创造你的代码注释,</div><div class="line">通过解析功能,参数,变量,并且自动添加基本项目</div><div class="line"></div><div class="line">6.CSSComb</div><div class="line">这是用来给css属性进行排序格式化的插件,如果你想让你的代码看起来简洁明了,清新飘逸,</div><div class="line">那么这个插件就是一个有效的解决方案,特别是很多人一个开发的时候可以保持编码风格统一</div><div class="line"></div><div class="line">7.Alignment</div><div class="line">这个插件让你能对齐你的代码,包括 PHP、CSS 和 Javascript。代码看起来更简洁和可读,便于编辑。</div><div class="line"></div><div class="line">8.Trmmer</div><div class="line">你知道当你编写代码时,由于错误或别的某些原因,会产生一些不必要的空格。</div><div class="line">需要注意的是多余的空格有时也会造成错误。这个插件会自动删除这些不必要的空格。</div><div class="line"></div><div class="line">9.ColorPicker</div><div class="line">如果你经常要查看或设置颜色值,这个插件可以很方便地调用你本机的调色板应用。</div><div class="line">(译者扩充:)这是一个双向的功能,你既可以在调色板中选择一个颜色,</div><div class="line">然后按“确定”按钮把该值填写到 SublimeText 中活动文档的当前位置,</div><div class="line">也可以在活动文档中选择一个颜色的值,按此插件的快捷键就会在显示的调色板中定位到该值所对应的颜色</div><div class="line"></div><div class="line">10.angularjs</div><div class="line">在编写angularjs时可以快速提示补全,避免写错</div><div class="line"></div><div class="line">11.reactjs</div><div class="line">我们经常会忘记一些语法,需要去查找,为了避免不必要的麻烦,</div><div class="line">装上reactjs就可以解决忘记react语法的问题</div><div class="line"></div><div class="line">12.SpaceGray</div><div class="line">一个好的主题可以让人心情愉悦,避免敲错代码,装上它,就可以拥有令人兴奋的主题。</div></pre></td></tr></table></figure></p>
<h2 id="等等,还有好多好用的插件,可根据自己的需要安装。"><a href="#等等,还有好多好用的插件,可根据自己的需要安装。" class="headerlink" title="####等等,还有好多好用的插件,可根据自己的需要安装。"></a>####等等,还有好多好用的插件,可根据自己的需要安装。</h2><p>###Sublime常用快捷键:</p>
<blockquote>
<p>掌握基本的代码编辑器的快捷键,能让你打码更有效率,刚开始可能不大记得住,多敲几次就能熟悉并使用它</p>
<p><strong>精华键 :</strong></p>
<p>Ctrl+Shift+P:打开命令面板<br>Ctrl+P:搜索项目中的文件<br>Ctrl+G:跳转到第几行<br>Ctrl+W:关闭当前打开文件<br>Ctrl+Shift+W:关闭所有打开文件<br>Ctrl+Shift+V:粘贴并格式化<br>Ctrl+D:选择单词,重复可增加选择下一个相同的单词<br>Ctrl+L:选择行,重复可依次增加选择下一行<br>Ctrl+Shift+L:选择多行<br>Ctrl+Shift+Enter:在当前行前插入新行<br>Ctrl+X:删除当前行<br>Ctrl+M:跳转到对应括号<br>Ctrl+U:软撤销,撤销光标位置<br>Ctrl+J:选择标签内容<br>Ctrl+F:查找内容<br>Ctrl+Shift+F:查找并替换<br>Ctrl+H:替换<br>Ctrl+R:前往 method<br>Ctrl+N:新建窗口<br>Ctrl+K+B:开关侧栏<br>Ctrl+Shift+M:选中当前括号内容,重复可选着括号本身<br>Ctrl+F2:设置/删除标记<br>Ctrl+/:注释当前行<br>Ctrl+Shift+/:当前位置插入注释<br>Ctrl+Alt+/:块注释,并Focus到首行,写注释说明用的<br>Ctrl+Shift+A:选择当前标签前后,修改标签用的<br>F11:全屏<br>Shift+F11:全屏免打扰模式,只编辑当前文件<br>Alt+F3:选择所有相同的词<br>Alt+.:闭合标签<br>Alt+Shift+数字:分屏显示<br>Alt+数字:切换打开第N个文件<br>Shift+右键拖动:光标多不,用来更改或插入列内容<br>鼠标的前进后退键可切换Tab文件<br>按Ctrl,依次点击或选取,可需要编辑的多个位置<br>按Ctrl+Shift+上下键,可替换行</p>
<p><strong>选择类 :</strong></p>
<p>Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本。<br>Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑。举个栗子:快速选中并更改所有相同的变量名、函数名等。<br>Ctrl+L 选中整行,继续操作则继续选择下一行,效果和 Shift+↓ 效果一样。<br>Ctrl+Shift+L 先选中多行,再按下快捷键,会在每行行尾插入光标,即可同时编辑这些行。<br>Ctrl+Shift+M 选择括号内的内容(继续选择父括号)。举个栗子:快速选中删除函数中的代码,重写函数体代码或重写括号内里的内容。<br>Ctrl+M 光标移动至括号内结束或开始的位置。<br>Ctrl+Enter 在下一行插入新行。举个栗子:即使光标不在行尾,也能快速向下插入一行。<br>Ctrl+Shift+Enter 在上一行插入新行。举个栗子:即使光标不在行首,也能快速向上插入一行。<br>Ctrl+Shift+[ 选中代码,按下快捷键,折叠代码。<br>Ctrl+Shift+] 选中代码,按下快捷键,展开代码。<br>Ctrl+K+0 展开所有折叠代码。<br>Ctrl+← 向左单位性地移动光标,快速移动光标。<br>Ctrl+→ 向右单位性地移动光标,快速移动光标。<br>shift+↑ 向上选中多行。<br>shift+↓ 向下选中多行。<br>Shift+← 向左选中文本。<br>Shift+→ 向右选中文本。<br>Ctrl+Shift+← 向左单位性地选中文本。<br>Ctrl+Shift+→ 向右单位性地选中文本。<br>Ctrl+Shift+↑ 将光标所在行和上一行代码互换(将光标所在行插入到上一行之前)。<br>Ctrl+Shift+↓ 将光标所在行和下一行代码互换(将光标所在行插入到下一行之后)。<br>Ctrl+Alt+↑ 向上添加多行光标,可同时编辑多行。<br>Ctrl+Alt+↓ 向下添加多行光标,可同时编辑多行。</p>
<p><strong>编辑类 :</strong><br>Ctrl+J 合并选中的多行代码为一行。举个栗子:将多行格式的CSS属性合并为一行。<br>Ctrl+Shift+D 复制光标所在整行,插入到下一行。<br>Tab 向右缩进。<br>Shift+Tab 向左缩进。<br>Ctrl+K+K 从光标处开始删除代码至行尾。<br>Ctrl+Shift+K 删除整行。<br>Ctrl+/ 注释单行。<br>Ctrl+Shift+/ 注释多行。<br>Ctrl+K+U 转换大写。<br>Ctrl+K+L 转换小写。<br>Ctrl+Z 撤销。<br>Ctrl+Y 恢复撤销。<br>Ctrl+U 软撤销,感觉和 Gtrl+Z 一样。<br>Ctrl+F2 设置书签<br>Ctrl+T 左右字母互换。<br>F6 单词检测拼写</p>
<p><strong>搜索类 :</strong><br>Ctrl+F 打开底部搜索框,查找关键字。<br>Ctrl+shift+F 在文件夹内查找,与普通编辑器不同的地方是sublime允许添加多个文件夹进行查找,略高端,未研究。<br>Ctrl+P 打开搜索框。举个栗子:1、输入当前项目中的文件名,快速搜索文件,2、输入@和关键字,查找文件中函数名,3、输入:和数字,跳转到文件中该行代码,4、输入#和关键字,查找变量名。<br>Ctrl+G 打开搜索框,自动带:,输入数字跳转到该行代码。举个栗子:在页面代码比较长的文件中快速定位。<br>Ctrl+R 打开搜索框,自动带@,输入关键字,查找文件中的函数名。举个栗子:在函数较多的页面快速查找某个函数。<br>Ctrl+: 打开搜索框,自动带#,输入关键字,查找文件中的变量名、属性名等。<br>Ctrl+Shift+P 打开命令框。场景栗子:打开命名框,输入关键字,调用sublime text或插件的功能,例如使用package安装插件。<br>Esc 退出光标多行选择,退出搜索框,命令框等。<br>显示类<br>Ctrl+Tab 按文件浏览过的顺序,切换当前窗口的标签页。<br>Ctrl+PageDown 向左切换当前窗口的标签页。<br>Ctrl+PageUp 向右切换当前窗口的标签页。<br>Alt+Shift+1 窗口分屏,恢复默认1屏(非小键盘的数字)<br>Alt+Shift+2 左右分屏-2列<br>Alt+Shift+3 左右分屏-3列<br>Alt+Shift+4 左右分屏-4列<br>Alt+Shift+5 等分4屏<br>Alt+Shift+8 垂直分屏-2屏<br>Alt+Shift+9 垂直分屏-3屏<br>Ctrl+K+B 开启/关闭侧边栏。<br>F11 全屏模式<br>Shift+F11 免打扰模式</p>
</blockquote>
]]></content>
<summary type="html">
<h2 id="web前端的开发神器"><a href="#web前端的开发神器" class="headerlink" title="web前端的开发神器"></a>web前端的开发神器</h2><blockquote>
<p><strong>WebStrom和Sublime堪称史上最强的web开发神器:</strong></p>
<p>提供了智能的代码提示,智能补全,各种强大的轻量级的插件支持。WebStrom相对智能一点,但是耗内存大,有时会卡顿现象,界面不简洁,Sublime相对灵活轻巧,界面清爽,功能齐全,插件快速安装等特点。</p>
</blockquote>
</summary>
<category term="Ubuntu" scheme="http://bee.gs/tags/Ubuntu/"/>
<category term="Linux" scheme="http://bee.gs/tags/Linux/"/>
<category term="安装" scheme="http://bee.gs/tags/%E5%AE%89%E8%A3%85/"/>
<category term="Sublime" scheme="http://bee.gs/tags/Sublime/"/>
</entry>
<entry>
<title>Java-Jsch-教程</title>
<link href="http://bee.gs/2016/10/21/tech/java-jsch/"/>
<id>http://bee.gs/2016/10/21/tech/java-jsch/</id>
<published>2016-10-21T08:48:00.000Z</published>
<updated>2016-12-27T14:58:17.249Z</updated>
<content type="html"><![CDATA[<h2 id="jsch教程"><a href="#jsch教程" class="headerlink" title="jsch教程"></a>jsch教程</h2><blockquote>
<p>jsch是ssh2的一个纯Java实现。它允许你连接到一个sshd服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的程序中。同时该项目也提供一个J2ME版本用来在手机上直连SSHD服务器。</p>
</blockquote>
<p>####一般连接到服务器有两种方式:<br>1、通过用户名和密码连接,缺点(出于安全需要,一般服务器的密码会定期修改,程序部署后将不得不经常更新配置文件中的密 码。)<br>2、通过用户名和ssh private key file连接,缺点(因为Java程序必须和private key file在同一台机器上,将服务器的private key file复制到本地后,本地机器的安全措施可能会使private key file被窃取,威胁服务器安全。)</p>
<hr>
<p>jsch官网地址为<a href="http://www.jcraft.com/jsch/" target="_blank" rel="external">http://www.jcraft.com/jsch/</a>,实现jsch功能需要添加一个jsch-0.1.51.jar包,官网有一些例子可直接下载参考。</p>
<a id="more"></a>
<p>maven的配置为:</p>
<figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div></pre></td><td class="code"><pre><div class="line"><span class="tag"><<span class="name">dependency</span>></span></div><div class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.jcraft<span class="tag"></<span class="name">groupId</span>></span></div><div class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jsch<span class="tag"></<span class="name">artifactId</span>></span></div><div class="line"> <span class="tag"><<span class="name">version</span>></span>0.1.51<span class="tag"></<span class="name">version</span>></span></div><div class="line"><span class="tag"></<span class="name">dependency</span>></span></div></pre></td></tr></table></figure>
<p>jsch连接到Linux的基本原理和用ssh一样,需要ip地址,端口(一般为22),用户名,密码,为了方便配置,可以把静态变量初始化在配置文件中:</p>
<figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">#jsch配置</div><div class="line">host.ip=192.168.1.1</div><div class="line">host.user=root</div><div class="line">host.port=22</div><div class="line">host.password=123456</div><div class="line">host.connect.timeout=5000</div></pre></td></tr></table></figure>
<p>获取配置文件变量的工具类:</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">package</span> com.personal.core.constant;</div><div class="line"></div><div class="line"></div><div class="line"><span class="keyword">import</span> com.personal.core.utils.PropertiesLoader;</div><div class="line"><span class="keyword">import</span> org.apache.commons.lang.StringUtils;</div><div class="line"><span class="keyword">import</span> org.springframework.core.io.DefaultResourceLoader;</div><div class="line"></div><div class="line"><span class="keyword">import</span> java.io.File;</div><div class="line"><span class="keyword">import</span> java.io.IOException;</div><div class="line"><span class="keyword">import</span> java.util.HashMap;</div><div class="line"><span class="keyword">import</span> java.util.Map;</div><div class="line"></div><div class="line"><span class="comment">/**</span></div><div class="line"> * 注释:全局配置类</div><div class="line"> *</div><div class="line"> * <span class="doctag">@Author</span>: coding99</div><div class="line"> * <span class="doctag">@Date</span>: 16-9-2</div><div class="line"> * <span class="doctag">@Time</span>: 下午7:33</div><div class="line"> */</div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">Global</span> </span>{</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 当前对象实例</div><div class="line"> */</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> Global global = <span class="keyword">new</span> Global();</div><div class="line"> </div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 保存全局属性值</div><div class="line"> */</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> Map<String, String> map = <span class="keyword">new</span> HashMap<String, String>();</div><div class="line"> </div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 属性文件加载对象</div><div class="line"> */</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> PropertiesLoader loader = <span class="keyword">new</span> PropertiesLoader(<span class="string">"sysConfig.properties"</span>);</div><div class="line"></div><div class="line"></div><div class="line"> </div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 获取当前对象实例</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> Global <span class="title">getInstance</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">return</span> global;</div><div class="line"> }</div><div class="line"> </div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 获取配置</div><div class="line"> * <span class="doctag">@see</span> {fns:getConfig('adminPath')}</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> String <span class="title">getConfig</span><span class="params">(String key)</span> </span>{</div><div class="line"> String value = map.get(key);</div><div class="line"> <span class="keyword">if</span> (value == <span class="keyword">null</span>){</div><div class="line"> value = loader.getProperty(key);</div><div class="line"> map.put(key, value != <span class="keyword">null</span> ? value : StringUtils.EMPTY);</div><div class="line"> }</div><div class="line"> <span class="keyword">return</span> value;</div><div class="line"> }<span class="comment">/** * 获取工程路径 * <span class="doctag">@return</span> */</span> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> String <span class="title">getProjectPath</span><span class="params">()</span></span>{ <span class="comment">// 如果配置了工程路径,则直接返回,否则自动获取。String projectPath = Global.getConfig("projectPath");if (StringUtils.isNotBlank(projectPath)){return projectPath;}try {File file = new DefaultResourceLoader().getResource("").getFile();if (file != null){while(true){File f = new File(file.getPath() + File.separator + "src" + File.separator + "main");if (f == null || f.exists()){break;}if (file.getParentFile() != null){file = file.getParentFile();}else{break;}}projectPath = file.toString();}} catch (IOException e) {e.printStackTrace();}return projectPath; }}</span></div><div class="line"> </div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 获取工程路径</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> String <span class="title">getProjectPath</span><span class="params">()</span></span>{</div><div class="line"> <span class="comment">// 如果配置了工程路径,则直接返回,否则自动获取。</span></div><div class="line"> String projectPath = Global.getConfig(<span class="string">"projectPath"</span>);</div><div class="line"> <span class="keyword">if</span> (StringUtils.isNotBlank(projectPath)){</div><div class="line"> <span class="keyword">return</span> projectPath;</div><div class="line"> }</div><div class="line"> <span class="keyword">try</span> {</div><div class="line"> File file = <span class="keyword">new</span> DefaultResourceLoader().getResource(<span class="string">""</span>).getFile();</div><div class="line"> <span class="keyword">if</span> (file != <span class="keyword">null</span>){</div><div class="line"> <span class="keyword">while</span>(<span class="keyword">true</span>){</div><div class="line"> File f = <span class="keyword">new</span> File(file.getPath() + File.separator + <span class="string">"src"</span> + File.separator + <span class="string">"main"</span>);</div><div class="line"> <span class="keyword">if</span> (f == <span class="keyword">null</span> || f.exists()){</div><div class="line"> <span class="keyword">break</span>;</div><div class="line"> }</div><div class="line"> <span class="keyword">if</span> (file.getParentFile() != <span class="keyword">null</span>){</div><div class="line"> file = file.getParentFile();</div><div class="line"> }<span class="keyword">else</span>{</div><div class="line"> <span class="keyword">break</span>;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> projectPath = file.toString();</div><div class="line"> }</div><div class="line"> } <span class="keyword">catch</span> (IOException e) {</div><div class="line"> e.printStackTrace();</div><div class="line"> }</div><div class="line"> <span class="keyword">return</span> projectPath;</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line">}</div></pre></td></tr></table></figure>
<p>获取脚本的方法通过一个工具类读取这个配置文件,用dom4j进行解析,获取相应指定shell name的脚本,例如</p>
<figure class="highlight html"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div></pre></td><td class="code"><pre><div class="line"><?xml version="1.0" encoding="UTF-8"?></div><div class="line"><span class="tag"><<span class="name">configuration</span>></span></div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment"><!--开发环境--></span></div><div class="line"> <span class="tag"><<span class="name">shell</span> <span class="attr">name</span>=<span class="string">"ls"</span> <span class="attr">env</span>=<span class="string">"dev"</span>></span></div><div class="line"> <span class="tag"><<span class="name">description</span>></span>查看opt文件夹内容<span class="tag"></<span class="name">description</span>></span></div><div class="line"> <span class="tag"><<span class="name">step</span>></span>ls -ltr /opt<span class="tag"></<span class="name">step</span>></span></div><div class="line"> <span class="tag"></<span class="name">shell</span>></span></div><div class="line"></div><div class="line"> <span class="comment"><!--开发环境--></span></div><div class="line"> <span class="tag"><<span class="name">shell</span> <span class="attr">name</span>=<span class="string">"ls"</span> <span class="attr">env</span>=<span class="string">"uat"</span>></span></div><div class="line"> <span class="tag"><<span class="name">description</span>></span>查看opt文件夹内容<span class="tag"></<span class="name">description</span>></span></div><div class="line"> <span class="tag"><<span class="name">step</span>></span>ls -ltr /opt<span class="tag"></<span class="name">step</span>></span></div><div class="line"> <span class="tag"></<span class="name">shell</span>></span></div><div class="line"></div><div class="line"> <span class="comment"><!--生产环境--></span></div><div class="line"> <span class="tag"><<span class="name">shell</span> <span class="attr">name</span>=<span class="string">"ls"</span> <span class="attr">env</span>=<span class="string">"pro"</span>></span></div><div class="line"> <span class="tag"><<span class="name">description</span>></span>查看opt文件夹内容<span class="tag"></<span class="name">description</span>></span></div><div class="line"> <span class="tag"><<span class="name">step</span>></span>ls -ltr /opt<span class="tag"></<span class="name">step</span>></span></div><div class="line"> <span class="tag"></<span class="name">shell</span>></span></div><div class="line"></div><div class="line"></div><div class="line"><span class="tag"></<span class="name">configuration</span>></span></div></pre></td></tr></table></figure>
<p>获取脚本的方法通过一个工具类读取这个配置文件,用dom4j进行解析,获取相应指定shell name的脚本,例如</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">package</span> com.personal.core.utils;</div><div class="line"></div><div class="line"><span class="keyword">import</span> com.personal.core.constant.Global;</div><div class="line"><span class="keyword">import</span> org.dom4j.Document;</div><div class="line"><span class="keyword">import</span> org.dom4j.Element;</div><div class="line"><span class="keyword">import</span> org.dom4j.io.SAXReader;</div><div class="line"></div><div class="line"><span class="keyword">import</span> java.io.File;</div><div class="line"><span class="keyword">import</span> java.util.List;</div><div class="line"></div><div class="line"><span class="comment">/**</span></div><div class="line"> * 注释</div><div class="line"> *</div><div class="line"> * <span class="doctag">@Author</span>: coding99</div><div class="line"> * <span class="doctag">@Date</span>: 16-9-2</div><div class="line"> * <span class="doctag">@Time</span>: 下午9:31</div><div class="line"> */</div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">ShellConfigUtil</span> </span>{</div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String SHELL_ENV = Global.getConfig(<span class="string">"environment"</span>);</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> String DEFAULT_SHELL_CONFIG = ShellConfigUtil.class.getResource(<span class="string">"/"</span>).getPath()+<span class="string">"shell.xml"</span>;</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="title">ShellConfigUtil</span><span class="params">()</span> </span>{</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 取得脚本</div><div class="line"> * <span class="doctag">@param</span> shellName</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> * <span class="doctag">@throws</span> Exception</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> String <span class="title">getShell</span><span class="params">(String shellName)</span><span class="keyword">throws</span> Exception</span>{</div><div class="line"> String shellContent = <span class="string">""</span>;</div><div class="line"></div><div class="line"> List<Element> shells = getShellEelements();</div><div class="line"></div><div class="line"> <span class="keyword">for</span>(Element shell : shells) {</div><div class="line"> String name = shell.attributeValue(<span class="string">"name"</span>);</div><div class="line"> String env = shell.attributeValue(<span class="string">"env"</span>);</div><div class="line"> <span class="comment">//把shell数组遍历</span></div><div class="line"> <span class="keyword">if</span>(shellName.equals(name) && SHELL_ENV.equals(env)) {</div><div class="line"> shellContent = getShellResult(shell);</div><div class="line"> }</div><div class="line"></div><div class="line"> }</div><div class="line"> <span class="keyword">return</span> shellContent;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 解析xml</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> * <span class="doctag">@throws</span> Exception</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> List<Element> <span class="title">getShellEelements</span><span class="params">()</span> <span class="keyword">throws</span> Exception</span>{</div><div class="line"> SAXReader saxReader = <span class="keyword">new</span> SAXReader();<span class="comment">//创建读取配置文件的对象</span></div><div class="line"> Document document = saxReader.read(<span class="keyword">new</span> File(DEFAULT_SHELL_CONFIG));<span class="comment">//开始读取配置文件</span></div><div class="line"> Element element = document.getRootElement();</div><div class="line"> List<Element> shellElements = element.elements(<span class="string">"shell"</span>);</div><div class="line"> <span class="keyword">return</span> shellElements;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 获取脚本内容</div><div class="line"> * <span class="doctag">@param</span> shell</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> String <span class="title">getShellResult</span><span class="params">(Element shell)</span> </span>{</div><div class="line"> String result = <span class="string">""</span>;</div><div class="line"> List<Element> steps = shell.elements(<span class="string">"step"</span>);</div><div class="line"> <span class="keyword">for</span> (Element step : steps) {</div><div class="line"> result = step.getText();</div><div class="line"> }</div><div class="line"> <span class="keyword">return</span> result;</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception</span>{</div><div class="line"> ShellConfigUtil.getShell(<span class="string">"ls"</span>);</div><div class="line"> }</div><div class="line"></div><div class="line">}</div></pre></td></tr></table></figure>
<p>#JSCH实现原理:<br>jsch进行连接服务器连接时可以看做时java的jdbc连接,首先我们需要实例化一个jsch对象,再利用这个对象 根据用户名,主机ip,端口获取一个Session对象,设置好相应的参数后,就进行连接,创建连接后这个session是一直可用的,所以不需要关闭。之后我们需要在session上建立channel通道<br>Channel的类型可以为如下类型:<br>shell - ChannelShell exec - ChannelExec <br>direct-tcpip - ChannelDirectTCPIP sftp - ChannelSftp subsystem - ChannelSubsystem<br> 其中,ChannelShell和ChannelExec比较类似,都可以作为执行Shell脚本的Channel类型。它们有一个比较重要的区别:ChannelShell可以看作是执行一个交互式的Shell,而ChannelExec是执行一个Shell脚本。<br>实现远程命令操作我们需要创建ChannelExec对象。<br>实现文件上传下载我们需要实现ChannelSftp对象。<br>ChannelSftp类是JSch实现SFTP核心类,它包含了所有SFTP的方法,如:<br>put(): 文件上传<br>get(): 文件下载<br>cd(): 进入指定目录<br>ls(): 得到指定目录下的文件列表<br>rename(): 重命名指定文件或目录<br>rm(): 删除指定文件<br>mkdir(): 创建目录<br>rmdir(): 删除目录下面有个工具类展示<br>应用实例:<br>JschUtil.java</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div><div class="line">141</div><div class="line">142</div><div class="line">143</div><div class="line">144</div><div class="line">145</div><div class="line">146</div><div class="line">147</div><div class="line">148</div><div class="line">149</div><div class="line">150</div><div class="line">151</div><div class="line">152</div><div class="line">153</div><div class="line">154</div><div class="line">155</div><div class="line">156</div><div class="line">157</div><div class="line">158</div><div class="line">159</div><div class="line">160</div><div class="line">161</div><div class="line">162</div><div class="line">163</div><div class="line">164</div><div class="line">165</div><div class="line">166</div><div class="line">167</div><div class="line">168</div><div class="line">169</div><div class="line">170</div><div class="line">171</div><div class="line">172</div><div class="line">173</div><div class="line">174</div><div class="line">175</div><div class="line">176</div><div class="line">177</div><div class="line">178</div><div class="line">179</div><div class="line">180</div><div class="line">181</div><div class="line">182</div><div class="line">183</div><div class="line">184</div><div class="line">185</div><div class="line">186</div><div class="line">187</div><div class="line">188</div><div class="line">189</div><div class="line">190</div><div class="line">191</div><div class="line">192</div><div class="line">193</div><div class="line">194</div><div class="line">195</div><div class="line">196</div><div class="line">197</div><div class="line">198</div><div class="line">199</div><div class="line">200</div><div class="line">201</div><div class="line">202</div><div class="line">203</div><div class="line">204</div><div class="line">205</div><div class="line">206</div><div class="line">207</div><div class="line">208</div><div class="line">209</div><div class="line">210</div><div class="line">211</div><div class="line">212</div><div class="line">213</div><div class="line">214</div><div class="line">215</div><div class="line">216</div><div class="line">217</div><div class="line">218</div><div class="line">219</div><div class="line">220</div><div class="line">221</div><div class="line">222</div><div class="line">223</div><div class="line">224</div><div class="line">225</div><div class="line">226</div><div class="line">227</div><div class="line">228</div><div class="line">229</div><div class="line">230</div><div class="line">231</div><div class="line">232</div><div class="line">233</div><div class="line">234</div><div class="line">235</div><div class="line">236</div><div class="line">237</div><div class="line">238</div><div class="line">239</div><div class="line">240</div><div class="line">241</div><div class="line">242</div><div class="line">243</div><div class="line">244</div><div class="line">245</div><div class="line">246</div><div class="line">247</div><div class="line">248</div><div class="line">249</div><div class="line">250</div><div class="line">251</div><div class="line">252</div><div class="line">253</div><div class="line">254</div><div class="line">255</div><div class="line">256</div><div class="line">257</div><div class="line">258</div><div class="line">259</div><div class="line">260</div><div class="line">261</div><div class="line">262</div><div class="line">263</div><div class="line">264</div><div class="line">265</div><div class="line">266</div><div class="line">267</div><div class="line">268</div><div class="line">269</div><div class="line">270</div><div class="line">271</div><div class="line">272</div><div class="line">273</div><div class="line">274</div><div class="line">275</div><div class="line">276</div><div class="line">277</div><div class="line">278</div><div class="line">279</div><div class="line">280</div><div class="line">281</div><div class="line">282</div><div class="line">283</div><div class="line">284</div><div class="line">285</div><div class="line">286</div><div class="line">287</div><div class="line">288</div><div class="line">289</div><div class="line">290</div><div class="line">291</div><div class="line">292</div><div class="line">293</div><div class="line">294</div><div class="line">295</div><div class="line">296</div><div class="line">297</div><div class="line">298</div><div class="line">299</div><div class="line">300</div><div class="line">301</div><div class="line">302</div><div class="line">303</div><div class="line">304</div><div class="line">305</div><div class="line">306</div><div class="line">307</div><div class="line">308</div><div class="line">309</div><div class="line">310</div><div class="line">311</div><div class="line">312</div><div class="line">313</div><div class="line">314</div><div class="line">315</div><div class="line">316</div><div class="line">317</div><div class="line">318</div><div class="line">319</div><div class="line">320</div><div class="line">321</div><div class="line">322</div><div class="line">323</div><div class="line">324</div><div class="line">325</div><div class="line">326</div><div class="line">327</div><div class="line">328</div><div class="line">329</div><div class="line">330</div><div class="line">331</div><div class="line">332</div><div class="line">333</div><div class="line">334</div><div class="line">335</div><div class="line">336</div><div class="line">337</div><div class="line">338</div><div class="line">339</div><div class="line">340</div><div class="line">341</div><div class="line">342</div><div class="line">343</div><div class="line">344</div><div class="line">345</div><div class="line">346</div><div class="line">347</div><div class="line">348</div><div class="line">349</div><div class="line">350</div><div class="line">351</div><div class="line">352</div><div class="line">353</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">package</span> com.personal.core.utils;</div><div class="line"><span class="keyword">import</span> com.jcraft.jsch.*;</div><div class="line"><span class="keyword">import</span> com.personal.core.constant.Global;</div><div class="line"><span class="keyword">import</span> org.slf4j.Logger;</div><div class="line"><span class="keyword">import</span> org.slf4j.LoggerFactory;</div><div class="line"></div><div class="line"><span class="keyword">import</span> java.io.*;</div><div class="line"><span class="keyword">import</span> java.nio.charset.Charset;</div><div class="line"><span class="keyword">import</span> java.util.*;</div><div class="line"><span class="comment">/**</span></div><div class="line"> * 注释</div><div class="line"> *</div><div class="line"> * <span class="doctag">@Author</span>: coding99</div><div class="line"> * <span class="doctag">@Date</span>: 16-9-2</div><div class="line"> * <span class="doctag">@Time</span>: 下午7:33</div><div class="line"> */</div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">JschUtil</span> </span>{</div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger logger = LoggerFactory.getLogger(JschUtil.class);</div><div class="line"></div><div class="line"> <span class="keyword">private</span> String charset = <span class="string">"UTF-8"</span>; <span class="comment">// 设置编码格式,可以根据服务器的编码设置相应的编码格式</span></div><div class="line"> <span class="keyword">private</span> JSch jsch;</div><div class="line"> <span class="keyword">private</span> Session session;</div><div class="line"> Channel channel = <span class="keyword">null</span>;</div><div class="line"> ChannelSftp chSftp = <span class="keyword">null</span>;</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">//初始化配置参数</span></div><div class="line"> <span class="keyword">private</span> String jschHost = Global.getConfig(<span class="string">"host.ip"</span>);</div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> jschPort = Integer.parseInt(Global.getConfig(<span class="string">"host.port"</span>));</div><div class="line"> <span class="keyword">private</span> String jschUserName = Global.getConfig(<span class="string">"host.user"</span>);</div><div class="line"> <span class="keyword">private</span> String jschPassWord = Global.getConfig(<span class="string">"host.password"</span>);</div><div class="line"> <span class="keyword">private</span> <span class="keyword">int</span> jschTimeOut = Integer.parseInt(Global.getConfig(<span class="string">"host.connect.timeout"</span>));</div><div class="line"></div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 静态内部类实现单例模式</div><div class="line"> */</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="class"><span class="keyword">class</span> <span class="title">LazyHolder</span> </span>{</div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> JschUtil INSTANCE = <span class="keyword">new</span> JschUtil();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="title">JschUtil</span><span class="params">()</span> </span>{</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 获取实例</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> JschUtil <span class="title">getInstance</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">return</span> LazyHolder.INSTANCE;</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 连接到指定的服务器</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> * <span class="doctag">@throws</span> JSchException</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">connect</span><span class="params">()</span> <span class="keyword">throws</span> JSchException </span>{</div><div class="line"></div><div class="line"> jsch = <span class="keyword">new</span> JSch();<span class="comment">// 创建JSch对象</span></div><div class="line"></div><div class="line"> <span class="keyword">boolean</span> result = <span class="keyword">false</span>;</div><div class="line"></div><div class="line"> <span class="keyword">try</span>{</div><div class="line"></div><div class="line"> <span class="keyword">long</span> begin = System.currentTimeMillis();<span class="comment">//连接前时间</span></div><div class="line"> logger.debug(<span class="string">"Try to connect to jschHost = "</span> + jschHost + <span class="string">",as jschUserName = "</span> + jschUserName + <span class="string">",as jschPort = "</span> + jschPort);</div><div class="line"></div><div class="line"> session = jsch.getSession(jschUserName, jschHost, jschPort);<span class="comment">// // 根据用户名,主机ip,端口获取一个Session对象</span></div><div class="line"> session.setPassword(jschPassWord); <span class="comment">// 设置密码</span></div><div class="line"> Properties config = <span class="keyword">new</span> Properties();</div><div class="line"> config.put(<span class="string">"StrictHostKeyChecking"</span>, <span class="string">"no"</span>);</div><div class="line"> session.setConfig(config);<span class="comment">// 为Session对象设置properties</span></div><div class="line"> session.setTimeout(jschTimeOut);<span class="comment">//设置连接超时时间</span></div><div class="line"> session.connect();</div><div class="line"></div><div class="line"> logger.debug(<span class="string">"Connected successfully to jschHost = "</span> + jschHost + <span class="string">",as jschUserName = "</span> + jschUserName + <span class="string">",as jschPort = "</span> + jschPort);</div><div class="line"></div><div class="line"> <span class="keyword">long</span> end = System.currentTimeMillis();<span class="comment">//连接后时间</span></div><div class="line"></div><div class="line"> logger.debug(<span class="string">"Connected To SA Successful in {} ms"</span>, (end-begin));</div><div class="line"></div><div class="line"> result = session.isConnected();</div><div class="line"></div><div class="line"> }<span class="keyword">catch</span>(Exception e){</div><div class="line"> logger.error(e.getMessage(), e);</div><div class="line"> }<span class="keyword">finally</span>{</div><div class="line"> <span class="keyword">if</span>(result){</div><div class="line"> logger.debug(<span class="string">"connect success"</span>);</div><div class="line"> }<span class="keyword">else</span>{</div><div class="line"> logger.debug(<span class="string">"connect failure"</span>);</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">if</span>(!session.isConnected()) {</div><div class="line"> logger.error(<span class="string">"获取连接失败"</span>);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">return</span> session.isConnected();</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 关闭连接</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">close</span><span class="params">()</span> </span>{</div><div class="line"></div><div class="line"> <span class="keyword">if</span>(channel != <span class="keyword">null</span> && channel.isConnected()){</div><div class="line"> channel.disconnect();</div><div class="line"> channel=<span class="keyword">null</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">if</span>(session!=<span class="keyword">null</span> && session.isConnected()){</div><div class="line"> session.disconnect();</div><div class="line"> session=<span class="keyword">null</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 脚本是同步执行的方式</div><div class="line"> * 执行脚本命令</div><div class="line"> * <span class="doctag">@param</span> command</div><div class="line"> * <span class="doctag">@return</span></div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> Map<String,Object> <span class="title">execCmmmand</span><span class="params">(String command)</span> <span class="keyword">throws</span> Exception</span>{</div><div class="line"></div><div class="line"></div><div class="line"> Map<String,Object> mapResult = <span class="keyword">new</span> HashMap<String,Object>();</div><div class="line"></div><div class="line"> logger.debug(command);</div><div class="line"></div><div class="line"> StringBuffer result = <span class="keyword">new</span> StringBuffer();<span class="comment">//脚本返回结果</span></div><div class="line"></div><div class="line"> BufferedReader reader = <span class="keyword">null</span>;</div><div class="line"> <span class="keyword">int</span> returnCode = -<span class="number">2</span>;<span class="comment">//脚本执行退出状态码</span></div><div class="line"></div><div class="line"></div><div class="line"> <span class="keyword">try</span> {</div><div class="line"></div><div class="line"> channel = session.openChannel(<span class="string">"exec"</span>);</div><div class="line"> ((ChannelExec) channel).setCommand(command);</div><div class="line"> channel.setInputStream(<span class="keyword">null</span>);</div><div class="line"> ((ChannelExec) channel).setErrStream(System.err);</div><div class="line"></div><div class="line"> channel.connect();<span class="comment">//执行命令 等待执行结束</span></div><div class="line"></div><div class="line"> InputStream in = channel.getInputStream();</div><div class="line"> reader = <span class="keyword">new</span> BufferedReader(<span class="keyword">new</span> InputStreamReader(in, Charset.forName(charset)));</div><div class="line"></div><div class="line"> String res=<span class="string">""</span>;</div><div class="line"> <span class="keyword">while</span>((res=reader.readLine()) != <span class="keyword">null</span>){</div><div class="line"> result.append(res+<span class="string">"\n"</span>);</div><div class="line"> logger.debug(res);</div><div class="line"> }</div><div class="line"></div><div class="line"> returnCode = channel.getExitStatus();</div><div class="line"></div><div class="line"> mapResult.put(<span class="string">"returnCode"</span>,returnCode);</div><div class="line"> mapResult.put(<span class="string">"result"</span>,result.toString());</div><div class="line"></div><div class="line"> } <span class="keyword">catch</span> (IOException e) {</div><div class="line"></div><div class="line"> logger.error(e.getMessage(),e);</div><div class="line"></div><div class="line"> } <span class="keyword">catch</span> (JSchException e) {</div><div class="line"></div><div class="line"> logger.error(e.getMessage(), e);</div><div class="line"></div><div class="line"> } <span class="keyword">finally</span> {</div><div class="line"> <span class="keyword">try</span> {</div><div class="line"> reader.close();</div><div class="line"> } <span class="keyword">catch</span> (IOException e) {</div><div class="line"> logger.error(e.getMessage(), e);</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">return</span> mapResult;</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 上传文件</div><div class="line"> *</div><div class="line"> * <span class="doctag">@param</span> directory 上传的目录,有两种写法</div><div class="line"> * 1、如/opt,拿到则是默认文件名</div><div class="line"> * 2、/opt/文件名,则是另起一个名字</div><div class="line"> * <span class="doctag">@param</span> uploadFile 要上传的文件 如/opt/xxx.txt</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">upload</span><span class="params">(String directory, String uploadFile)</span> </span>{</div><div class="line"></div><div class="line"> <span class="keyword">try</span> {</div><div class="line"></div><div class="line"> logger.debug(<span class="string">"Opening Channel."</span>);</div><div class="line"> channel = session.openChannel(<span class="string">"sftp"</span>); <span class="comment">// 打开SFTP通道</span></div><div class="line"> channel.connect(); <span class="comment">// 建立SFTP通道的连接</span></div><div class="line"> chSftp = (ChannelSftp) channel;</div><div class="line"> File file = <span class="keyword">new</span> File(uploadFile);</div><div class="line"> <span class="keyword">long</span> fileSize = file.length();</div><div class="line"></div><div class="line"> <span class="comment">/*方法一*/</span></div><div class="line"> OutputStream out = chSftp.put(directory, <span class="keyword">new</span> FileProgressMonitor(fileSize), ChannelSftp.OVERWRITE); <span class="comment">// 使用OVERWRITE模式</span></div><div class="line"> <span class="keyword">byte</span>[] buff = <span class="keyword">new</span> <span class="keyword">byte</span>[<span class="number">1024</span> * <span class="number">256</span>]; <span class="comment">// 设定每次传输的数据块大小为256KB</span></div><div class="line"> <span class="keyword">int</span> read;</div><div class="line"> <span class="keyword">if</span> (out != <span class="keyword">null</span>) {</div><div class="line"> logger.debug(<span class="string">"Start to read input stream"</span>);</div><div class="line"> InputStream is = <span class="keyword">new</span> FileInputStream(uploadFile);</div><div class="line"> <span class="keyword">do</span> {</div><div class="line"> read = is.read(buff, <span class="number">0</span>, buff.length);</div><div class="line"> <span class="keyword">if</span> (read > <span class="number">0</span>) {</div><div class="line"> out.write(buff, <span class="number">0</span>, read);</div><div class="line"> }</div><div class="line"> out.flush();</div><div class="line"> } <span class="keyword">while</span> (read >= <span class="number">0</span>);</div><div class="line"> logger.debug(<span class="string">"input stream read done."</span>);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// chSftp.put(uploadFile, directory, new FileProgressMonitor(fileSize), ChannelSftp.OVERWRITE); //方法二</span></div><div class="line"> <span class="comment">// chSftp.put(new FileInputStream(src), dst, new FileProgressMonitor(fileSize), ChannelSftp.OVERWRITE); //方法三</span></div><div class="line"> logger.debug(<span class="string">"成功上传文件至"</span>+directory);</div><div class="line"></div><div class="line"> } <span class="keyword">catch</span> (Exception e) {</div><div class="line"> e.printStackTrace();</div><div class="line"> }<span class="keyword">finally</span> {</div><div class="line"> chSftp.quit();</div><div class="line"></div><div class="line"> <span class="keyword">if</span> (channel != <span class="keyword">null</span>) {</div><div class="line"> channel.disconnect();</div><div class="line"> logger.debug(<span class="string">"channel disconnect"</span>);</div><div class="line"> }</div><div class="line"></div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 下载文件</div><div class="line"> *</div><div class="line"> * <span class="doctag">@param</span> directory 下载的目录,有两种写法</div><div class="line"> * 1、如/opt,拿到则是默认文件名</div><div class="line"> * 2、/opt/文件名,则是另起一个名字</div><div class="line"> * <span class="doctag">@param</span> downloadFile 要下载的文件 如/opt/xxx.txt</div><div class="line"> *</div><div class="line"> */</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">download</span><span class="params">(String directory, String downloadFile)</span> </span>{</div><div class="line"> <span class="keyword">try</span> {</div><div class="line"></div><div class="line"> logger.debug(<span class="string">"Opening Channel."</span>);</div><div class="line"> channel = session.openChannel(<span class="string">"sftp"</span>); <span class="comment">// 打开SFTP通道</span></div><div class="line"> channel.connect(); <span class="comment">// 建立SFTP通道的连接</span></div><div class="line"> chSftp = (ChannelSftp) channel;</div><div class="line"> SftpATTRS attr = chSftp.stat(downloadFile);</div><div class="line"> <span class="keyword">long</span> fileSize = attr.getSize();</div><div class="line"></div><div class="line"></div><div class="line"> OutputStream out = <span class="keyword">new</span> FileOutputStream(directory);</div><div class="line"></div><div class="line"> InputStream is = chSftp.get(downloadFile, <span class="keyword">new</span> MyProgressMonitor());</div><div class="line"> <span class="keyword">byte</span>[] buff = <span class="keyword">new</span> <span class="keyword">byte</span>[<span class="number">1024</span> * <span class="number">2</span>];</div><div class="line"> <span class="keyword">int</span> read;</div><div class="line"> <span class="keyword">if</span> (is != <span class="keyword">null</span>) {</div><div class="line"> logger.debug(<span class="string">"Start to read input stream"</span>);</div><div class="line"> <span class="keyword">do</span> {</div><div class="line"> read = is.read(buff, <span class="number">0</span>, buff.length);</div><div class="line"> <span class="keyword">if</span> (read > <span class="number">0</span>) {</div><div class="line"> out.write(buff, <span class="number">0</span>, read);</div><div class="line"> }</div><div class="line"> out.flush();</div><div class="line"> } <span class="keyword">while</span> (read >= <span class="number">0</span>);</div><div class="line"> logger.debug(<span class="string">"input stream read done."</span>);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">//chSftp.get(downloadFile, directory, new FileProgressMonitor(fileSize)); // 代码段1</span></div><div class="line"> <span class="comment">//chSftp.get(downloadFile, out, new FileProgressMonitor(fileSize)); // 代码段2</span></div><div class="line"></div><div class="line"> logger.debug(<span class="string">"成功下载文件至"</span>+directory);</div><div class="line"> } <span class="keyword">catch</span> (Exception e) {</div><div class="line"> e.printStackTrace();</div><div class="line"> } <span class="keyword">finally</span> {</div><div class="line"> chSftp.quit();</div><div class="line"> <span class="keyword">if</span> (channel != <span class="keyword">null</span>) {</div><div class="line"> channel.disconnect();</div><div class="line"> logger.debug(<span class="string">"channel disconnect"</span>);</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 删除文件</div><div class="line"> * <span class="doctag">@param</span> deleteFile 要删除的文件</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">delete</span><span class="params">(String deleteFile)</span> </span>{</div><div class="line"></div><div class="line"> <span class="keyword">try</span> {</div><div class="line"> connect();<span class="comment">//建立服务器连接</span></div><div class="line"> logger.debug(<span class="string">"Opening Channel."</span>);</div><div class="line"> channel = session.openChannel(<span class="string">"sftp"</span>); <span class="comment">// 打开SFTP通道</span></div><div class="line"> channel.connect(); <span class="comment">// 建立SFTP通道的连接</span></div><div class="line"> chSftp = (ChannelSftp) channel;</div><div class="line"> chSftp.rm(deleteFile);</div><div class="line"> logger.debug(<span class="string">"成功删除文件"</span>+deleteFile);</div><div class="line"> } <span class="keyword">catch</span> (Exception e) {</div><div class="line"> e.printStackTrace();</div><div class="line"> }</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> String <span class="title">getCharset</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">return</span> charset;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">setCharset</span><span class="params">(String charset)</span> </span>{</div><div class="line"> <span class="keyword">this</span>.charset = charset;</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception</span>{</div><div class="line"></div><div class="line"> JschUtil jschUtil = JschUtil.getInstance();</div><div class="line"></div><div class="line"> <span class="keyword">boolean</span> isConnected = <span class="keyword">false</span>;</div><div class="line"> isConnected = jschUtil.connect();</div><div class="line"></div><div class="line"> <span class="keyword">if</span>(isConnected == <span class="keyword">true</span>){</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">/*上传文件*/</span></div><div class="line"> jschUtil.upload(<span class="string">"/opt/123456.png"</span>,<span class="string">"/home/sky/Desktop/resizeApi.png"</span>);</div><div class="line"></div><div class="line"> <span class="comment">/*执行命令*/</span></div><div class="line"> String command = <span class="string">"ls -ltr /opt"</span>;</div><div class="line"> <span class="comment">// String command = ShellConfigUtil.getShell("ls");</span></div><div class="line"> Map<String,Object> result = jschUtil.execCmmmand(command);</div><div class="line"> System.out.println(result.get(<span class="string">"result"</span>).toString());</div><div class="line"></div><div class="line"> <span class="comment">/*下载文件*/</span></div><div class="line"> jschUtil.download(<span class="string">"/opt/123456.png"</span>,<span class="string">"/opt/123456.png"</span>);</div><div class="line"></div><div class="line"> jschUtil.close();</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div><div class="line">70</div><div class="line">71</div><div class="line">72</div><div class="line">73</div><div class="line">74</div><div class="line">75</div><div class="line">76</div><div class="line">77</div><div class="line">78</div><div class="line">79</div><div class="line">80</div><div class="line">81</div><div class="line">82</div><div class="line">83</div><div class="line">84</div><div class="line">85</div><div class="line">86</div><div class="line">87</div><div class="line">88</div><div class="line">89</div><div class="line">90</div><div class="line">91</div><div class="line">92</div><div class="line">93</div><div class="line">94</div><div class="line">95</div><div class="line">96</div><div class="line">97</div><div class="line">98</div><div class="line">99</div><div class="line">100</div><div class="line">101</div><div class="line">102</div><div class="line">103</div><div class="line">104</div><div class="line">105</div><div class="line">106</div><div class="line">107</div><div class="line">108</div><div class="line">109</div><div class="line">110</div><div class="line">111</div><div class="line">112</div><div class="line">113</div><div class="line">114</div><div class="line">115</div><div class="line">116</div><div class="line">117</div><div class="line">118</div><div class="line">119</div><div class="line">120</div><div class="line">121</div><div class="line">122</div><div class="line">123</div><div class="line">124</div><div class="line">125</div><div class="line">126</div><div class="line">127</div><div class="line">128</div><div class="line">129</div><div class="line">130</div><div class="line">131</div><div class="line">132</div><div class="line">133</div><div class="line">134</div><div class="line">135</div><div class="line">136</div><div class="line">137</div><div class="line">138</div><div class="line">139</div><div class="line">140</div></pre></td><td class="code"><pre><div class="line"></div><div class="line"><span class="keyword">package</span> com.personal.core.utils;</div><div class="line"><span class="keyword">import</span> java.text.DecimalFormat;</div><div class="line"><span class="keyword">import</span> java.util.Timer;</div><div class="line"><span class="keyword">import</span> java.util.TimerTask;</div><div class="line"></div><div class="line"><span class="keyword">import</span> com.jcraft.jsch.SftpProgressMonitor;</div><div class="line"><span class="keyword">import</span> org.slf4j.Logger;</div><div class="line"><span class="keyword">import</span> org.slf4j.LoggerFactory;</div><div class="line"></div><div class="line"><span class="comment">/**</span></div><div class="line"> * 注释</div><div class="line"> *</div><div class="line"> * <span class="doctag">@Author</span>: coding99</div><div class="line"> * <span class="doctag">@Date</span>: 16-9-2</div><div class="line"> * <span class="doctag">@Time</span>: 下午8:29</div><div class="line"> */</div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">FileProgressMonitor</span> <span class="keyword">extends</span> <span class="title">TimerTask</span> <span class="keyword">implements</span> <span class="title">SftpProgressMonitor</span> </span>{</div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger logger = LoggerFactory.getLogger(FileProgressMonitor.class);</div><div class="line"> </div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">long</span> progressInterval = <span class="number">5</span> * <span class="number">1000</span>; <span class="comment">// 默认间隔时间为5秒</span></div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">boolean</span> isEnd = <span class="keyword">false</span>; <span class="comment">// 记录传输是否结束</span></div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">long</span> transfered; <span class="comment">// 记录已传输的数据总大小</span></div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">long</span> fileSize; <span class="comment">// 记录文件总大小</span></div><div class="line"></div><div class="line"> <span class="keyword">private</span> Timer timer; <span class="comment">// 定时器对象</span></div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">boolean</span> isScheduled = <span class="keyword">false</span>; <span class="comment">// 记录是否已启动timer记时器</span></div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="title">FileProgressMonitor</span><span class="params">(<span class="keyword">long</span> fileSize)</span> </span>{</div><div class="line"> <span class="keyword">this</span>.fileSize = fileSize;</div><div class="line"> }</div><div class="line"> </div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">run</span><span class="params">()</span> </span>{</div><div class="line"></div><div class="line"> <span class="keyword">if</span> (!isEnd()) { <span class="comment">// 判断传输是否已结束</span></div><div class="line"></div><div class="line"> logger.debug(<span class="string">"Transfering is in progress."</span>);</div><div class="line"></div><div class="line"> <span class="keyword">long</span> transfered = getTransfered();</div><div class="line"></div><div class="line"> <span class="keyword">if</span> (transfered != fileSize) { <span class="comment">// 判断当前已传输数据大小是否等于文件总大小</span></div><div class="line"> logger.debug(<span class="string">"Current transfered: "</span> + transfered + <span class="string">" bytes"</span>);</div><div class="line"> sendProgressMessage(transfered);</div><div class="line"> } <span class="keyword">else</span> {</div><div class="line"> logger.debug(<span class="string">"File transfering is done."</span>);</div><div class="line"> setEnd(<span class="keyword">true</span>); <span class="comment">// 如果当前已传输数据大小等于文件总大小,说明已完成,设置end</span></div><div class="line"> }</div><div class="line"> } <span class="keyword">else</span> {</div><div class="line"> logger.debug(<span class="string">"Transfering done. Cancel timer."</span>);</div><div class="line"> stop(); <span class="comment">// 如果传输结束,停止timer记时器</span></div><div class="line"> <span class="keyword">return</span>;</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">stop</span><span class="params">()</span> </span>{</div><div class="line"> logger.debug(<span class="string">"Try to stop progress monitor."</span>);</div><div class="line"> <span class="keyword">if</span> (timer != <span class="keyword">null</span>) {</div><div class="line"> timer.cancel();</div><div class="line"> timer.purge();</div><div class="line"> timer = <span class="keyword">null</span>;</div><div class="line"> isScheduled = <span class="keyword">false</span>;</div><div class="line"> }</div><div class="line"> logger.debug(<span class="string">"Progress monitor stoped."</span>);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">start</span><span class="params">()</span> </span>{</div><div class="line"> logger.debug(<span class="string">"Try to start progress monitor."</span>);</div><div class="line"> <span class="keyword">if</span> (timer == <span class="keyword">null</span>) {</div><div class="line"> timer = <span class="keyword">new</span> Timer();</div><div class="line"> }</div><div class="line"> timer.schedule(<span class="keyword">this</span>, <span class="number">1000</span>, progressInterval);</div><div class="line"> isScheduled = <span class="keyword">true</span>;</div><div class="line"> logger.debug(<span class="string">"Progress monitor started."</span>);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 打印progress信息</div><div class="line"> * <span class="doctag">@param</span> transfered</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">void</span> <span class="title">sendProgressMessage</span><span class="params">(<span class="keyword">long</span> transfered)</span> </span>{</div><div class="line"> <span class="keyword">if</span> (fileSize != <span class="number">0</span>) {</div><div class="line"> <span class="keyword">double</span> d = ((<span class="keyword">double</span>)transfered * <span class="number">100</span>)/(<span class="keyword">double</span>)fileSize;</div><div class="line"> DecimalFormat df = <span class="keyword">new</span> DecimalFormat( <span class="string">"#.##"</span>);</div><div class="line"> logger.debug(<span class="string">"Sending progress message: "</span> + df.format(d) + <span class="string">"%"</span>);</div><div class="line"> } <span class="keyword">else</span> {</div><div class="line"> logger.debug(<span class="string">"Sending progress message: "</span> + transfered);</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 实现了SftpProgressMonitor接口的count方法</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">count</span><span class="params">(<span class="keyword">long</span> count)</span> </span>{</div><div class="line"> <span class="keyword">if</span> (isEnd()) <span class="keyword">return</span> <span class="keyword">false</span>;</div><div class="line"> <span class="keyword">if</span> (!isScheduled) {</div><div class="line"> start();</div><div class="line"> }</div><div class="line"> add(count);</div><div class="line"> <span class="keyword">return</span> <span class="keyword">true</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">/**</span></div><div class="line"> * 实现了SftpProgressMonitor接口的end方法</div><div class="line"> */</div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">end</span><span class="params">()</span> </span>{</div><div class="line"> setEnd(<span class="keyword">true</span>);</div><div class="line"> logger.debug(<span class="string">"transfering end."</span>);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> <span class="title">add</span><span class="params">(<span class="keyword">long</span> count)</span> </span>{</div><div class="line"> transfered = transfered + count;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">synchronized</span> <span class="keyword">long</span> <span class="title">getTransfered</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">return</span> transfered;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> <span class="title">setTransfered</span><span class="params">(<span class="keyword">long</span> transfered)</span> </span>{</div><div class="line"> <span class="keyword">this</span>.transfered = transfered;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> <span class="title">setEnd</span><span class="params">(<span class="keyword">boolean</span> isEnd)</span> </span>{</div><div class="line"> <span class="keyword">this</span>.isEnd = isEnd;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">private</span> <span class="keyword">synchronized</span> <span class="keyword">boolean</span> <span class="title">isEnd</span><span class="params">()</span> </span>{</div><div class="line"> <span class="keyword">return</span> isEnd;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">init</span><span class="params">(<span class="keyword">int</span> op, String src, String dest, <span class="keyword">long</span> max)</span> </span>{</div><div class="line"> <span class="comment">// Not used for putting InputStream</span></div><div class="line"> }</div><div class="line">}</div></pre></td></tr></table></figure>
<figure class="highlight java"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div></pre></td><td class="code"><pre><div class="line"><span class="keyword">package</span> com.personal.core.utils;</div><div class="line"></div><div class="line"></div><div class="line"><span class="keyword">import</span> com.jcraft.jsch.SftpProgressMonitor;</div><div class="line"><span class="keyword">import</span> org.slf4j.Logger;</div><div class="line"><span class="keyword">import</span> org.slf4j.LoggerFactory;</div><div class="line"></div><div class="line"></div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">/**</span></div><div class="line"> * 注释</div><div class="line"> *</div><div class="line"> * <span class="doctag">@Author</span>: coding99</div><div class="line"> * <span class="doctag">@Date</span>: 16-9-2</div><div class="line"> * <span class="doctag">@Time</span>: 下午8:36</div><div class="line"> */</div><div class="line"></div><div class="line"></div><div class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MyProgressMonitor</span> <span class="keyword">implements</span> <span class="title">SftpProgressMonitor</span> </span>{</div><div class="line"></div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> Logger logger = LoggerFactory.getLogger(MyProgressMonitor.class);</div><div class="line"></div><div class="line"></div><div class="line"> <span class="keyword">private</span> <span class="keyword">long</span> transfered;</div><div class="line"></div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">boolean</span> <span class="title">count</span><span class="params">(<span class="keyword">long</span> count)</span> </span>{</div><div class="line"> transfered = transfered + count;</div><div class="line"> logger.debug(<span class="string">"Currently transferred total size: "</span> + transfered + <span class="string">" bytes"</span>);</div><div class="line"> <span class="keyword">return</span> <span class="keyword">true</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">end</span><span class="params">()</span> </span>{</div><div class="line"> logger.debug(<span class="string">"Transferring done."</span>);</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="meta">@Override</span></div><div class="line"> <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">init</span><span class="params">(<span class="keyword">int</span> op, String src, String dest, <span class="keyword">long</span> max)</span> </span>{</div><div class="line"> logger.debug(<span class="string">"Transferring begin."</span>);</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line">}</div></pre></td></tr></table></figure>
<p>#注:工具类主要封装了三个方法 </p>
<p>1.执行脚本命令<br>2.文件上传(为了做进度监控,需要用到监控类FileProgressMonitor.java)<br>3.文件下载 (为了做进度监控,需要用到监控类MyProgressMonitor.java) </p>
<p>JschUtil.java工具类的几个使用步骤如下<br>1.初始化连接参数<br>2.调用connect()方法进行连接<br>3.执行相应的方法,如果是脚本命令,先用ShellConfigUtil.java获取相应的脚本,再执行(jsch执行脚本的方式是同步,就是要等到脚本执行结束才返回结果,如果没有返回就一直等着,应该不支持交互式命令,比如连接到某个数据库,然后执行相应的操作)<br>4.最后关闭连接</p>
<p>例子只针对单台服务器的操作,如果需要同时操作多台服务器,可在原有基础上做修改。</p>
]]></content>
<summary type="html">
<h2 id="jsch教程"><a href="#jsch教程" class="headerlink" title="jsch教程"></a>jsch教程</h2><blockquote>
<p>jsch是ssh2的一个纯Java实现。它允许你连接到一个sshd服务器,使用端口转发,X11转发,文件传输等等。你可以将它的功能集成到你自己的程序中。同时该项目也提供一个J2ME版本用来在手机上直连SSHD服务器。</p>
</blockquote>
<p>####一般连接到服务器有两种方式:<br>1、通过用户名和密码连接,缺点(出于安全需要,一般服务器的密码会定期修改,程序部署后将不得不经常更新配置文件中的密 码。)<br>2、通过用户名和ssh private key file连接,缺点(因为Java程序必须和private key file在同一台机器上,将服务器的private key file复制到本地后,本地机器的安全措施可能会使private key file被窃取,威胁服务器安全。)</p>
<hr>
<p>jsch官网地址为<a href="http://www.jcraft.com/jsch/">http://www.jcraft.com/jsch/</a>,实现jsch功能需要添加一个jsch-0.1.51.jar包,官网有一些例子可直接下载参考。</p>
</summary>
<category term="Java" scheme="http://bee.gs/tags/Java/"/>
<category term="Jsch" scheme="http://bee.gs/tags/Jsch/"/>
<category term="教程" scheme="http://bee.gs/tags/%E6%95%99%E7%A8%8B/"/>
</entry>
</feed>