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

相关推荐
人生游戏牛马NPC1号10 分钟前
学习 Android (十七) 学习 OpenCV (二)
android·opencv·学习
悠哉悠哉愿意38 分钟前
【机器学习学习笔记】机器学习引言
笔记·学习·机器学习
梦幻精灵_cq1 小时前
『专利好药用力心脑血管健康』——爱上古中医(28)(健康生活是coder抒写优质代码的前提条件——《黄帝内经》伴读学习纪要)
学习
指针刺客1 小时前
储能变流器学习之MPPT
学习
Go 鹏ya1 小时前
【Python学习笔记】whl包打包
笔记·python·学习
爱隐身的官人9 小时前
爬虫基础学习-爬取网页项目(二)
前端·爬虫·python·学习
Ysn071911 小时前
pytorch_grad_cam 库学习笔记—— Ablation-CAM 算法的基类 AblationCAM 和 AblationLayer
pytorch·笔记·学习
小清兔11 小时前
c#基础知识
开发语言·数据库·学习·unity·c#·游戏引擎·.net
霜绛11 小时前
Unity笔记(七)——四元数、延迟函数、协同程序
笔记·学习·unity·游戏引擎
2006yu12 小时前
从零开始学习单片机13
单片机·嵌入式硬件·学习