Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion frameworks/Java/tio-boot/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -27,16 +27,21 @@
<groupId>com.litongjava</groupId>
<artifactId>java-db</artifactId>
<version>1.5.0</version>
</dependency>

<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>

<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>


<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,6 @@ public class MainAppConfig implements BootConfiguration {

@Override
public void config() throws Exception {
// add route
IndexHandler controller = new IndexHandler();

TioBootServer server = TioBootServer.me();
HttpRequestRouter requestRouter = server.getRequestRouter();

requestRouter.add("/", controller::index);
requestRouter.add("/plaintext", controller::plaintext);
requestRouter.add("/json", controller::json);

DbHandler dbQueryController = new DbHandler();
requestRouter.add("/db", dbQueryController::db);
requestRouter.add("/queries", dbQueryController::queries);
requestRouter.add("/updates", dbQueryController::updates);
requestRouter.add("/fortunes", dbQueryController::fortunes);

CacheHandler cacheController = new CacheHandler();
requestRouter.add("/cachedQuery", cacheController::cachedQuery);

boolean db = EnvUtils.getBoolean("db", true);
if (db) {
Expand All @@ -49,6 +31,25 @@ public void config() throws Exception {
} catch (Exception e) {
e.printStackTrace();
}
}

// add route
IndexHandler controller = new IndexHandler();

TioBootServer server = TioBootServer.me();
HttpRequestRouter requestRouter = server.getRequestRouter();
if (requestRouter != null) {
requestRouter.add("/", controller::index);
requestRouter.add("/plaintext", controller::plaintext);
requestRouter.add("/json", controller::json);

DbHandler dbQueryController = new DbHandler();
requestRouter.add("/db", dbQueryController::db);
requestRouter.add("/queries", dbQueryController::queries);
requestRouter.add("/updates", dbQueryController::updates);
requestRouter.add("/fortunes", dbQueryController::fortunes);

CacheHandler cacheController = new CacheHandler();
requestRouter.add("/cachedQuery", cacheController::cachedQuery);
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package com.litongjava.tio.http.server.controller;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

import com.alibaba.fastjson2.JSON;
import com.litongjava.db.activerecord.Db;
import com.litongjava.db.activerecord.Row;
import com.litongjava.tio.boot.http.TioRequestContext;
import com.litongjava.tio.http.common.HeaderName;
import com.litongjava.tio.http.common.HeaderValue;
import com.litongjava.tio.http.common.HttpRequest;
Expand All @@ -16,26 +16,26 @@

public class CacheHandler {
// private Logger log = LoggerFactory.getLogger(this.getClass());
String sql = "SELECT id, randomNumber FROM world WHERE id = ?";

public HttpResponse cachedQuery(HttpRequest request) {
String queries = request.getParam("queries");
List<Map<String, Object>> recordMaps = RandomUtils.randomWorldNumbers()
// limit
.limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量
.mapToObj(id -> findByIdWithCache("world", id)) // 使用 mapToObj 将 int 映射为对象
.filter(Objects::nonNull) // 过滤掉 null 值
.map(Row::toMap) // 将每个 Record 对象转换为 Map
.collect(Collectors.toList()); // 收集到 List

HttpResponse httpResponse = new HttpResponse(request);
httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON);
httpResponse.setBody(JSON.toJSONBytes(recordMaps));
return httpResponse;

}
int queryCount = RandomUtils.parseQueryCount(queries);

List<Map<String, Object>> recordMaps = new ArrayList<>();

int[] randomNumbers = RandomUtils.randomWorldNumbers().limit(queryCount).toArray();
for (int id : randomNumbers) {
Row row = Db.findFirstByCache("world", id, sql, id);
if (row != null) {
recordMaps.add(row.toMap());
}
}

private Row findByIdWithCache(String tableName, int id) {
String sql = "SELECT id, randomNumber FROM world WHERE id = ?";
return Db.findFirstByCache(tableName, id, sql, id);
HttpResponse response = TioRequestContext.getResponse();
response.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON);
response.setBody(JSON.toJSONBytes(recordMaps));
return response;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,14 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;

import com.alibaba.fastjson2.JSON;
import com.jfinal.template.Engine;
import com.jfinal.template.Template;
import com.litongjava.db.activerecord.Db;
import com.litongjava.db.activerecord.Row;
import com.litongjava.ehcache.EhCacheKit;
import com.litongjava.tio.boot.http.TioRequestContext;
import com.litongjava.tio.http.common.HeaderName;
import com.litongjava.tio.http.common.HeaderValue;
import com.litongjava.tio.http.common.HttpRequest;
Expand All @@ -23,6 +22,10 @@
import com.litongjava.tio.http.server.utils.RandomUtils;

public class DbHandler {
private Engine engine = Engine.use();
private String filename = "fortunes.html";
private Template template = engine.getTemplate(filename);
private static final byte[] bytes = "{}".getBytes();

public HttpResponse db(HttpRequest request) {
Integer id = request.getInt("id");
Expand All @@ -31,7 +34,7 @@ public HttpResponse db(HttpRequest request) {
}

//System.out.println("id:" + id);
HttpResponse httpResponse = new HttpResponse(request);
HttpResponse httpResponse = TioRequestContext.getResponse();

// int id = 11;
// String sql="SELECT id, randomNumber FROM world WHERE id = ?";
Expand All @@ -40,7 +43,7 @@ public HttpResponse db(HttpRequest request) {
if (recored != null) {
httpResponse.setBody(JSON.toJSONBytes(recored.toMap()));
} else {
httpResponse.setBody("{}".getBytes());
httpResponse.setBody(bytes);
}

httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON);
Expand All @@ -51,15 +54,19 @@ public HttpResponse db(HttpRequest request) {
// @GetMapping("/queries")
public HttpResponse queries(HttpRequest request) {
String queries = request.getParam("queries");
List<Map<String, Object>> recordMaps = RandomUtils.randomWorldNumbers()
// limit
.limit(RandomUtils.parseQueryCount(queries)) // 限制查询数量
.mapToObj(id -> Db.findById("world", id)) // 使用 mapToObj 将 int 映射为对象
.filter(Objects::nonNull) // 过滤掉 null 值
.map(Row::toMap) // 将每个 Record 对象转换为 Map
.collect(Collectors.toList()); // 收集到 List
int queryCount = RandomUtils.parseQueryCount(queries);
int[] randomNumbers = RandomUtils.randomWorldNumbers().limit(queryCount).toArray();

HttpResponse httpResponse = new HttpResponse(request);
List<Map<String, Object>> recordMaps = new ArrayList<>();

for (int id : randomNumbers) {
Row row = Db.findById("world", id);
if (row != null) {
recordMaps.add(row.toMap());
}
}

HttpResponse httpResponse = TioRequestContext.getResponse();
httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON);
httpResponse.setBody(JSON.toJSONBytes(recordMaps));
return httpResponse;
Expand All @@ -71,27 +78,24 @@ public HttpResponse updates(HttpRequest request) {

EhCacheKit.removeAll("world");

List<Map<String, Object>> updatedRecords = RandomUtils.randomWorldNumbers()// random numbers
// limit
.limit(RandomUtils.parseQueryCount(queries))
// map
.mapToObj(id -> Db.findById("world", id))
// not null
.filter(Objects::nonNull).map(record -> {
int currentRandomNumber = record.getInt("randomNumber"); // "randomnumber"
int newRandomNumber;
do {
newRandomNumber = RandomUtils.randomWorldNumber();
} while (newRandomNumber == currentRandomNumber);

record.set("randomnumber", newRandomNumber);
Db.update("world", "id", record); // update
return record;
})
// tomap
.map(Row::toMap)
// to List
.collect(Collectors.toList());
int queryCount = RandomUtils.parseQueryCount(queries);
int[] randomNumbers = RandomUtils.randomWorldNumbers().limit(queryCount).toArray();
List<Map<String, Object>> updatedRecords = new ArrayList<>();

for (int id : randomNumbers) {
Row row = Db.findById("world", id);
if (row != null) {
int currentRandomNumber = row.getInt("randomNumber"); // "randomnumber"
int newRandomNumber;
do {
newRandomNumber = RandomUtils.randomWorldNumber();
} while (newRandomNumber == currentRandomNumber);

row.set("randomnumber", newRandomNumber);
Db.update("world", "id", row); // update
updatedRecords.add(row.toMap());
}
}

HttpResponse httpResponse = new HttpResponse(request);
httpResponse.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON);
Expand All @@ -116,11 +120,8 @@ public HttpResponse fortunes(HttpRequest request) throws IllegalAccessException,
viewData.put("fortunes", fortunes);

// 转换为 HTML
Engine engine = Engine.use();
String filename = "fortunes.html";
Template template = engine.getTemplate(filename);
String html = template.renderToString(viewData);

return Resps.html(request, html);
HttpResponse httpResponse = TioRequestContext.getResponse();
return Resps.html(httpResponse, html);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.litongjava.tio.http.server.controller;

import com.alibaba.fastjson2.JSON;
import com.litongjava.tio.boot.http.TioRequestContext;
import com.litongjava.tio.http.common.HeaderName;
import com.litongjava.tio.http.common.HeaderValue;
import com.litongjava.tio.http.common.HttpRequest;
Expand All @@ -22,19 +23,16 @@ public HttpResponse index(HttpRequest request) {
}

public HttpResponse plaintext(HttpRequest request) {
// 更高性能的写法
HttpResponse ret = new HttpResponse(request);
ret.setBody(HELLO_WORLD_BYTES);
ret.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_TXT);
return ret;
HttpResponse response = TioRequestContext.getResponse();
response.setBody(HELLO_WORLD_BYTES);
response.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_TXT);
return response;
}

// 在IndexController中添加
public HttpResponse json(HttpRequest request) {
// 更高性能的写法
HttpResponse ret = new HttpResponse(request);
ret.setBody(JSON.toJSONString(new Message(HELLO_WORLD)).getBytes());
ret.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON);
return ret;
HttpResponse response = TioRequestContext.getResponse();
response.setBody(JSON.toJSONBytes(new Message(HELLO_WORLD)));
response.addHeader(HeaderName.Content_Type, HeaderValue.Content_Type.TEXT_PLAIN_JSON);
return response;
}
}
}
41 changes: 22 additions & 19 deletions frameworks/Java/tio-boot/src/main/resources/logback.xml
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
<configuration debug="false" xmlns="http://ch.qos.logback/xml/ns/logback" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ch.qos.logback/xml/ns/logback https://raw.githubusercontent.com/enricopulatzo/logback-XSD/master/src/main/xsd/logback.xsd
http://ch.qos.logback/xml/ns/logback ">

<!-- 定义日志文件的存储地址,避免在 Logback 的配置中使用相对路径 -->
<property name="LOG_HOME" value="logs" />
<!--格式化输出:%d表示日期,%-6level:日志级别从左显示6个字符宽度,%m:日志消息,%n是换行符 -->
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-6level%logger{0}.%M:%L - %m%n" />

<!-- 格式化输出:%d 表示日期,[%thread] 输出线程名称,%-6level 表示日志级别占6个字符宽度,%logger{1}.%M:%L 表示类名、方法名和行号,%m 表示日志消息,%n 是换行符 -->
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-6level %logger{1}.%M:%L - %m%n" />

<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
Expand All @@ -12,41 +16,40 @@
</encoder>
</appender>

<!-- 按照每天生成日志文件 -->
<!-- 按照每小时生成日志文件 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<fileNamePattern>${LOG_HOME}/project-name-%d{yyyy-MM-dd}.log</fileNamePattern>
<!--日志文件保留天数 -->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 日志文件输出的文件名,包含日期和小时 -->
<fileNamePattern>${LOG_HOME}/log.%d{yyyyMMddHH}.%i.log</fileNamePattern>
<!-- 日志文件保留天数 -->
<maxHistory>180</maxHistory>
<!-- 每个日志文件的最大大小 -->
<maxFileSize>100MB</maxFileSize>
</rollingPolicy>
<!--日志文件最大的大小 -->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
</appender>
<!--专为 spring 定制 -->

<!-- Spring 框架日志级别设置 -->
<logger name="org.springframework" level="info" />
<!-- show parameters for hibernate sql 专为 Hibernate 定制 -->

<!-- Hibernate 日志级别设置,显示 SQL 语句和绑定参数 -->
<logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="TRACE" />
<logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG" />
<logger name="org.hibernate.SQL" level="DEBUG" />
<logger name="org.hibernate.engine.QueryParameters" level="DEBUG" />
<logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG" />

<!--myibatis log configure -->
<!-- MyBatis 和 SQL 相关日志配置 -->
<logger name="com.apache.ibatis" level="TRACE" />
<logger name="java.sql.Connection" level="DEBUG" />
<logger name="java.sql.Statement" level="DEBUG" />
<logger name="java.sql.PreparedStatement" level="DEBUG" />

<!-- 日志输出级别 和输出源 -->
<!-- 根日志记录器的日志级别和输出目标 -->
<root level="info">
<appender-ref ref="STDOUT" />
<appender-ref ref="FILE" />
</root>
</configuration>
</configuration>
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,9 @@

public class MainAppTest {

@Test
// @Test
public void test() {
boolean boolean1 = EnvUtils.getBoolean("native", false);
System.out.println(boolean1);
}

}
Loading