学习记录:DAY36

前言


我的天,已经是七月六日了,我这几天好像什么都没有干啊。

因为不可抗的因素回家了。

前几天看了订单支付部分,但是太潦草了,今天必须重新来过。


日程


把第9天的内容做完了,有个需要调百度地图接口,因为有审核卡着要迟一点。


学习内容


省流:

  1. spring task
  2. WebSocket
  3. Apache POI

1. Spring Task

定时任务框架

注:spring-task的依赖已经包含在starter中了。

如果要使用,需要在启动类上加上@EnableScheduling注解。

通过一个简单例子:

java 复制代码
@Component
public class MyTask {
    @Scheduled(cron = "0 * * * * ?")
    public void processTimeout() {
        // todo something
    }
}

task通过cron表达式来控制定时任务的触发时机。

Cron 表达式 是一个字符串,用于定义任务触发的时间规则。它由 6 或 7 个域 组成,各域之间用 空格 分隔,每个域代表不同的时间单位。

含义
0 - 59
分钟 0 - 59
小时 0 - 23
1 - 31
1 - 12
0 - 6
可选

示例:

  • 0 0 9 12 10 ? 2022
    表示:2022 年 10 月 12 日上午 9 点整
    (秒=0,分钟=0,小时=9,日=12,月=10,周=?不指定,年=2022)

注意事项

  1. 周和日通常冲突 :若指定了具体日(如12),周通常设为 ?
  2. 年可选:可省略第7个域,表示每年都触发。

Cron手写起来会比较抽象,但是现在有很多在线的生成工具:Cron - 在线Cron表达式生成器

2. WebSocket

基于TCP的网络协议,实现客户端与服务端的持久性双向通信。

spring-websocket依赖

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

创建WebSocket服务

java 复制代码
@Component
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {
    // ...
}

前端代码需要创建与@ServerEndpoint("/ws/{sid}")对应的连接点:

javascript 复制代码
<script type="text/javascript">
    var websocket = null;
    var clientId = Math.random().toString(36).substr(2);

    // 判断当前浏览器是否支持WebSocket
    if('WebSocket' in window){
        // 连接WebSocket节点
        websocket = new WebSocket("ws://localhost:8080/ws/"+clientId);
    }
    else{
        alert('Not support websocket')
    }

    // 连接发生错误的回调方法
    websocket.onerror = function(){
        setMessageInnerHTML("error");
    };

    // 连接成功建立的回调方法
    websocket.onopen = function(){
        setMessageInnerHTML("连接成功");
    }

    // 接收到消息的回调方法
    websocket.onmessage = function(event){
        setMessageInnerHTML(event.data);
    }

    // 连接关闭的回调方法
    websocket.onclose = function(){
        setMessageInnerHTML("close");
    }

    // 监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。
    window.onbeforeunload = function(){
        websocket.close();
    }

    // 将消息显示在网页上
    function setMessageInnerHTML(innerHTML){
        document.getElementById('message').innerHTML += innerHTML + '<br/>';
    }

    // 发送消息
    function send(){
        var message = document.getElementById('text').value;
        websocket.send(message);
    }
    
    // 关闭连接
    function closeWebSocket() {
        websocket.close();
    }
</script>

创建一个会话对象

java 复制代码
private static Map<String, Session> sessionMap = new HashMap();

在连接成功时,将会话加入到对象中:

java 复制代码
@OnOpen
public void onOpen(Session session, @PathParam("sid") String sid) {
    System.out.println("客户端:" + sid + "建立连接");
    sessionMap.put(sid, session);
}

同理,关闭时,移除会话对象:

java 复制代码
@OnClose
public void onClose(@PathParam("sid") String sid) {
    System.out.println("连接断开:" + sid);
    sessionMap.remove(sid);
}

收到客户端消息时的回调:

java 复制代码
@OnMessage
public void onMessage(String message, @PathParam("sid") String sid) {
    System.out.println("收到来自客户端:" + sid + "的信息:" + message);
}

主动向客户端发送消息,因为遍历了所有的会话对象,所以是群发:

java 复制代码
public void sendToAllClient(String message) {
    Collection<Session> sessions = sessionMap.values();
    for (Session session : sessions) {
        try {
            // 服务器向客户端发送消息
            session.getBasicRemote().sendText(message);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

单发则需要根据clientId获取键值:

java 复制代码
Session session = sessionMap.get(clientId);

3. Apache POI

用于处理Miscrosoft Office文件的工具

maven依赖

xml 复制代码
<!-- poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
</dependency>

创建一个XSSF对象

java 复制代码
XSSFWorkbook workbook = new XSSFWorkbook();

也可以从输入流中读取:

java 复制代码
XSSFWorkbook workbook = new XSSFWorkbook(in);

接着读取一个标签页,这与实际的excel操作类似:

java 复制代码
XSSFSheet sheet = workbook.getSheet("Sheet1");

获取行/列对象(0起始):

java 复制代码
XSSFRow row = sheet.getRow(0);
XSSFCell cell = row.getCell(0);

设置列内容:

java 复制代码
row.getCell(1).setCellValue(data.toString());

将内容写出到输出流:

java 复制代码
workbook.write(out);

注:XSSF与流对象类似,需要关闭资源:

java 复制代码
workbook.close();

相关推荐
西岸行者4 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意4 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码4 天前
嵌入式学习路线
学习
毛小茛4 天前
计算机系统概论——校验码
学习
babe小鑫4 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms4 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下4 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。4 天前
2026.2.25监控学习
学习
im_AMBER4 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J4 天前
从“Hello World“ 开始 C++
c语言·c++·学习