-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.html
More file actions
2001 lines (1597 loc) · 235 KB
/
Copy pathindex.html
File metadata and controls
2001 lines (1597 loc) · 235 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
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 6.3.0">
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png">
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png">
<link rel="mask-icon" href="/images/logo.svg" color="#222">
<link rel="stylesheet" href="/css/main.css">
<link rel="stylesheet" href="/lib/font-awesome/css/all.min.css">
<script id="hexo-configurations">
var NexT = window.NexT || {};
var CONFIG = {"hostname":"nydia.github.io","root":"/","scheme":"Muse","version":"7.8.0","exturl":false,"sidebar":{"position":"left","display":"post","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":false,"show_result":false,"style":null},"back2top":{"enable":true,"sidebar":false,"scrollpercent":false},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":false,"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}},"localsearch":{"enable":false,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},"path":"search.xml"};
</script>
<meta name="description" content="开源,协作,共享,进步">
<meta property="og:type" content="website">
<meta property="og:title" content="Talk is cheap,show me the code">
<meta property="og:url" content="https://nydia.github.io/index.html">
<meta property="og:site_name" content="Talk is cheap,show me the code">
<meta property="og:description" content="开源,协作,共享,进步">
<meta property="og:locale" content="en_US">
<meta property="article:author" content="nydia">
<meta property="article:tag" content="开源">
<meta name="twitter:card" content="summary">
<link rel="canonical" href="https://nydia.github.io/">
<script id="page-configurations">
// https://hexo.io/docs/variables.html
CONFIG.page = {
sidebar: "",
isHome : true,
isPost : false,
lang : 'en'
};
</script>
<title>Talk is cheap,show me the code</title>
<noscript>
<style>
.use-motion .brand,
.use-motion .menu-item,
.sidebar-inner,
.use-motion .post-block,
.use-motion .pagination,
.use-motion .comments,
.use-motion .post-header,
.use-motion .post-body,
.use-motion .collection-header { opacity: initial; }
.use-motion .site-title,
.use-motion .site-subtitle {
opacity: initial;
top: initial;
}
.use-motion .logo-line-before i { left: initial; }
.use-motion .logo-line-after i { right: initial; }
</style>
</noscript>
<link rel="alternate" href="/atom.xml" title="Talk is cheap,show me the code" type="application/atom+xml">
</head>
<body itemscope itemtype="http://schema.org/WebPage">
<div class="container use-motion">
<div class="headband"></div>
<header class="header" itemscope itemtype="http://schema.org/WPHeader">
<div class="header-inner"><div class="site-brand-container">
<div class="site-nav-toggle">
<div class="toggle" aria-label="Toggle navigation bar">
<span class="toggle-line toggle-line-first"></span>
<span class="toggle-line toggle-line-middle"></span>
<span class="toggle-line toggle-line-last"></span>
</div>
</div>
<div class="site-meta">
<a href="/" class="brand" rel="start">
<span class="logo-line-before"><i></i></span>
<h1 class="site-title">Talk is cheap,show me the code</h1>
<span class="logo-line-after"><i></i></span>
</a>
<p class="site-subtitle" itemprop="description">开源,协作,共享,进步</p>
</div>
<div class="site-nav-right">
<div class="toggle popup-trigger">
</div>
</div>
</div>
<nav class="site-nav">
<ul id="menu" class="main-menu menu">
<li class="menu-item menu-item-home">
<a href="/" rel="section"><i class="fa fa-home fa-fw"></i>Home</a>
</li>
<li class="menu-item menu-item-archives">
<a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>Archives</a>
</li>
</ul>
</nav>
</div>
</header>
<div class="back-to-top">
<i class="fa fa-arrow-up"></i>
<span>0%</span>
</div>
<main class="main">
<div class="main-inner">
<div class="content-wrap">
<div class="content index posts-expand">
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
<link itemprop="mainEntityOfPage" href="https://nydia.github.io/2022/10/01/flutter/flutter/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="nydia">
<meta itemprop="description" content="开源,协作,共享,进步">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Talk is cheap,show me the code">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2022/10/01/flutter/flutter/" class="post-title-link" itemprop="url">Flutter</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2022-10-01 17:52:56" itemprop="dateCreated datePublished" datetime="2022-10-01T17:52:56+08:00">2022-10-01</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2025-04-26 19:27:26" itemprop="dateModified" datetime="2025-04-26T19:27:26+08:00">2025-04-26</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">In</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Flutter/" itemprop="url" rel="index"><span itemprop="name">Flutter</span></a>
</span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h2 id="Flutter简介"><a href="#Flutter简介" class="headerlink" title="Flutter简介"></a>Flutter简介</h2><h3 id="极速构建漂亮的原生应用"><a href="#极速构建漂亮的原生应用" class="headerlink" title="极速构建漂亮的原生应用"></a>极速构建漂亮的原生应用</h3><p>Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的原生用户界面。 Flutter可以与现有的代码一起工作。在全世界,Flutter正在被越来越多的开发者和组织使用,并且Flutter是完全免费、开源的。</p>
<h2 id="Flutter的安装"><a href="#Flutter的安装" class="headerlink" title="Flutter的安装"></a>Flutter的安装</h2><ol>
<li><p>安装Git工具,因为获去Flutter需要Git命令</p>
</li>
<li><p>获取Flutter : git clone -b beta <a target="_blank" rel="noopener" href="https://github.com/flutter/flutter.git">https://github.com/flutter/flutter.git</a></p>
</li>
<li><p>配置环境变量<br>a. 临时变量:</p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">export PUB_HOSTED_URL=https://pub.flutter-io.cn //国内用户需要设置</span><br><span class="line">export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn //国内用户需要置</span><br><span class="line">export PATH=`pwd`/flutter/bin:$PATH</span><br></pre></td></tr></table></figure>
<p>b. 永久变量:<br>转到 “控制面板>用户帐户>用户帐户>更改我的环境变量”<br>在“用户变量”下检查是否有名为“Path”的条目:<br>如果该条目存在, 追加 flutter\bin的全路径,使用 ; 作为分隔符.<br>如果条目不存在, 创建一个新用户变量 Path ,然后将 flutter\bin的全路径作为它的值.<br>在“用户变量”下检查是否有名为”PUB_HOSTED_URL”和”FLUTTER_STORAGE_BASE_URL”的条目,如果没有,也添加它们。</p>
</li>
<li><p>安装依赖<br>运行 flutter doctor 检测需要的安装项</p>
</li>
<li><p>检测设备连接<br>flutter devices</p>
</li>
<li><p>Flutter开发工具IDEA开发环境搭建<br>安装flutter和dart插件,插件的安装安装下图操作:<br>file->setting->Browse repositories<br>或者选择install plugin from disk 本地安装</p>
</li>
<li><p>Flutter的android开发的环境搭建<br>a. 安装android sdk<br>b. idea里面配置jdk和android sdk<br>需要配置JDK和Android SDK</p>
</li>
</ol>
<h2 id="参考网站"><a href="#参考网站" class="headerlink" title="参考网站"></a>参考网站</h2><ol>
<li>Flutter百度百科: <a target="_blank" rel="noopener" href="https://baike.baidu.com/item/Flutter/22498985">https://baike.baidu.com/item/Flutter/22498985</a></li>
<li>Flutter中文学习网址: <a target="_blank" rel="noopener" href="https://flutterchina.club/">https://flutterchina.club</a></li>
<li>React Native 中文学习网: <a target="_blank" rel="noopener" href="https://reactnative.cn/docs/0.20/getting-started.html">https://reactnative.cn/docs/0.20/getting-started.html</a></li>
<li>几款移动跨平台App开发框架比较: <a target="_blank" rel="noopener" href="https://wiki.lhqmm.com/my/?wid=74b1c7589c684cf3abbbe86197f5e5fb">https://wiki.lhqmm.com/my/?wid=74b1c7589c684cf3abbbe86197f5e5fb</a></li>
<li>React Native百度百科:<a target="_blank" rel="noopener" href="https://baike.baidu.com/item/react%20native/20307162?fr=aladdin">https://baike.baidu.com/item/react%20native/20307162?fr=aladdin</a></li>
<li>Dart百度百科:<a target="_blank" rel="noopener" href="https://baike.baidu.com/item/dart%E8%AF%AD%E8%A8%80/4117161?fr=aladdin">https://baike.baidu.com/item/dart%E8%AF%AD%E8%A8%80/4117161?fr=aladdin</a></li>
<li>Dart学习社区: <a target="_blank" rel="noopener" href="http://www.cndartlang.com/">http://www.cndartlang.com/</a></li>
</ol>
<h3 id="Android-studio下载地址"><a href="#Android-studio下载地址" class="headerlink" title="Android studio下载地址"></a>Android studio下载地址</h3><p><a target="_blank" rel="noopener" href="https://developer.android.google.cn/">https://developer.android.google.cn/</a><br>原来的android开发者社区<a target="_blank" rel="noopener" href="https://developer.android.google.com/">https://developer.android.google.com</a> 已经不能访问了。</p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
<link itemprop="mainEntityOfPage" href="https://nydia.github.io/2022/10/01/tech-tools/README/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="nydia">
<meta itemprop="description" content="开源,协作,共享,进步">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Talk is cheap,show me the code">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2022/10/01/tech-tools/README/" class="post-title-link" itemprop="url">技术工具</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2022-10-01 17:52:56" itemprop="dateCreated datePublished" datetime="2022-10-01T17:52:56+08:00">2022-10-01</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2025-04-26 21:32:05" itemprop="dateModified" datetime="2025-04-26T21:32:05+08:00">2025-04-26</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">In</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/%E6%8A%80%E6%9C%AF%E5%B7%A5%E5%85%B7/" itemprop="url" rel="index"><span itemprop="name">技术工具</span></a>
</span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="技术工具"><a href="#技术工具" class="headerlink" title="技术工具"></a>技术工具</h1><ol>
<li><a target="_blank" rel="noopener" href="http://sfz.uzuzuz.com/">身份证生成器</a></li>
<li><a target="_blank" rel="noopener" href="https://docs.microsoft.com/zh-cn/">windows系统官方使用文档</a></li>
</ol>
<h2 id="技术网址"><a href="#技术网址" class="headerlink" title="技术网址"></a>技术网址</h2><ul>
<li><a target="_blank" rel="noopener" href="https://www.deepl.com/translator">https://www.deepl.com/translator 专业技术翻译网站</a></li>
<li><a target="_blank" rel="noopener" href="https://www.websequencediagrams.com/">https://www.websequencediagrams.com 在线序列图</a></li>
<li><a target="_blank" rel="noopener" href="http://bestcbooks.com/">http://bestcbooks.com/</a> 计算机书籍控</li>
<li><a target="_blank" rel="noopener" href="https://leetcode-cn.com/">https://leetcode-cn.com/</a> 力扣(算法)</li>
<li><a target="_blank" rel="noopener" href="https://dev.tencent.com/">https://dev.tencent.com</a> 腾讯云开发</li>
<li><a target="_blank" rel="noopener" href="https://coding.net/">https://coding.net/</a> 码市</li>
<li><a target="_blank" rel="noopener" href="https://stackoverflow.com/questions">https://stackoverflow.com/questions</a> 问题搜索博客</li>
<li><a target="_blank" rel="noopener" href="https://blog.csdn.net/zhang89xiao/article/details/79084481">https://blog.csdn.net/zhang89xiao/article/details/79084481</a> 2017 开源中国评比的前100个优秀开源项目</li>
<li><a target="_blank" rel="noopener" href="http://debugx5.qq.com/">http://debugx5.qq.com</a> 清除Android的微信&公众号缓存</li>
<li><a target="_blank" rel="noopener" href="https://gitbook.cn/">https://gitbook.cn</a> gitbook一个基于微信的只是分享</li>
<li><a target="_blank" rel="noopener" href="https://www.eolinker.com/">https://www.eolinker.com</a> API管理</li>
<li><a target="_blank" rel="noopener" href="https://developer.android.google.cn/">https://developer.android.google.cn/</a> android开发者社区</li>
<li><a target="_blank" rel="noopener" href="http://www.logosc.cn/">http://www.logosc.cn/</a> 在线logo生成</li>
<li><a target="_blank" rel="noopener" href="https://pandao.github.io/editor.md/">https://pandao.github.io/editor.md/</a> 开源的markdown编辑器</li>
<li><a target="_blank" rel="noopener" href="http://itchat.readthedocs.io/zh/latest/">http://itchat.readthedocs.io/zh/latest/</a> itchat Pyton微信接口</li>
<li><a target="_blank" rel="noopener" href="https://segmentfault.com/a/1190000009420701">https://segmentfault.com/a/1190000009420701</a></li>
<li><a target="_blank" rel="noopener" href="https://code.ziqiangxuetang.com/django/django-tutorial.html">https://code.ziqiangxuetang.com/django/django-tutorial.html</a> 自强学堂Django学习</li>
<li><a target="_blank" rel="noopener" href="http://mustache.github.io/">http://mustache.github.io/</a> mustache官网</li>
<li><a target="_blank" rel="noopener" href="https://github.com/janl/mustache.js">https://github.com/janl/mustache.js</a> js里面运用mustache</li>
<li><a target="_blank" rel="noopener" href="http://www.sucaihuo.com/">http://www.sucaihuo.com/</a> 素材火官网(素材网站)</li>
<li><a target="_blank" rel="noopener" href="https://docs.docker.com/">https://docs.docker.com</a> docker 官网</li>
<li><a target="_blank" rel="noopener" href="https://www.rfc-editor.org/errata_search.php?rfc=5789">https://www.rfc-editor.org/errata_search.php?rfc=5789</a> RFC网站</li>
<li><a target="_blank" rel="noopener" href="https://pay.weixin.qq.com/wiki/doc/api/index.html">https://pay.weixin.qq.com/wiki/doc/api/index.html</a> 普通商户微信支付</li>
<li><a target="_blank" rel="noopener" href="http://qydev.weixin.qq.com/wiki/index.php">http://qydev.weixin.qq.com/wiki/index.php</a> 企业号微信支付</li>
<li><a target="_blank" rel="noopener" href="https://caniuse.com/">https://caniuse.com</a> 查看css的兼容性(不是太准确)</li>
<li><a target="_blank" rel="noopener" href="http://nipponcolors.com/#sumire">http://nipponcolors.com/#sumire</a> 日本的一个视觉网站</li>
<li><a target="_blank" rel="noopener" href="http://swlabs.co/madmin/code/ui-treeview.html">http://swlabs.co/madmin/code/ui-treeview.html</a> bootstrap3模板</li>
<li><a target="_blank" rel="noopener" href="https://deuhd.ru/">https://deuhd.ru/</a> 俄罗斯出品的解锁加密影片 DeUHD</li>
<li><a target="_blank" rel="noopener" href="https://pay.weixin.qq.com/wiki/doc/api/index.html">https://pay.weixin.qq.com/wiki/doc/api/index.html</a> 微信支付开发文档</li>
<li><a target="_blank" rel="noopener" href="https://developer.android.com/">https://developer.android.com</a> android官网,需用VPN工具(lantern)才能打开</li>
<li><a target="_blank" rel="noopener" href="https://github.com/otale/tale/wiki">https://github.com/otale/tale/wiki</a> tale使用</li>
<li><a target="_blank" rel="noopener" href="https://supermind.nl/submin/current">https://supermind.nl/submin/current</a> subversion web管理submin 下载地址</li>
<li><a target="_blank" rel="noopener" href="https://github.com/jemalloc/jemalloc/releases/">https://github.com/jemalloc/jemalloc/releases/</a> jemalloc 下载地址</li>
<li><a target="_blank" rel="noopener" href="http://www.cssmoban.com/tags.asp?n=Bootstrap">http://www.cssmoban.com/tags.asp?n=Bootstrap</a> 模板之家,静态网站</li>
<li><a target="_blank" rel="noopener" href="https://www.gitlab.com.cn/installation/#centos-7">https://www.gitlab.com.cn/installation/#centos-7</a> gitlab 安装官方文档</li>
<li><a target="_blank" rel="noopener" href="https://www.getlantern.org/en_US/">https://www.getlantern.org/en_US/</a> 蓝灯官网 vpn软件</li>
<li><a target="_blank" rel="noopener" href="https://h5.baidu.com/">https://h5.baidu.com</a> 百度的H5编辑</li>
<li>支持一键导入 PSD、简单上传操作、在线编辑,全自动完成从 PSD 到 H5 页面雏型的转换</li>
<li><a target="_blank" rel="noopener" href="http://cli.im/">http://cli.im/</a> 草料二维码生成</li>
<li><a target="_blank" rel="noopener" href="http://www.lanrenzhijia.com/">http://www.lanrenzhijia.com/</a> 懒人之家 js/css素材</li>
<li><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=201715%E5%BE%AE%E4%BF%A1%E5%B0%8F%E7%A8%8B%E5%BA%8F%E4%B8%8B%E8%BD%BD">https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=201715微信小程序下载</a></li>
<li><a target="_blank" rel="noopener" href="http://www.rabbitmq.com/releases/erlang/">http://www.rabbitmq.com/releases/erlang/</a></li>
<li><a target="_blank" rel="noopener" href="https://github.com/nuysoft/Mock/wiki/Getting-Started">https://github.com/nuysoft/Mock/wiki/Getting-Started</a> mock.js</li>
<li><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432">https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1445241432</a> 微信公众号开发</li>
<li><a href="mailto:1028787760@qq.com">1028787760@qq.com</a>/1988090591hua</li>
<li><a target="_blank" rel="noopener" href="http://www.xmlpull.org/">http://www.xmlpull.org/</a> xml解析</li>
<li><a target="_blank" rel="noopener" href="http://mvnrepository.com/artifact">http://mvnrepository.com/artifact</a> jar maven地址</li>
<li><a target="_blank" rel="noopener" href="http://lbs.amap.com/api/javascript-api/example/district-search/city-drop-down-list">http://lbs.amap.com/api/javascript-api/example/district-search/city-drop-down-list</a> 高德地图接口</li>
<li><a target="_blank" rel="noopener" href="http://developer.jasig.org/cas/">http://developer.jasig.org/cas/</a> cas下载</li>
<li><a target="_blank" rel="noopener" href="http://jingyan.baidu.com/article/9989c746064d46f648ecfe9a.html">http://jingyan.baidu.com/article/9989c746064d46f648ecfe9a.html</a> 如何在oracle下载jdk历史版本</li>
<li><a target="_blank" rel="noopener" href="https://sourceforge.net/projects/artifactory/">https://sourceforge.net/projects/artifactory/</a> artifactory maven仓库构建 (用Nexus也行)</li>
<li><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/wiki/home/">https://mp.weixin.qq.com/wiki/home/</a> 微信公众号开发文档</li>
<li><a target="_blank" rel="noopener" href="http://www.ui.cn/">http://www.ui.cn/</a> 中国UI</li>
<li><a target="_blank" rel="noopener" href="http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html">http://www.oracle.com/technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html</a> java</li>
<li><a target="_blank" rel="noopener" href="http://www.17sucai.com/">http://www.17sucai.com/</a> 静态网站源码</li>
<li><a target="_blank" rel="noopener" href="https://www.getpostman.com/apps">https://www.getpostman.com/apps</a> 接口调试软件postman网站</li>
<li><a target="_blank" rel="noopener" href="http://www.dedecms.com/">http://www.dedecms.com/</a> 织梦静态网站模版</li>
<li><a target="_blank" rel="noopener" href="http://help.dedecms.com/v53/">http://help.dedecms.com/v53/</a></li>
<li><a target="_blank" rel="noopener" href="https://notepad-plus-plus.org/download/v7.3.html">https://notepad-plus-plus.org/download/v7.3.html</a> notepad++编辑器</li>
<li><a target="_blank" rel="noopener" href="https://github.com/thx/RAP.wiki.git">https://github.com/thx/RAP.wiki.git</a> 可视化接口管理工具 RAP(淘宝开发)</li>
<li><a target="_blank" rel="noopener" href="http://blog.csdn.net/fancylovejava/article/details/45787729/">http://blog.csdn.net/fancylovejava/article/details/45787729/</a> android的UI(炫酷的)</li>
<li><a target="_blank" rel="noopener" href="https://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/">https://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/</a> universal-usb-installer制作U盘装linux</li>
<li><a target="_blank" rel="noopener" href="http://jingyan.baidu.com/article/fec4bce20e344cf2618d8b37.html">http://jingyan.baidu.com/article/fec4bce20e344cf2618d8b37.html</a></li>
<li><a target="_blank" rel="noopener" href="http://www.cnblogs.com/VVingerfly/p/5217723.html">http://www.cnblogs.com/VVingerfly/p/5217723.html</a></li>
<li><a target="_blank" rel="noopener" href="http://python.usyiyi.cn/django/intro/install.html">http://python.usyiyi.cn/django/intro/install.html</a> django文档</li>
<li><a target="_blank" rel="noopener" href="http://materializecss.com/">http://materializecss.com/</a> 是基于谷歌Material Design Language(MDL)设计语言所构建的一套CSS/HTML库</li>
<li><a target="_blank" rel="noopener" href="https://github.com/Dogfalo/materialize">https://github.com/Dogfalo/materialize</a> materialize源码</li>
<li><a target="_blank" rel="noopener" href="http://materializecss.com/showcase.html">http://materializecss.com/showcase.html</a></li>
<li><a target="_blank" rel="noopener" href="https://xituqu.com/640.html">https://xituqu.com/640.html</a> 稀土区, 静态资源。</li>
<li><a target="_blank" rel="noopener" href="http://www.qrcode.com/en/">http://www.qrcode.com/en/</a> 二维码官网</li>
<li><a target="_blank" rel="noopener" href="http://wenku.baidu.com/link?url=iq1lNyYmNdxXjr8mJHVLAwcLuuU_v4_AaZyY9AE9VqhvZnLRQuk6Dda1ILKoGrL1ZqWgd0ArqK1NzDFDn9Q2r3P1jOpKyxuSLlk4uDwGZv7">http://wenku.baidu.com/link?url=iq1lNyYmNdxXjr8mJHVLAwcLuuU_v4_AaZyY9AE9VqhvZnLRQuk6Dda1ILKoGrL1ZqWgd0ArqK1NzDFDn9Q2r3P1jOpKyxuSLlk4uDwGZv7</a></li>
<li><a target="_blank" rel="noopener" href="http://www.myexception.cn/other/1847324.html">http://www.myexception.cn/other/1847324.html</a> 海蜘蛛软路由</li>
<li><a target="_blank" rel="noopener" href="http://www.cygwin.com/">http://www.cygwin.com/</a> cygwin是windows平台上的posix系统模拟环境</li>
<li><a target="_blank" rel="noopener" href="http://redisdoc.com/">http://redisdoc.com/</a> redis命令</li>
<li><a target="_blank" rel="noopener" href="https://redisdesktop.com/download">https://redisdesktop.com/download</a> redis可视化管理工具</li>
<li><a target="_blank" rel="noopener" href="http://www.w3school.com.cn/">http://www.w3school.com.cn/</a> w3school教程</li>
<li><a target="_blank" rel="noopener" href="http://summernote.org/">http://summernote.org/</a> summernote富文本</li>
<li><a target="_blank" rel="noopener" href="http://www.open-open.com/">http://www.open-open.com</a> open开放技术网站</li>
<li><a target="_blank" rel="noopener" href="http://www.oschina.net/">http://www.oschina.net/</a></li>
<li><a target="_blank" rel="noopener" href="http://www.csdn.net/">http://www.csdn.net</a></li>
<li><a target="_blank" rel="noopener" href="http://vdisk.weibo.com/s/sUdlABIlyjroS">http://vdisk.weibo.com/s/sUdlABIlyjroS</a> 新浪书籍网址</li>
<li><a target="_blank" rel="noopener" href="http://tool.oschina.net/apidocs/">http://tool.oschina.net/apidocs/</a> 在线api文档</li>
<li><a target="_blank" rel="noopener" href="https://www.processon.com/diagrams">https://www.processon.com/diagrams</a> 在线画图工具ProcessOn</li>
<li><a target="_blank" rel="noopener" href="http://madmin.swlabs.co/">http://madmin.swlabs.co/</a> bootstrap后台模板 </li>
<li><a target="_blank" rel="noopener" href="http://issues.wenzhixin.net.cn/bootstrap-table/">http://issues.wenzhixin.net.cn/bootstrap-table/</a> boostrap table参考 </li>
<li><a target="_blank" rel="noopener" href="http://issues.wenzhixin.net.cn/bootstrap-table/#methods/scrollTo.html">http://issues.wenzhixin.net.cn/bootstrap-table/#methods/scrollTo.html</a> boostrap 固定表头的tabl </li>
<li><a target="_blank" rel="noopener" href="http://www.runoob.com/try/demo_source/bootstrap-glyph-customization.htm">http://www.runoob.com/try/demo_source/bootstrap-glyph-customization.htm</a> bootstrap的icon图标</li>
<li><a target="_blank" rel="noopener" href="http://repo.spring.io/release/org/springframework/spring/">http://repo.spring.io/release/org/springframework/spring/</a> spring官网 jar包下载</li>
<li><a target="_blank" rel="noopener" href="http://www.gooseeker.com/cn/node/">http://www.gooseeker.com/cn/node/</a> 搜客 开源网络爬虫</li>
<li><a target="_blank" rel="noopener" href="https://curl.haxx.se/download.html">https://curl.haxx.se/download.html</a> curl 工具下载 安装前先安装 <a target="_blank" rel="noopener" href="http://slproweb.com/products/Win32OpenSSL.html">http://slproweb.com/products/Win32OpenSSL.html</a></li>
<li><a target="_blank" rel="noopener" href="http://www.mongovue.com/">http://www.mongovue.com/</a> mongodb 可视化工具 mongovue 下载</li>
<li><a target="_blank" rel="noopener" href="https://www.mongodb.org/dl/win32">https://www.mongodb.org/dl/win32</a> mongodb软件下载</li>
<li><a target="_blank" rel="noopener" href="https://www.mongodb.com/">https://www.mongodb.com</a> mongodb 下载</li>
<li><a target="_blank" rel="noopener" href="https://archive.apache.org/dist/maven/maven-3/">https://archive.apache.org/dist/maven/maven-3/</a> 各种版本maven下载</li>
<li><a target="_blank" rel="noopener" href="http://maven.apache.org/download.cgi">http://maven.apache.org/download.cgi</a> maven 官网,下载地址, 里面有maven对应的jdk版本</li>
<li><a target="_blank" rel="noopener" href="http://www.boyunjian.com/">http://www.boyunjian.com/</a> 拔云剑 源码网站 </li>
<li><a target="_blank" rel="noopener" href="http://www.21cto.com/">http://www.21cto.com/</a> 21CTO社区</li>
<li><a target="_blank" rel="noopener" href="http://36kr.com/">http://36kr.com/</a> 创业者咨询</li>
<li><a target="_blank" rel="noopener" href="http://36kr.com/p/5045631.html">http://36kr.com/p/5045631.html</a> 产品经理」和「功能经理」的区别</li>
<li><a target="_blank" rel="noopener" href="http://www.jikexueyuan.com/">http://www.jikexueyuan.com/</a> 极客学习网站</li>
<li><a target="_blank" rel="noopener" href="http://maven.oschina.net/">http://maven.oschina.net</a> 开源中国Maven库</li>
<li><a target="_blank" rel="noopener" href="http://note.youdao.com/">http://note.youdao.com/</a> 有道云笔记</li>
<li><a target="_blank" rel="noopener" href="http://www.open-open.com/">http://www.open-open.com</a></li>
<li><a target="_blank" rel="noopener" href="http://www.jiagoushuo.com/">http://www.jiagoushuo.com/</a> 架构说</li>
<li><a target="_blank" rel="noopener" href="http://www.hx95.com/">http://www.hx95.com/</a> 黑客网站</li>
<li><a target="_blank" rel="noopener" href="http://abbr.dict.cn/Statistics/Stats">http://abbr.dict.cn/Statistics/Stats</a> 英文简称网站</li>
<li><a target="_blank" rel="noopener" href="http://bbs.9ria.com/thread-44875-1-1.html">http://bbs.9ria.com/thread-44875-1-1.html</a> flex学习</li>
<li><a target="_blank" rel="noopener" href="http://www.cn-java.com/www1/?action-login">http://www.cn-java.com/www1/?action-login</a> java学习:中文java技术网</li>
<li><a target="_blank" rel="noopener" href="http://www.docin.com/list.html">http://www.docin.com/list.html</a> 豆丁学习</li>
<li><a target="_blank" rel="noopener" href="http://home.51cto.com/index.php?s=/space/5084129">http://home.51cto.com/index.php?s=/space/5084129</a> 51CTO首页</li>
<li><a target="_blank" rel="noopener" href="http://ishare.iask.sina.com.cn/download/explain.php?fileid=22242016">http://ishare.iask.sina.com.cn/download/explain.php?fileid=22242016</a></li>
<li><a target="_blank" rel="noopener" href="http://www.56.com/u74/v_ODM2MDUxNjc.html">http://www.56.com/u74/v_ODM2MDUxNjc.html</a></li>
<li><a target="_blank" rel="noopener" href="http://www.cn-java.com/www1/struts.php">http://www.cn-java.com/www1/struts.php</a> 中文Java技术网</li>
<li><a target="_blank" rel="noopener" href="http://115.com/">http://115.com/</a></li>
<li><a target="_blank" rel="noopener" href="http://www.apache.org/dist/httpd/binaries/win32/">http://www.apache.org/dist/httpd/binaries/win32/</a> apache 下载地址</li>
<li><a target="_blank" rel="noopener" href="http://www.cnblogs.com/">www.cnblogs.com</a> 博客园</li>
<li><a target="_blank" rel="noopener" href="http://engineeredweb.com/blog/09/12/preloading-images-jquery-and-javascript/">http://engineeredweb.com/blog/09/12/preloading-images-jquery-and-javascript/</a> jquery 国外网址</li>
<li><a target="_blank" rel="noopener" href="https://code.google.com/">https://code.google.com</a> google代码集</li>
<li><a target="_blank" rel="noopener" href="http://www.2cto.com/">http://www.2cto.com</a></li>
<li><a target="_blank" rel="noopener" href="http://struts.apache.org/release/2.0.x/index.html">http://struts.apache.org/release/2.0.x/index.html</a> struts2 官网</li>
<li><a target="_blank" rel="noopener" href="http://www.linuxidc.com/">http://www.linuxidc.com</a></li>
<li><a target="_blank" rel="noopener" href="https://github.com/jobbole/awesome-python-cn">https://github.com/jobbole/awesome-python-cn</a> python 学习汇总网站</li>
</ul>
<h2 id="资源库"><a href="#资源库" class="headerlink" title="资源库"></a>资源库</h2><ol>
<li>无敌全能综合导航站</li>
</ol>
<ul>
<li>虫部落(聚合搜索平台) <a target="_blank" rel="noopener" href="https://search.chongbuluo.com/">https://search.chongbuluo.com</a></li>
<li>科塔学术(专业学术导航) <a target="_blank" rel="noopener" href="https://site.sciping.com/">https://site.sciping.com</a></li>
<li>码力全开(设计资源导航) <a target="_blank" rel="noopener" href="https://design.maliquankai.com/">https://design.maliquankai.com</a></li>
<li>SeeSeed(设计资源导航2) <a target="_blank" rel="noopener" href="https://www.seeseed.com/">https://www.seeseed.com</a></li>
<li>书享家(电子书资源导航) <a target="_blank" rel="noopener" href="http://shuxiangjia.cn/">http://shuxiangjia.cn</a></li>
<li>HiPPTer(PPT资源导航) <a target="_blank" rel="noopener" href="https://www.hippter.com/">https://www.hippter.com</a></li>
</ul>
<ol start="2">
<li>学习资源</li>
</ol>
<ul>
<li>哔哩哔哩(直接吹爆) <a target="_blank" rel="noopener" href="https://www.bilibili.com/">https://www.bilibili.com</a></li>
<li>第一教程网(课程学习资源) <a target="_blank" rel="noopener" href="https://www.diyijc.com/">https://www.diyijc.com</a></li>
<li>北大教材(精品学习教材) <a target="_blank" rel="noopener" href="https://pup6.yunzhan365.com/bookcase/jmyr/index.html">https://pup6.yunzhan365.com/bookcase/jmyr/index.html</a></li>
<li>考试酷(百万题库网站) <a target="_blank" rel="noopener" href="https://www.examcoo.com/index/ku">https://www.examcoo.com/index/ku</a></li>
<li>外语慕课平台(外语学习好渠道) <a target="_blank" rel="noopener" href="https://moocs.unipus.cn/">https://moocs.unipus.cn</a></li>
</ul>
<ol start="3">
<li>图片视频资源</li>
</ol>
<ul>
<li>Wallhaven(宝藏壁纸网站) <a target="_blank" rel="noopener" href="https://wallhaven.cc/">https://wallhaven.cc</a></li>
<li>Unsplash(优质图片资源) <a target="_blank" rel="noopener" href="https://unsplash.com/">https://unsplash.com</a></li>
<li>Videvo(精品视频图片资源) <a target="_blank" rel="noopener" href="https://www.videvo.net/">https://www.videvo.net</a></li>
<li>Pixabay(图片视频音频图形插画) <a target="_blank" rel="noopener" href="https://pixabay.com/">https://pixabay.com</a></li>
<li>Pexels(老牌图库网站) <a target="_blank" rel="noopener" href="https://www.pexels.com/zh-cn">https://www.pexels.com/zh-cn</a></li>
</ul>
<ol start="4">
<li>稀缺宝藏资源</li>
</ol>
<ul>
<li>千米游戏(全是爷青回游戏) <a target="_blank" rel="noopener" href="https://www.yikm.net/">https://www.yikm.net</a></li>
<li>AirPano(云旅游-巨爽) <a target="_blank" rel="noopener" href="https://www.airpano.org.cn/">https://www.airpano.org.cn</a></li>
<li>Upanso(优质度盘搜索) <a target="_blank" rel="noopener" href="https://upanso.com/">https://upanso.com</a></li>
</ul>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
<link itemprop="mainEntityOfPage" href="https://nydia.github.io/2022/10/01/interview/README/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="nydia">
<meta itemprop="description" content="开源,协作,共享,进步">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Talk is cheap,show me the code">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2022/10/01/interview/README/" class="post-title-link" itemprop="url">面试题集</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2022-10-01 17:52:56" itemprop="dateCreated datePublished" datetime="2022-10-01T17:52:56+08:00">2022-10-01</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2025-04-26 20:52:45" itemprop="dateModified" datetime="2025-04-26T20:52:45+08:00">2025-04-26</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">In</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/%E9%9D%A2%E8%AF%95/" itemprop="url" rel="index"><span itemprop="name">面试</span></a>
</span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h2 id="题库"><a href="#题库" class="headerlink" title="题库"></a>题库</h2><ul>
<li><a target="_blank" rel="noopener" href="https://cloud.tencent.com/developer/article/1812085">JVM虚拟机面试题</a></li>
<li><a target="_blank" rel="noopener" href="https://github.com/qinxuewu/docs/tree/master/docs">一个可以参考的学习之路</a></li>
<li><a target="_blank" rel="noopener" href="https://www.cnblogs.com/chen1005/p/10481102.html">Java 208道面试题及部分答案</a></li>
<li><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/dtsBOBPm59fabce0S4tKUA">阿里-面试题系列:JVM 夺命连环10问</a></li>
<li><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/pIu82Ndob6tapw8B0Wgn-A">阿里-面试题系列:Linux 夺命连环5问</a></li>
<li><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/srIgoFyW9j3z-QnyUPPaGg">阿里-面试题系列:Zookeeper 夺命连环9问</a></li>
<li><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/nBatZCMmt6_48g6SBpXK1g">阿里-面试题系列:MQ 夺命连环11问</a></li>
<li><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/dhywrsaEbX5GfMsm8Xs2aA">阿里-面试题系列:Dubbo 夺命连环9问</a></li>
<li><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/1fzVVw4dqjXO97ZcMnICqw">阿里-面试题系列:分布式夺命连环9问</a></li>
<li><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/UASAEiGWrTUnSaG81eC27w">阿里-面试题系列:Java 夺命连环16问</a></li>
<li><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/-qYf8BNJVWDOcrQbJglWzw">阿里-面试题系列:Redis 夺命连环11问</a></li>
<li><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/JEQ9ha9NhZ-k3SUNlRx8Jw">阿里-面试题系列:Spring 夺命连环10问</a></li>
<li><a target="_blank" rel="noopener" href="https://mp.weixin.qq.com/s/RjJv4uRrqaCg5jqijAG0BA">阿里-面试题系列:Mysql 夺命连环13问</a></li>
</ul>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
<link itemprop="mainEntityOfPage" href="https://nydia.github.io/2022/10/01/index/index/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="nydia">
<meta itemprop="description" content="开源,协作,共享,进步">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Talk is cheap,show me the code">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2022/10/01/index/index/" class="post-title-link" itemprop="url">博客目录</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2022-10-01 17:52:56" itemprop="dateCreated datePublished" datetime="2022-10-01T17:52:56+08:00">2022-10-01</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2025-04-26 20:51:02" itemprop="dateModified" datetime="2025-04-26T20:51:02+08:00">2025-04-26</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">In</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/%E5%8D%9A%E5%AE%A2%E7%9B%AE%E5%BD%95/" itemprop="url" rel="index"><span itemprop="name">博客目录</span></a>
</span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h2 id="RocketMQ"><a href="#RocketMQ" class="headerlink" title="RocketMQ"></a>RocketMQ</h2><ul>
<li><p><a href="../rocketmq-docs/cn/README.md">rocketmq中文文档</a></p>
</li>
<li><p><a href="../rocketmq-docs/en/README.md">rocketmq英文文档</a></p>
</li>
</ul>
<h2 id="Flutter介绍"><a href="#Flutter介绍" class="headerlink" title="Flutter介绍"></a>Flutter介绍</h2><ul>
<li><a href="../flutter/flutter.md">flutter简单介绍</a></li>
</ul>
<h2 id="ShardingSphere"><a href="#ShardingSphere" class="headerlink" title="ShardingSphere"></a>ShardingSphere</h2><ul>
<li><a target="_blank" rel="noopener" href="https://shardingsphere.apache.org/document/current/cn/overview/">ShardingSphere中文文档</a></li>
</ul>
<h2 id="工具类网站"><a href="#工具类网站" class="headerlink" title="工具类网站"></a>工具类网站</h2><ul>
<li><a href="../tech-tools/README.md">工具类网站</a></li>
</ul>
<h2 id="技术书单"><a href="#技术书单" class="headerlink" title="技术书单"></a>技术书单</h2><ul>
<li><a href="../books/java/README.md">Java必读书单</a></li>
<li><a href="../books/architect/README.md">架构师必读书单</a></li>
</ul>
<h2 id="面试题集"><a href="#面试题集" class="headerlink" title="面试题集"></a>面试题集</h2><ul>
<li><a href="../interview/README.md">面试题</a></li>
</ul>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
<link itemprop="mainEntityOfPage" href="https://nydia.github.io/2022/10/01/books/java/README/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="nydia">
<meta itemprop="description" content="开源,协作,共享,进步">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Talk is cheap,show me the code">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2022/10/01/books/java/README/" class="post-title-link" itemprop="url">Java书单</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2022-10-01 17:52:56" itemprop="dateCreated datePublished" datetime="2022-10-01T17:52:56+08:00">2022-10-01</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2025-04-26 19:40:01" itemprop="dateModified" datetime="2025-04-26T19:40:01+08:00">2025-04-26</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">In</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/Java%E4%B9%A6%E5%8D%95/" itemprop="url" rel="index"><span itemprop="name">Java书单</span></a>
</span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="JavaBooks"><a href="#JavaBooks" class="headerlink" title="JavaBooks"></a>JavaBooks</h1><ul>
<li>推荐书单</li>
</ul>
<h2 id="书单"><a href="#书单" class="headerlink" title="书单"></a>书单</h2><h3 id="01-JVM"><a href="#01-JVM" class="headerlink" title="01.JVM"></a>01.JVM</h3><ul>
<li>深入理解Java虚拟机</li>
</ul>
<h3 id="02-NIO"><a href="#02-NIO" class="headerlink" title="02.NIO"></a>02.NIO</h3><ul>
<li>Netty实战</li>
<li>Netty权威指南</li>
</ul>
<h3 id="03-Java并发编程"><a href="#03-Java并发编程" class="headerlink" title="03.Java并发编程"></a>03.Java并发编程</h3><ul>
<li>Java并发编程实践</li>
</ul>
<h3 id="04-技术框架"><a href="#04-技术框架" class="headerlink" title="04.技术框架"></a>04.技术框架</h3><ul>
<li>Spring 实战</li>
<li>Spring Boot编程思想</li>
</ul>
<h3 id="05-数据库"><a href="#05-数据库" class="headerlink" title="05.数据库"></a>05.数据库</h3><ul>
<li>高可用MySQL</li>
<li>高性能MySQL</li>
</ul>
<h3 id="06-分库分表"><a href="#06-分库分表" class="headerlink" title="06.分库分表"></a>06.分库分表</h3><ul>
<li><a target="_blank" rel="noopener" href="https://shardingsphere.apache.org/pdf/shardingsphere_docs_cn.pdf">https://shardingsphere.apache.org/pdf/shardingsphere_docs_cn.pdf</a></li>
</ul>
<h3 id="07-RPC与微服务"><a href="#07-RPC与微服务" class="headerlink" title="07.RPC与微服务"></a>07.RPC与微服务</h3><ul>
<li>深度剖析Apache Dubbo核心技术内幕</li>
</ul>
<h3 id="08-分布式缓存"><a href="#08-分布式缓存" class="headerlink" title="08.分布式缓存"></a>08.分布式缓存</h3><ul>
<li>深入分布式缓存:从原理到实践</li>
</ul>
<h3 id="09-分布式消息"><a href="#09-分布式消息" class="headerlink" title="09.分布式消息"></a>09.分布式消息</h3><ul>
<li>分布式消息中间件实践</li>
</ul>
<h3 id="10-分布式架构设计"><a href="#10-分布式架构设计" class="headerlink" title="10.分布式架构设计"></a>10.分布式架构设计</h3><ul>
<li>数据密集型应用系统设计</li>
<li>高可用架构,高可用可伸缩微服务架构:基于Dubbo、Spring Cloud和Service Mesh</li>
<li>微服务架构设计模式</li>
</ul>
<h3 id="11-重构与系统改造"><a href="#11-重构与系统改造" class="headerlink" title="11.重构与系统改造"></a>11.重构与系统改造</h3><ul>
<li>大型网站技术架构演进与性能优化</li>
<li>发布!设计与部署稳定的分布式系统</li>
<li>重构:改善既有代码的设计</li>
</ul>
<h3 id="12-程序员成长"><a href="#12-程序员成长" class="headerlink" title="12.程序员成长"></a>12.程序员成长</h3><ul>
<li>高效程序员的45个习惯</li>
</ul>
<h3 id="99-其他"><a href="#99-其他" class="headerlink" title="99.其他"></a>99.其他</h3><h2 id="详细推荐书单"><a href="#详细推荐书单" class="headerlink" title="详细推荐书单"></a>详细推荐书单</h2><h4 id="基础入门"><a href="#基础入门" class="headerlink" title="基础入门"></a>基础入门</h4><p>Java编程思想(Thinking in Java)、Java核心技术(Core Java) ,Java8 实战(Java in action),Effective Java中文版,代码大全</p>
<h4 id="框架入门与深入"><a href="#框架入门与深入" class="headerlink" title="框架入门与深入"></a>框架入门与深入</h4><p>Spring实战(Spring in action),Hibernate实战(Java Persistence with Hibernate),深入分析Java Web技术内幕,互联网轻量级SSM框架解密,MyBatis 3源码深度解析,Spring技术内幕,Spring Boot技术内幕,Spring微服务实战</p>
<h4 id="NIO与并发编程"><a href="#NIO与并发编程" class="headerlink" title="NIO与并发编程"></a>NIO与并发编程</h4><p>Java并发编程实战(Java Concurrency in Practice),Java并发编程的艺术,Java异步编程实战,Netty实战,Netty权威指南,NIO与Socket编程技术指南,</p>
<h4 id="JVM与性能"><a href="#JVM与性能" class="headerlink" title="JVM与性能"></a>JVM与性能</h4><p>深入理解Java虚拟机,深入理解JVM字节码,Java性能优化权威指南,Java性能权威指南,性能之巅,高可用MySQL,高性能MySQL</p>
<h4 id="分布式与中间件"><a href="#分布式与中间件" class="headerlink" title="分布式与中间件"></a>分布式与中间件</h4><p>分布式系统:概念与设计,分布式消息中间件实践,分布式系统应用设计,数据密集型应用系统设计,分布式服务架构:原理、设计与实战,分布式系统架构,深入分布式缓存:从原理到实践,Kafka权威指南,深入理解Kafka:核心设计与实践原理,Apache Kafka源码剖析,RocketMQ技术内幕:RocketMQ架构设计与实现原理,深度剖析Apache Dubbo核心技术内幕,Redis实战,</p>
<h4 id="架构设计与互联网技术"><a href="#架构设计与互联网技术" class="headerlink" title="架构设计与互联网技术"></a>架构设计与互联网技术</h4><p>系统架构:复杂系统的产品设计与开发,软件架构,分布式系统架构:技术栈详解与快速进阶,亿级流量网站架构核心技术,京东基础架构建设之路,企业IT架构转型之道:阿里巴巴中台战略思想与架构实战,高可用架构,高可用可伸缩微服务架构:基于Dubbo、Spring Cloud和Service Mesh,架构之美,架构简介之道,大型网站技术架构演进与性能优化,发布!设计与部署稳定的分布式系统,微服务架构设计模式,微服务设计,生产微服务,软件系统架构:使用视点和视角与利益相关者合 ,DevOps 软件架构师行动指南,DevOps 实践指南,企业应用架构模式,企业集成模式</p>
<h4 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h4><p>图解设计模式、图解HTTP协议、图解性能优化,重构:改善既有代码的设计,混沌工程,深入理解计算机系统,数据库全书,虚拟机:系统与进程的通用平台,程序员的职业素养,数学之美,算法之美,系统之美,计算进化史,人月神话,编程珠玑,高效程序员的45个习惯:敏捷开发修炼之道,算法导论,计算机程序设计艺术,程序员修炼之道,有效的单元测试</p>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
<link itemprop="mainEntityOfPage" href="https://nydia.github.io/2022/10/01/books/architect/README/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="nydia">
<meta itemprop="description" content="开源,协作,共享,进步">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Talk is cheap,show me the code">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2022/10/01/books/architect/README/" class="post-title-link" itemprop="url">架构师书单</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2022-10-01 17:52:56" itemprop="dateCreated datePublished" datetime="2022-10-01T17:52:56+08:00">2022-10-01</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2025-04-26 19:21:14" itemprop="dateModified" datetime="2025-04-26T19:21:14+08:00">2025-04-26</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">In</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/%E4%B9%A6%E5%8D%95/" itemprop="url" rel="index"><span itemprop="name">书单</span></a>
</span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="架构师书单"><a href="#架构师书单" class="headerlink" title="架构师书单"></a>架构师书单</h1><p><strong>第一步重要的 linux编程艺术 、 unix编程艺术</strong></p>
<h2 id="成长篇"><a href="#成长篇" class="headerlink" title="成长篇"></a>成长篇</h2><p>《异类》<br>《随机漫步的傻瓜》<br>《一万小时天才理论》<br>《情商》<br>《优秀到不能被忽视》<br>《影响力大师》<br>《优化你的两个小时》<br>《有效学习》(微信读书)(推荐理由: 关于学习的书籍,我看过很多本,觉得最有科学指导意义的就是《有效学习》这本)</p>
<p>《如何系统的思考》(偏重实践)</p>
<p>《系统思考》(偏重理论)</p>
<h3 id="与程序员沟通、向上管理、表达能力"><a href="#与程序员沟通、向上管理、表达能力" class="headerlink" title="与程序员沟通、向上管理、表达能力"></a>与程序员沟通、向上管理、表达能力</h3><p>与程序员沟通、向上管理、表达能力(比如如何把一个技术点、项目方案给大家讲清楚)以及技术视野提升和架构思维等主题相关。 秦老师有什么书建议吗? 见附件非技术书。最推荐的几本: 暗时间,告诉你很多你看不清的事实。 金字塔原理,把结构化思维和表达说明白了。 非暴力沟通,把怎么有效沟通跟其他情况区分开了。</p>
<p>暗时间.pdf</p>
<p>金字塔原理_高清版.pdf</p>
<p>麦肯锡方法完整版.pdf</p>
<p>《原则》中文版.pdf</p>
<p>领导者的优势:掌握思维突破点的5个技巧.pdf</p>
<p>重新定义公司.埃里克•施密特,乔纳森•罗森伯格.pdf</p>
<p>职场新人的典型问题.pdf</p>
<p>沟通技巧和方法培训PPT.pptx</p>
<p>非暴力沟通+完整中文版.pdf</p>
<h2 id="技术篇"><a href="#技术篇" class="headerlink" title="技术篇"></a>技术篇</h2><p>学习的思路:</p>
<ol>
<li><p>深度学习你的代码运行环境:例如 Linux 程序员一定要深入学习 Linux 和 UNIX 的操作系统,iOS 程序员要深入学习 iOS 系统,前端程序员要深入学习浏览器原理,以此类推。</p>
</li>
<li><p>深入学习你的核心工具:例如 Java 程序员的核心工具是 Java,嵌入式程序员是 C,而 DBA 就不是学编程语言,而是学 MySQL 或者 Oracle 了。</p>
</li>
<li><p>深度学习领域基础知识:例如后端程序员的网络编程,前端程序员的动效知识,Android 客户端程序员的渲染知识,以及所有程序员都要求的算法知识等。</p>
</li>
<li><p>广泛学习技术领域的通用成熟技术:例如前端程序员要学的 React 和 Vue,Java 程序员要学的 Netty、Spring,互联网后端程序员的标配 MySQL、Redis 等。下面我以 Linux 后端 Java 程序员为例,给你推荐相关技术书籍。</p>
</li>
</ol>
<p>《UNIX 编程艺术》<br>《UNIX 网络编程(卷 1)》<br>《UNIX 环境高级编程》<br>《Linux 系统编程》<br>《TCP/IP 详解(卷 1)》<br>《算法之美》<br>《算法设计与应用》<br>《Java 编程思想》<br>《深入理解 Java 虚拟机》<br>《C++ Primer》<br>《增长黑客》<br>《需求》<br>《淘宝十年产品事》<br>《定位》<br>《宝洁制胜战略》</p>
<h2 id="业务篇"><a href="#业务篇" class="headerlink" title="业务篇"></a>业务篇</h2><h3 id="支付"><a href="#支付" class="headerlink" title="支付"></a>支付</h3><p>《支付方法论》</p>
<p>《一本书读懂支付》</p>
<h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><h3 id="人工智能学习方向(AI"><a href="#人工智能学习方向(AI" class="headerlink" title="人工智能学习方向(AI)"></a>人工智能学习方向(AI)</h3><ul>
<li><p>《机器学习实战》</p>
</li>
<li><p>《机器学习实战》 </p>
<p><a target="_blank" rel="noopener" href="https://cloud.tencent.com/developer/article/1512788">https://cloud.tencent.com/developer/article/1512788</a></p>
</li>
</ul>
<h3 id="大数据学习方向"><a href="#大数据学习方向" class="headerlink" title="大数据学习方向"></a>大数据学习方向</h3><ul>
<li>《实战大数据》</li>
</ul>
</div>
<footer class="post-footer">
<div class="post-eof"></div>
</footer>
</article>
<article itemscope itemtype="http://schema.org/Article" class="post-block" lang="en">
<link itemprop="mainEntityOfPage" href="https://nydia.github.io/2022/10/01/rocketmq-docs/cn/RocketMQ_Example/">
<span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
<meta itemprop="image" content="/images/avatar.gif">
<meta itemprop="name" content="nydia">
<meta itemprop="description" content="开源,协作,共享,进步">
</span>
<span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
<meta itemprop="name" content="Talk is cheap,show me the code">
</span>
<header class="post-header">
<h2 class="post-title" itemprop="name headline">
<a href="/2022/10/01/rocketmq-docs/cn/RocketMQ_Example/" class="post-title-link" itemprop="url">RocketMQ样例</a>
</h2>
<div class="post-meta">
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar"></i>
</span>
<span class="post-meta-item-text">Posted on</span>
<time title="Created: 2022-10-01 17:52:56" itemprop="dateCreated datePublished" datetime="2022-10-01T17:52:56+08:00">2022-10-01</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-calendar-check"></i>
</span>
<span class="post-meta-item-text">Edited on</span>
<time title="Modified: 2025-04-26 20:58:13" itemprop="dateModified" datetime="2025-04-26T20:58:13+08:00">2025-04-26</time>
</span>
<span class="post-meta-item">
<span class="post-meta-item-icon">
<i class="far fa-folder"></i>
</span>
<span class="post-meta-item-text">In</span>
<span itemprop="about" itemscope itemtype="http://schema.org/Thing">
<a href="/categories/RocketMQ/" itemprop="url" rel="index"><span itemprop="name">RocketMQ</span></a>
</span>
</span>
</div>
</header>
<div class="post-body" itemprop="articleBody">
<h1 id="样例"><a href="#样例" class="headerlink" title="样例"></a>样例</h1><hr>
<h2 id="1-基本样例"><a href="#1-基本样例" class="headerlink" title="1 基本样例"></a>1 基本样例</h2><p>在基本样例中我们提供如下的功能场景:</p>
<ul>
<li>使用RocketMQ发送三种类型的消息:同步消息、异步消息和单向消息。其中前两种消息是可靠的,因为会有发送是否成功的应答。</li>
<li>使用RocketMQ来消费接收到的消息。</li>
</ul>
<h3 id="1-1-加入依赖:"><a href="#1-1-加入依赖:" class="headerlink" title="1.1 加入依赖:"></a>1.1 加入依赖:</h3><p><code>maven:</code></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><dependency></span><br><span class="line"> <groupId>org.apache.rocketmq</groupId></span><br><span class="line"> <artifactId>rocketmq-client</artifactId></span><br><span class="line"> <version>4.3.0</version></span><br><span class="line"></dependency></span><br></pre></td></tr></table></figure>
<p><code>gradle</code></p>
<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">compile 'org.apache.rocketmq:rocketmq-client:4.3.0'</span><br></pre></td></tr></table></figure>
<h3 id="1-2-消息发送"><a href="#1-2-消息发送" class="headerlink" title="1.2 消息发送"></a>1.2 消息发送</h3><h4 id="1、Producer端发送同步消息"><a href="#1、Producer端发送同步消息" class="headerlink" title="1、Producer端发送同步消息"></a>1、Producer端发送同步消息</h4><p>这种可靠性同步地发送方式使用的比较广泛,比如:重要的消息通知,短信通知。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SyncProducer</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="comment">// 实例化消息生产者Producer</span></span><br><span class="line"> <span class="type">DefaultMQProducer</span> <span class="variable">producer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DefaultMQProducer</span>(<span class="string">"please_rename_unique_group_name"</span>);</span><br><span class="line"> <span class="comment">// 设置NameServer的地址</span></span><br><span class="line"> producer.setNamesrvAddr(<span class="string">"localhost:9876"</span>);</span><br><span class="line"> <span class="comment">// 启动Producer实例</span></span><br><span class="line"> producer.start();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < <span class="number">100</span>; i++) {</span><br><span class="line"> <span class="comment">// 创建消息,并指定Topic,Tag和消息体</span></span><br><span class="line"> <span class="type">Message</span> <span class="variable">msg</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Message</span>(<span class="string">"TopicTest"</span> <span class="comment">/* Topic */</span>,</span><br><span class="line"> <span class="string">"TagA"</span> <span class="comment">/* Tag */</span>,</span><br><span class="line"> (<span class="string">"Hello RocketMQ "</span> + i).getBytes(RemotingHelper.DEFAULT_CHARSET) <span class="comment">/* Message body */</span></span><br><span class="line"> );</span><br><span class="line"> <span class="comment">// 发送消息到一个Broker</span></span><br><span class="line"> <span class="type">SendResult</span> <span class="variable">sendResult</span> <span class="operator">=</span> producer.send(msg);</span><br><span class="line"> <span class="comment">// 通过sendResult返回消息是否成功送达</span></span><br><span class="line"> System.out.printf(<span class="string">"%s%n"</span>, sendResult);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 如果不再发送消息,关闭Producer实例。</span></span><br><span class="line"> producer.shutdown();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h4 id="2、发送异步消息"><a href="#2、发送异步消息" class="headerlink" title="2、发送异步消息"></a>2、发送异步消息</h4><p>异步消息通常用在对响应时间敏感的业务场景,即发送端不能容忍长时间地等待Broker的响应。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AsyncProducer</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="comment">// 实例化消息生产者Producer</span></span><br><span class="line"> <span class="type">DefaultMQProducer</span> <span class="variable">producer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DefaultMQProducer</span>(<span class="string">"please_rename_unique_group_name"</span>);</span><br><span class="line"> <span class="comment">// 设置NameServer的地址</span></span><br><span class="line"> producer.setNamesrvAddr(<span class="string">"localhost:9876"</span>);</span><br><span class="line"> <span class="comment">// 启动Producer实例</span></span><br><span class="line"> producer.start();</span><br><span class="line"> producer.setRetryTimesWhenSendAsyncFailed(<span class="number">0</span>);</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < <span class="number">100</span>; i++) {</span><br><span class="line"> <span class="keyword">final</span> <span class="type">int</span> <span class="variable">index</span> <span class="operator">=</span> i;</span><br><span class="line"> <span class="comment">// 创建消息,并指定Topic,Tag和消息体</span></span><br><span class="line"> <span class="type">Message</span> <span class="variable">msg</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Message</span>(<span class="string">"TopicTest"</span>,</span><br><span class="line"> <span class="string">"TagA"</span>,</span><br><span class="line"> <span class="string">"OrderID188"</span>,</span><br><span class="line"> <span class="string">"Hello world"</span>.getBytes(RemotingHelper.DEFAULT_CHARSET));</span><br><span class="line"> <span class="comment">// SendCallback接收异步返回结果的回调</span></span><br><span class="line"> producer.send(msg, <span class="keyword">new</span> <span class="title class_">SendCallback</span>() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onSuccess</span><span class="params">(SendResult sendResult)</span> {</span><br><span class="line"> System.out.printf(<span class="string">"%-10d OK %s %n"</span>, index,</span><br><span class="line"> sendResult.getMsgId());</span><br><span class="line"> }</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">onException</span><span class="params">(Throwable e)</span> {</span><br><span class="line"> System.out.printf(<span class="string">"%-10d Exception %s %n"</span>, index, e);</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 如果不再发送消息,关闭Producer实例。</span></span><br><span class="line"> producer.shutdown();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h4 id="3、单向发送消息"><a href="#3、单向发送消息" class="headerlink" title="3、单向发送消息"></a>3、单向发送消息</h4><p>这种方式主要用在不特别关心发送结果的场景,例如日志发送。</p>
<figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">OnewayProducer</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception{</span><br><span class="line"> <span class="comment">// 实例化消息生产者Producer</span></span><br><span class="line"> <span class="type">DefaultMQProducer</span> <span class="variable">producer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DefaultMQProducer</span>(<span class="string">"please_rename_unique_group_name"</span>);</span><br><span class="line"> <span class="comment">// 设置NameServer的地址</span></span><br><span class="line"> producer.setNamesrvAddr(<span class="string">"localhost:9876"</span>);</span><br><span class="line"> <span class="comment">// 启动Producer实例</span></span><br><span class="line"> producer.start();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < <span class="number">100</span>; i++) {</span><br><span class="line"> <span class="comment">// 创建消息,并指定Topic,Tag和消息体</span></span><br><span class="line"> <span class="type">Message</span> <span class="variable">msg</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Message</span>(<span class="string">"TopicTest"</span> <span class="comment">/* Topic */</span>,</span><br><span class="line"> <span class="string">"TagA"</span> <span class="comment">/* Tag */</span>,</span><br><span class="line"> (<span class="string">"Hello RocketMQ "</span> + i).getBytes(RemotingHelper.DEFAULT_CHARSET) <span class="comment">/* Message body */</span></span><br><span class="line"> );</span><br><span class="line"> <span class="comment">// 发送单向消息,没有任何返回结果</span></span><br><span class="line"> producer.sendOneway(msg);</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 如果不再发送消息,关闭Producer实例。</span></span><br><span class="line"> producer.shutdown();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="1-3-消费消息"><a href="#1-3-消费消息" class="headerlink" title="1.3 消费消息"></a>1.3 消费消息</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Consumer</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> InterruptedException, MQClientException {</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 实例化消费者</span></span><br><span class="line"> <span class="type">DefaultMQPushConsumer</span> <span class="variable">consumer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DefaultMQPushConsumer</span>(<span class="string">"please_rename_unique_group_name"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 设置NameServer的地址</span></span><br><span class="line"> consumer.setNamesrvAddr(<span class="string">"localhost:9876"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 订阅一个或者多个Topic,以及Tag来过滤需要消费的消息</span></span><br><span class="line"> consumer.subscribe(<span class="string">"TopicTest"</span>, <span class="string">"*"</span>);</span><br><span class="line"> <span class="comment">// 注册回调实现类来处理从broker拉取回来的消息</span></span><br><span class="line"> consumer.registerMessageListener(<span class="keyword">new</span> <span class="title class_">MessageListenerConcurrently</span>() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> ConsumeConcurrentlyStatus <span class="title function_">consumeMessage</span><span class="params">(List<MessageExt> msgs, ConsumeConcurrentlyContext context)</span> {</span><br><span class="line"> System.out.printf(<span class="string">"%s Receive New Messages: %s %n"</span>, Thread.currentThread().getName(), msgs);</span><br><span class="line"> <span class="comment">// 标记该消息已经被成功消费</span></span><br><span class="line"> <span class="keyword">return</span> ConsumeConcurrentlyStatus.CONSUME_SUCCESS;</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> <span class="comment">// 启动消费者实例</span></span><br><span class="line"> consumer.start();</span><br><span class="line"> System.out.printf(<span class="string">"Consumer Started.%n"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="2-顺序消息样例"><a href="#2-顺序消息样例" class="headerlink" title="2 顺序消息样例"></a>2 顺序消息样例</h2><p>消息有序指的是可以按照消息的发送顺序来消费(FIFO)。RocketMQ可以严格的保证消息有序,可以分为分区有序或者全局有序。</p>
<p>顺序消费的原理解析,在默认的情况下消息发送会采取Round Robin轮询方式把消息发送到不同的queue(分区队列);而消费消息的时候从多个queue上拉取消息,这种情况发送和消费是不能保证顺序。但是如果控制发送的顺序消息只依次发送到同一个queue中,消费的时候只从这个queue上依次拉取,则就保证了顺序。当发送和消费参与的queue只有一个,则是全局有序;如果多个queue参与,则为分区有序,即相对每个queue,消息都是有序的。</p>
<p>下面用订单进行分区有序的示例。一个订单的顺序流程是:创建、付款、推送、完成。订单号相同的消息会被先后发送到同一个队列中,消费时,同一个OrderId获取到的肯定是同一个队列。</p>
<h3 id="2-1-顺序消息生产"><a href="#2-1-顺序消息生产" class="headerlink" title="2.1 顺序消息生产"></a>2.1 顺序消息生产</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> org.apache.rocketmq.example.order2;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.producer.DefaultMQProducer;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.producer.MessageQueueSelector;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.producer.SendResult;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.common.message.Message;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.common.message.MessageQueue;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.text.SimpleDateFormat;</span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">* Producer,发送顺序消息</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Producer</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="type">DefaultMQProducer</span> <span class="variable">producer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DefaultMQProducer</span>(<span class="string">"please_rename_unique_group_name"</span>);</span><br><span class="line"></span><br><span class="line"> producer.setNamesrvAddr(<span class="string">"127.0.0.1:9876"</span>);</span><br><span class="line"></span><br><span class="line"> producer.start();</span><br><span class="line"></span><br><span class="line"> String[] tags = <span class="keyword">new</span> <span class="title class_">String</span>[]{<span class="string">"TagA"</span>, <span class="string">"TagC"</span>, <span class="string">"TagD"</span>};</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 订单列表</span></span><br><span class="line"> List<OrderStep> orderList = <span class="keyword">new</span> <span class="title class_">Producer</span>().buildOrders();</span><br><span class="line"></span><br><span class="line"> <span class="type">Date</span> <span class="variable">date</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line"> <span class="type">SimpleDateFormat</span> <span class="variable">sdf</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SimpleDateFormat</span>(<span class="string">"yyyy-MM-dd HH:mm:ss"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">dateStr</span> <span class="operator">=</span> sdf.format(date);</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < <span class="number">10</span>; i++) {</span><br><span class="line"> <span class="comment">// 加个时间前缀</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">body</span> <span class="operator">=</span> dateStr + <span class="string">" Hello RocketMQ "</span> + orderList.get(i);</span><br><span class="line"> <span class="type">Message</span> <span class="variable">msg</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Message</span>(<span class="string">"TopicTest"</span>, tags[i % tags.length], <span class="string">"KEY"</span> + i, body.getBytes());</span><br><span class="line"></span><br><span class="line"> <span class="type">SendResult</span> <span class="variable">sendResult</span> <span class="operator">=</span> producer.send(msg, <span class="keyword">new</span> <span class="title class_">MessageQueueSelector</span>() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> MessageQueue <span class="title function_">select</span><span class="params">(List<MessageQueue> mqs, Message msg, Object arg)</span> {</span><br><span class="line"> <span class="type">Long</span> <span class="variable">id</span> <span class="operator">=</span> (Long) arg; <span class="comment">//根据订单id选择发送queue</span></span><br><span class="line"> <span class="type">long</span> <span class="variable">index</span> <span class="operator">=</span> id % mqs.size();</span><br><span class="line"> <span class="keyword">return</span> mqs.get((<span class="type">int</span>) index);</span><br><span class="line"> }</span><br><span class="line"> }, orderList.get(i).getOrderId());<span class="comment">//订单id</span></span><br><span class="line"></span><br><span class="line"> System.out.println(String.format(<span class="string">"SendResult status:%s, queueId:%d, body:%s"</span>,</span><br><span class="line"> sendResult.getSendStatus(),</span><br><span class="line"> sendResult.getMessageQueue().getQueueId(),</span><br><span class="line"> body));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> producer.shutdown();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 订单的步骤</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">OrderStep</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="type">long</span> orderId;</span><br><span class="line"> <span class="keyword">private</span> String desc;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="type">long</span> <span class="title function_">getOrderId</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> orderId;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setOrderId</span><span class="params">(<span class="type">long</span> orderId)</span> {</span><br><span class="line"> <span class="built_in">this</span>.orderId = orderId;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">getDesc</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> desc;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setDesc</span><span class="params">(String desc)</span> {</span><br><span class="line"> <span class="built_in">this</span>.desc = desc;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"OrderStep{"</span> +</span><br><span class="line"> <span class="string">"orderId="</span> + orderId +</span><br><span class="line"> <span class="string">", desc='"</span> + desc + <span class="string">'\''</span> +</span><br><span class="line"> <span class="string">'}'</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 生成模拟订单数据</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> List<OrderStep> <span class="title function_">buildOrders</span><span class="params">()</span> {</span><br><span class="line"> List<OrderStep> orderList = <span class="keyword">new</span> <span class="title class_">ArrayList</span><OrderStep>();</span><br><span class="line"></span><br><span class="line"> <span class="type">OrderStep</span> <span class="variable">orderDemo</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">OrderStep</span>();</span><br><span class="line"> orderDemo.setOrderId(<span class="number">15103111039L</span>);</span><br><span class="line"> orderDemo.setDesc(<span class="string">"创建"</span>);</span><br><span class="line"> orderList.add(orderDemo);</span><br><span class="line"></span><br><span class="line"> orderDemo = <span class="keyword">new</span> <span class="title class_">OrderStep</span>();</span><br><span class="line"> orderDemo.setOrderId(<span class="number">15103111065L</span>);</span><br><span class="line"> orderDemo.setDesc(<span class="string">"创建"</span>);</span><br><span class="line"> orderList.add(orderDemo);</span><br><span class="line"></span><br><span class="line"> orderDemo = <span class="keyword">new</span> <span class="title class_">OrderStep</span>();</span><br><span class="line"> orderDemo.setOrderId(<span class="number">15103111039L</span>);</span><br><span class="line"> orderDemo.setDesc(<span class="string">"付款"</span>);</span><br><span class="line"> orderList.add(orderDemo);</span><br><span class="line"></span><br><span class="line"> orderDemo = <span class="keyword">new</span> <span class="title class_">OrderStep</span>();</span><br><span class="line"> orderDemo.setOrderId(<span class="number">15103117235L</span>);</span><br><span class="line"> orderDemo.setDesc(<span class="string">"创建"</span>);</span><br><span class="line"> orderList.add(orderDemo);</span><br><span class="line"></span><br><span class="line"> orderDemo = <span class="keyword">new</span> <span class="title class_">OrderStep</span>();</span><br><span class="line"> orderDemo.setOrderId(<span class="number">15103111065L</span>);</span><br><span class="line"> orderDemo.setDesc(<span class="string">"付款"</span>);</span><br><span class="line"> orderList.add(orderDemo);</span><br><span class="line"></span><br><span class="line"> orderDemo = <span class="keyword">new</span> <span class="title class_">OrderStep</span>();</span><br><span class="line"> orderDemo.setOrderId(<span class="number">15103117235L</span>);</span><br><span class="line"> orderDemo.setDesc(<span class="string">"付款"</span>);</span><br><span class="line"> orderList.add(orderDemo);</span><br><span class="line"></span><br><span class="line"> orderDemo = <span class="keyword">new</span> <span class="title class_">OrderStep</span>();</span><br><span class="line"> orderDemo.setOrderId(<span class="number">15103111065L</span>);</span><br><span class="line"> orderDemo.setDesc(<span class="string">"完成"</span>);</span><br><span class="line"> orderList.add(orderDemo);</span><br><span class="line"></span><br><span class="line"> orderDemo = <span class="keyword">new</span> <span class="title class_">OrderStep</span>();</span><br><span class="line"> orderDemo.setOrderId(<span class="number">15103111039L</span>);</span><br><span class="line"> orderDemo.setDesc(<span class="string">"推送"</span>);</span><br><span class="line"> orderList.add(orderDemo);</span><br><span class="line"></span><br><span class="line"> orderDemo = <span class="keyword">new</span> <span class="title class_">OrderStep</span>();</span><br><span class="line"> orderDemo.setOrderId(<span class="number">15103117235L</span>);</span><br><span class="line"> orderDemo.setDesc(<span class="string">"完成"</span>);</span><br><span class="line"> orderList.add(orderDemo);</span><br><span class="line"></span><br><span class="line"> orderDemo = <span class="keyword">new</span> <span class="title class_">OrderStep</span>();</span><br><span class="line"> orderDemo.setOrderId(<span class="number">15103111039L</span>);</span><br><span class="line"> orderDemo.setDesc(<span class="string">"完成"</span>);</span><br><span class="line"> orderList.add(orderDemo);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> orderList;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="2-2-顺序消费消息"><a href="#2-2-顺序消费消息" class="headerlink" title="2.2 顺序消费消息"></a>2.2 顺序消费消息</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.common.message.MessageExt;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="keyword">package</span> org.apache.rocketmq.example.order2;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyContext;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.consumer.listener.ConsumeOrderlyStatus;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.consumer.listener.MessageListenerOrderly;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.common.consumer.ConsumeFromWhere;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.common.message.MessageExt;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Random;</span><br><span class="line"><span class="keyword">import</span> java.util.concurrent.TimeUnit;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment">* 顺序消息消费,带事务方式(应用可控制Offset什么时候提交)</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ConsumerInOrder</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="type">DefaultMQPushConsumer</span> <span class="variable">consumer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DefaultMQPushConsumer</span>(<span class="string">"please_rename_unique_group_name_3"</span>);</span><br><span class="line"> consumer.setNamesrvAddr(<span class="string">"127.0.0.1:9876"</span>);</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费<br></span></span><br><span class="line"><span class="comment"> * 如果非第一次启动,那么按照上次消费的位置继续消费</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);</span><br><span class="line"></span><br><span class="line"> consumer.subscribe(<span class="string">"TopicTest"</span>, <span class="string">"TagA || TagC || TagD"</span>);</span><br><span class="line"></span><br><span class="line"> consumer.registerMessageListener(<span class="keyword">new</span> <span class="title class_">MessageListenerOrderly</span>() {</span><br><span class="line"></span><br><span class="line"> <span class="type">Random</span> <span class="variable">random</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Random</span>();</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> ConsumeOrderlyStatus <span class="title function_">consumeMessage</span><span class="params">(List<MessageExt> msgs, ConsumeOrderlyContext context)</span> {</span><br><span class="line"> context.setAutoCommit(<span class="literal">true</span>);</span><br><span class="line"> <span class="keyword">for</span> (MessageExt msg : msgs) {</span><br><span class="line"> <span class="comment">// 可以看到每个queue有唯一的consume线程来消费, 订单对每个queue(分区)有序</span></span><br><span class="line"> System.out.println(<span class="string">"consumeThread="</span> + Thread.currentThread().getName() + <span class="string">"queueId="</span> + msg.getQueueId() + <span class="string">", content:"</span> + <span class="keyword">new</span> <span class="title class_">String</span>(msg.getBody()));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//模拟业务逻辑处理中...</span></span><br><span class="line"> TimeUnit.SECONDS.sleep(random.nextInt(<span class="number">10</span>));</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> ConsumeOrderlyStatus.SUCCESS;</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"></span><br><span class="line"> consumer.start();</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"Consumer Started."</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h2 id="3-延时消息样例"><a href="#3-延时消息样例" class="headerlink" title="3 延时消息样例"></a>3 延时消息样例</h2><h3 id="3-1-启动消费者等待传入订阅消息"><a href="#3-1-启动消费者等待传入订阅消息" class="headerlink" title="3.1 启动消费者等待传入订阅消息"></a>3.1 启动消费者等待传入订阅消息</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.common.message.MessageExt;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ScheduledMessageConsumer</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="comment">// 实例化消费者</span></span><br><span class="line"> <span class="type">DefaultMQPushConsumer</span> <span class="variable">consumer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DefaultMQPushConsumer</span>(<span class="string">"ExampleConsumer"</span>);</span><br><span class="line"> <span class="comment">// 订阅Topics</span></span><br><span class="line"> consumer.subscribe(<span class="string">"TestTopic"</span>, <span class="string">"*"</span>);</span><br><span class="line"> <span class="comment">// 注册消息监听者</span></span><br><span class="line"> consumer.registerMessageListener(<span class="keyword">new</span> <span class="title class_">MessageListenerConcurrently</span>() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> ConsumeConcurrentlyStatus <span class="title function_">consumeMessage</span><span class="params">(List<MessageExt> messages, ConsumeConcurrentlyContext context)</span> {</span><br><span class="line"> <span class="keyword">for</span> (MessageExt message : messages) {</span><br><span class="line"> <span class="comment">// Print approximate delay time period</span></span><br><span class="line"> System.out.println(<span class="string">"Receive message[msgId="</span> + message.getMsgId() + <span class="string">"] "</span> + (System.currentTimeMillis() - message.getStoreTimestamp()) + <span class="string">"ms later"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> ConsumeConcurrentlyStatus.CONSUME_SUCCESS;</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> <span class="comment">// 启动消费者</span></span><br><span class="line"> consumer.start();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
<h3 id="3-2-发送延时消息"><a href="#3-2-发送延时消息" class="headerlink" title="3.2 发送延时消息"></a>3.2 发送延时消息</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.client.producer.DefaultMQProducer;</span><br><span class="line"><span class="keyword">import</span> org.apache.rocketmq.common.message.Message;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ScheduledMessageProducer</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="comment">// 实例化一个生产者来产生延时消息</span></span><br><span class="line"> <span class="type">DefaultMQProducer</span> <span class="variable">producer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DefaultMQProducer</span>(<span class="string">"ExampleProducerGroup"</span>);</span><br><span class="line"> <span class="comment">// 启动生产者</span></span><br><span class="line"> producer.start();</span><br><span class="line"> <span class="type">int</span> <span class="variable">totalMessagesToSend</span> <span class="operator">=</span> <span class="number">100</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < totalMessagesToSend; i++) {</span><br><span class="line"> <span class="type">Message</span> <span class="variable">message</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Message</span>(<span class="string">"TestTopic"</span>, (<span class="string">"Hello scheduled message "</span> + i).getBytes());</span><br><span class="line"> <span class="comment">// 设置延时等级3,这个消息将在10s之后发送(现在只支持固定的几个时间,详看delayTimeLevel)</span></span><br><span class="line"> message.setDelayTimeLevel(<span class="number">3</span>);</span><br><span class="line"> <span class="comment">// 发送消息</span></span><br><span class="line"> producer.send(message);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 关闭生产者</span></span><br><span class="line"> producer.shutdown();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
<h3 id="3-3-验证"><a href="#3-3-验证" class="headerlink" title="3.3 验证"></a>3.3 验证</h3><p>您将会看到消息的消费比存储时间晚10秒。</p>