Skip to content

Commit c3ee320

Browse files
committed
完善单元测试,优化启动流程
1 parent 5fecd10 commit c3ee320

File tree

15 files changed

+485
-60
lines changed

15 files changed

+485
-60
lines changed

README.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,10 @@
66

77
古诗词·一言API 是一个可以随机返回一句古诗词名句的接口。具有以下特点:
88

9-
* 快:使用 Vert.x Java 全异步框架开发,使用Redis数据库,确保毫秒级稳定响应。
9+
* 快:使用 Vert.x Java 全异步框架开发,使用 Redis 数据库,确保毫秒级稳定响应。
1010
* 全:支持 svg / txt / json / png 调用,满足你在任何地方的调用需求
1111
* 准:可以根据你的喜好,在指定的分类中进行随机返回
12+
* 稳:提供完整单元测试,已经过数百万次调用
1213

1314
本仓库是该项目的开源代码仓库,仅提供测试数据,其余数据请自行采集。
1415

@@ -17,13 +18,13 @@
1718

1819
### 新版接口上线:今日诗词API
1920

20-
本项目为开源的旧一句话诗词API,现已推出新版在线API:今日诗词 可供调用(暂不开源)
21+
现已推出新版在线一句话 API:今日诗词 可供调用。不开源
2122

2223
今日诗词API 可以根据不同地点、时间、节日、季节、天气、景观、城市进行智能推荐古诗词。
2324

24-
官网: [https://www.jinrishici.com](https://www.jinrishici.com)
25-
25+
官网:[https://www.jinrishici.com](https://www.jinrishici.com)
2626

27+
本 Github 项目继续开源并维护。
2728

2829

2930
### 安装
@@ -149,6 +150,11 @@ Jmeter: 100线程数 每线程循环 1000次,走HTTP
149150

150151
### 更新历史
151152

153+
* 2018.08.09 1.4:
154+
1. 补全单元测试
155+
2. 优化启动流程
156+
3. 升级依赖版本
157+
152158
* 2018.08.09 1.3:
153159
1. svg可以定义字体大小和间隔
154160

@@ -166,10 +172,6 @@ Jmeter: 100线程数 每线程循环 1000次,走HTTP
166172

167173
### 关于项目
168174

169-
这是我的个人项目,目的是为了弘扬中国传统文化。
170-
171175
名句数据由古诗文网收录整理,特此感谢。
172176

173-
若有任何建议,或者有工作实习的机会(本人大学在读),请联系 meetlhx#qq.com
174-
175177
若您对本人的其他作品或者文章感兴趣,请访问我的博客:[https://luan.ma](https://luan.ma/)

pom.xml

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
<properties>
1212
<java.version>1.8</java.version>
13-
<vertx.version>3.5.3</vertx.version>
13+
<vertx.version>3.6.3</vertx.version>
1414
</properties>
1515

1616
<build>
@@ -20,6 +20,7 @@
2020
</resource>
2121
</resources>
2222

23+
2324
<plugins>
2425
<plugin>
2526
<groupId>org.apache.maven.plugins</groupId>
@@ -107,11 +108,18 @@
107108
<version>${vertx.version}</version>
108109
</dependency>
109110

111+
<dependency>
112+
<groupId>io.vertx</groupId>
113+
<artifactId>vertx-web-client</artifactId>
114+
<version>${vertx.version}</version>
115+
</dependency>
116+
110117
<dependency>
111118
<groupId>org.apache.logging.log4j</groupId>
112119
<artifactId>log4j-api</artifactId>
113120
<version>2.11.1</version>
114121
</dependency>
122+
115123
<dependency>
116124
<groupId>org.apache.logging.log4j</groupId>
117125
<artifactId>log4j-core</artifactId>
@@ -124,6 +132,19 @@
124132
<version>1.4</version>
125133
</dependency>
126134

135+
<dependency>
136+
<groupId>junit</groupId>
137+
<artifactId>junit</artifactId>
138+
<version>4.12</version>
139+
<scope>test</scope>
140+
</dependency>
141+
142+
<dependency>
143+
<groupId>org.hamcrest</groupId>
144+
<artifactId>hamcrest-library</artifactId>
145+
<version>1.3</version>
146+
<scope>test</scope>
147+
</dependency>
127148

128149
</dependencies>
129150

src/main/java/ma/luan/yiyan/MainVerticle.java

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55

66
import io.vertx.core.DeploymentOptions;
77
import io.vertx.core.Future;
8-
import io.vertx.redis.RedisOptions;
98
import ma.luan.yiyan.api.ApiVerticle;
109
import ma.luan.yiyan.service.DataService;
1110
import ma.luan.yiyan.service.LogService;
@@ -21,27 +20,21 @@ public class MainVerticle extends AbstractVerticle {
2120
private Logger log = LogManager.getLogger(this.getClass());
2221

2322
@Override
24-
public void start() {
25-
26-
// 读取配置文件
27-
RedisOptions redisOptions = new RedisOptions()
28-
.setHost(config().getJsonObject("redis").getString("host","127.0.0.1"))
29-
.setPort(config().getJsonObject("redis").getInteger("port",6379))
30-
.setSelect(config().getJsonObject("redis").getInteger("select",0));
31-
23+
public void start(Future<Void> startFuture) {
3224
// 配置 RuntimeError 错误记录
3325
vertx.exceptionHandler(error -> log.error(error));
3426

3527
// 顺序部署 Verticle
3628
Future.<Void>succeededFuture()
37-
.compose(v -> Future.<String>future(s -> vertx.deployVerticle(new ApiVerticle(),new DeploymentOptions().setConfig(config()), s)))
38-
.compose(v -> Future.<String>future(s -> vertx.deployVerticle(new DataService(redisOptions), new DeploymentOptions().setConfig(config()),s)))
39-
.compose(v -> Future.<String>future(s -> vertx.deployVerticle(new LogService(redisOptions), s)))
40-
.compose(v -> log.info("Vert.x started successfully"),
41-
Future.future().setHandler(ar -> {
42-
if (ar.failed()) {
43-
log.error("Vert.x failed to start", ar.cause());
29+
.compose(v -> Future.<String>future(s -> vertx.deployVerticle(new ApiVerticle(), new DeploymentOptions().setConfig(config()), s)))
30+
.compose(v -> Future.<String>future(s -> vertx.deployVerticle(new DataService(), new DeploymentOptions().setConfig(config()), s)))
31+
.compose(v -> Future.<String>future(s -> vertx.deployVerticle(new LogService(), new DeploymentOptions().setConfig(config()), s)))
32+
.setHandler(result -> {
33+
if (result.succeeded()) {
34+
startFuture.complete();
35+
} else {
36+
startFuture.fail("Vert.x failed to start");
4437
}
45-
}));
38+
});
4639
}
4740
}

src/main/java/ma/luan/yiyan/api/ApiVerticle.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public void start(Future<Void> startFuture) {
3636
.failureHandler(this::returnError); // 对上面所有的错误进行处理
3737
vertx
3838
.createHttpServer()
39-
.requestHandler(router::accept)
39+
.requestHandler(router)
4040
.listen(
4141
config().getInteger("http.port", 8080),
4242
result -> {

src/main/java/ma/luan/yiyan/service/DataService.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99
import io.vertx.core.json.JsonArray;
1010
import io.vertx.core.json.JsonObject;
1111
import io.vertx.redis.RedisClient;
12-
import io.vertx.redis.RedisOptions;
1312
import ma.luan.yiyan.constants.Key;
1413
import ma.luan.yiyan.util.CategoryTrie;
1514
import ma.luan.yiyan.util.JsonCollector;
15+
import ma.luan.yiyan.util.OptionsUtil;
1616
import org.apache.logging.log4j.LogManager;
1717
import org.apache.logging.log4j.Logger;
1818

@@ -23,19 +23,15 @@
2323
public class DataService extends AbstractVerticle {
2424
private RedisClient redisClient;
2525
private Random random = new Random();
26-
private RedisOptions redisOptions;
2726
private Logger log = LogManager.getLogger(this.getClass());
28-
private static CategoryTrie keysInRedis = new CategoryTrie();
29-
30-
public DataService(RedisOptions redisOptions) {
31-
this.redisOptions = redisOptions;
32-
}
27+
private CategoryTrie keysInRedis = new CategoryTrie();
3328

3429
@Override
3530
public void start(Future<Void> startFuture) {
3631
vertx.eventBus().consumer(Key.GET_GUSHICI_FROM_REDIS, this::getGushiciFromRedis);
3732
vertx.eventBus().consumer(Key.GET_HELP_FROM_REDIS, this::getHelpFromRedis);
38-
redisClient = RedisClient.create(vertx, redisOptions);
33+
redisClient = RedisClient.create(vertx, OptionsUtil.getRedisOptions(config()));
34+
3935
// 从 redis 缓存所有 key
4036
Future<JsonArray> imgKeys = Future.future(f -> redisClient.keys(Key.IMG, f));
4137
Future<JsonArray> jsonKeys = Future.future(f -> redisClient.keys(Key.JSON, f));
@@ -88,8 +84,9 @@ private void getGushiciFromRedis(Message<JsonObject> message) {
8884
if (res.cause() instanceof ReplyException) {
8985
ReplyException exception = (ReplyException) res.cause();
9086
message.fail(exception.failureCode(), exception.getMessage());
87+
} else {
88+
message.fail(500, res.cause().getMessage());
9189
}
92-
message.fail(500, res.cause().getMessage());
9390
}
9491
});
9592
}

src/main/java/ma/luan/yiyan/service/LogService.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
import io.vertx.core.json.JsonArray;
88
import io.vertx.core.json.JsonObject;
99
import io.vertx.redis.RedisClient;
10-
import io.vertx.redis.RedisOptions;
1110
import ma.luan.yiyan.constants.Key;
11+
import ma.luan.yiyan.util.OptionsUtil;
1212
import org.apache.logging.log4j.LogManager;
1313
import org.apache.logging.log4j.Logger;
1414

@@ -19,19 +19,14 @@
1919

2020

2121
public class LogService extends AbstractVerticle {
22-
private RedisOptions redisOptions;
2322
private RedisClient redisClient;
2423
private Logger log = LogManager.getLogger(this.getClass());
2524

26-
public LogService(RedisOptions redisOptions) {
27-
this.redisOptions = redisOptions;
28-
}
29-
3025
@Override
3126
public void start(Future<Void> startFuture) {
32-
redisClient = RedisClient.create(vertx, redisOptions);
3327
vertx.eventBus().consumer(Key.SET_HISTORY_TO_REDIS, this::setHistoryToRedis);
3428
vertx.eventBus().consumer(Key.GET_HISTORY_FROM_REDIS, this::getHistoryFromRedis);
29+
redisClient = RedisClient.create(vertx, OptionsUtil.getRedisOptions(config()));
3530
startFuture.complete();
3631
}
3732

src/main/java/ma/luan/yiyan/util/CategoryTrie.java

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ public class CategoryTrie {
1515
* @param categoryKey example: img:shenghuo:buyi
1616
*/
1717
public void insert(String categoryKey) {
18+
if (categoryKey == null || categoryKey.length() == 0) return;
1819
String[] categories = categoryKey.split(":");
1920
CategoryTrie currentTrie = this;
2021
for (String current : categories) {
@@ -56,17 +57,4 @@ private Map<String, CategoryTrie> getDict() {
5657
private void addKey(String key) {
5758
this.keys.add(key);
5859
}
59-
60-
61-
// 测试
62-
public static void main(String[] args) {
63-
CategoryTrie root = new CategoryTrie();
64-
root.insert("img:test:qq");
65-
root.insert("img:test2:qq2");
66-
root.insert("img:test:qq2");
67-
root.insert("json:test2:qq");
68-
System.out.println(root.getKeys(Collections.singletonList("img")));
69-
System.out.println(root.getKeys(Arrays.asList("img","test")));
70-
System.out.println(root.getKeys(Arrays.asList("img","test2","qq2")));
71-
}
7260
}

src/main/java/ma/luan/yiyan/util/ConvertUtil.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public static Future<Buffer> getImageFromBase64(String obj) {
3535
"<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"${height}\" width = \"${width}\">\n" +
3636
" <!-- Generated by https://api.gushi.ci/ -->\n" +
3737
" <g>\n" +
38-
" <text text-anchor=\"start\" letter-spacing = \"${spacing}\" font-smoothing = \"antialiased\" font-family='KaiTi, \"Segoe UI\", \"Lucida Grande\", Helvetica, Arial, \"Microsoft YaHei\", FreeSans, Arimo, \"Droid Sans\",\"wenquanyi micro hei\",\"Hiragino Sans GB\", \"Hiragino Sans GB W3\", sans-serif' font-size=\"${font-size}\" id=\"svg_1\" y=\"${font-size}\" x=\"0\" stroke-width=\"0\" stroke=\"#000\" fill=\"#000000\">${content}</text>\n" +
38+
" <text text-anchor=\"start\" letter-spacing=\"${spacing}\" font-smoothing=\"antialiased\" font-family='KaiTi, \"Segoe UI\", \"Lucida Grande\", Helvetica, Arial, \"Microsoft YaHei\", FreeSans, Arimo, \"Droid Sans\",\"wenquanyi micro hei\",\"Hiragino Sans GB\", \"Hiragino Sans GB W3\", sans-serif' font-size=\"${font-size}\" id=\"svg_1\" y=\"${font-size}\" x=\"0\" stroke-width=\"0\" stroke=\"#000\" fill=\"#000000\">${content}</text>\n" +
3939
" </g>\n" +
4040
"</svg>";
4141

src/main/java/ma/luan/yiyan/util/JsonCollector.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
package ma.luan.yiyan.util;
22

33
import io.vertx.core.json.JsonArray;
4-
import io.vertx.core.json.JsonObject;
54

6-
import java.util.List;
7-
import java.util.function.Supplier;
85
import java.util.stream.Collector;
96

107
public class JsonCollector {
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package ma.luan.yiyan.util;
2+
3+
import io.vertx.core.json.JsonObject;
4+
import io.vertx.redis.RedisOptions;
5+
6+
public class OptionsUtil {
7+
public static RedisOptions getRedisOptions(JsonObject config) {
8+
return new RedisOptions()
9+
.setHost(config.getJsonObject("redis").getString("host","127.0.0.1"))
10+
.setPort(config.getJsonObject("redis").getInteger("port",6379))
11+
.setSelect(config.getJsonObject("redis").getInteger("select",0));
12+
}
13+
}

0 commit comments

Comments
 (0)