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

相关推荐
西西西仓鼠19 分钟前
python学习打卡:DAY 40 训练和测试的规范写法
学习
Magnetic_h31 分钟前
【iOS】方法与消息底层分析
笔记·学习·macos·ios·objective-c·cocoa
今天背单词了吗9801 小时前
算法学习笔记:19.牛顿迭代法——从原理到实战,涵盖 LeetCode 与考研 408 例题
笔记·学习·算法·牛顿迭代法
DKPT2 小时前
Java设计模式之行为型模式(观察者模式)介绍与说明
java·笔记·学习·观察者模式·设计模式
future14123 小时前
C#进阶学习日记
数据结构·学习
lxsy4 小时前
spring-ai-alibaba 1.0.0.2 学习(十六)——多模态
人工智能·学习·ai-alibaba
xian_wwq5 小时前
【学习笔记】Nginx常用安全配置
笔记·学习·nginx
love-self-discipline6 小时前
带货视频评论洞察 Baseline 学习笔记 (Datawhale Al夏令营)
人工智能·笔记·学习
蜡笔小电芯7 小时前
【STM32】const 变量存储学习笔记
笔记·stm32·学习