学习记录: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();

相关推荐
小眼睛FPGA1 小时前
【盘古100Pro+开发板实验例程】FPGA学习 | 腐蚀膨胀 | 图像实验指导手册
科技·学习·ai·fpga开发·fpga
晨非辰2 小时前
#C语言——刷题攻略:牛客编程入门训练(四):运算(二)
c语言·开发语言·经验分享·学习·visual studio
Chef_Chen7 小时前
从0开始学习R语言--Day54--双重固定模型
学习
宇寒风暖8 小时前
Flask 框架全面详解
笔记·后端·python·学习·flask·知识
朱小弟cs69 小时前
Orange的运维学习日记--23.Linux计划任务详解
linux·运维·学习
Hello小赵10 小时前
嵌入式硬件学习(十)—— LED驱动+杂项设备驱动
嵌入式硬件·学习
W.KN10 小时前
Servlet 学习笔记
笔记·学习·servlet
Nan_Shu_61410 小时前
学习:入门uniapp Vue3组合式API版本(17)
前端·vue.js·学习·uni-app
hunteritself11 小时前
DeepSeek 论文夺冠,智谱开源 GLM-4.5,OpenAI 学习模式上线!| AI Weekly 7.28-8.3
人工智能·学习·chatgpt·开源·bug·powerpoint
Dymc11 小时前
【计算机视觉与代码大模型全景解析:从理论基础到学习路线】
人工智能·学习·计算机视觉