首页 > 其他分享 >5.SpringTask,WebSocket

5.SpringTask,WebSocket

时间:2024-06-01 11:44:20浏览次数:15  
标签:触发 websocket SpringTask sid WebSocket message 连接

Spring Task,WebSocket

Spring Task

介绍:

  • Spring Task是Spring框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑;
  • 定位:定时任务框架
  • 作用:定时自动执行某段Java代码;

应用场景:

  • 信用卡每月还款提醒;
  • 银行贷款每月还款提醒;
  • 火车票售票系统处理未支付订单;
  • 入职纪念日为用户发送通知;

cron表达式:

介绍:
  • cron表达式其实就是一个字符串,通过cron表达式可以定义任务触发的时间
  • 构成规则:分为6或7个域,由空格分隔开,每个域代表一个含义;
  • 每个域的含义分别为:秒、分钟、小时、日、月、周、年(可选);
各字段含义:
字段 允许值 允许的特殊字符
秒(Seconds) 0~59的整数 , - * / 四个字符
分(Minutes) 0~59的整数 , - * / 四个字符
小时(Hours) 0~23的整数 , - * / 四个字符
日期(DayofMonth) 1~31的整数(但是你需要考虑你月的天数) , - * ? / L W C 八个字符
月份(Month) 1~12的整数或者 JAN-DEC , - * / 四个字符
星期(DayofWeek) 1~7的整数或者 SUN-SAT(1=SUM) , - * ? / L C # 八个字符
年(可选,留空)(Year) 1970~2099 , - * / 四个字符
特殊字符含义
  1. * :表示匹配该域的任意值。假如在Minutes域使用,即表示每分钟都会触发事件。
  2. ?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法:1313 15 20*?,其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发,实际上并不是这样。
    • :表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
  3. /:表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着第5分钟触发一次,之后每隔20分钟触发一次;
  4. ,:表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
  5. L:表示最后,只能出现在DayofWeek和DayofMonth域。在DayofMonth域使用L,表示最后一天;如果在DayofWeek域使用5L,意味着在最后的一个星期五触发。
  6. W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份。
  7. LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
  8. :用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第四个星期二,第四周的星期二。

例子:
分钟 小时
0 0 9 12 10 2022
  • 2022年10月12日上午9点整 对应的表达式为:0 0 9 12 10 ? 2022
在线工具:

使用步骤:

  1. 导入maven坐标 spring-context(已存在),没有属于自己的jar包,集成在spring-context中;
  2. 启动类添加注解 @EnableScheduling 开启任务调度;
  3. 自定义定时任务类:
    • 类中添加方法,方法添加 @Scheduled 注解设置定时执行;
    • 注解参数为 cron表达式;

自定义定时任务类:

@Component
@Slf4j
public class MyTask {
	// 定时任务 每隔5秒触发一次
	@Scheduled(cron = "0/5 * * * * ?")
	public void executeTask(){
		log.info("定时任务开始执行");
	}
}

WebSocket

介绍:

简介:
  • WebSocket是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工通信——浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输;
HTTP协议和WebSocket协议对比:
  • HTTP是短连接
  • WebSocket是长连接
  • HTTP通信是单向的,基于请求响应模式;
  • WebSocket支持双向通信;
  • HTTP和WebSocket底层都是TCP连接;
应用场景:
  • 视频弹幕;
  • 网页聊天;
  • 体育实况更新;
  • 股票基金报价实时更新;

后端实施:

简介:
  1. 导入WebSocket的maven坐标;
  2. 创建一个配置类,注册WebSocket的服务端组件;
  3. 创建WebSocket服务端组件自定义类,用于和客户端通信;
导入依赖:
  • 在pom.xml中导入WebSocket的maven坐标:
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-websocket</<artifactId>>
</dependency>
配置类开启对WebSocket的支持:
/**
 *注册WebSocket的服务端组件
 */
@Configuration
public class WebSocketConfig {
	
	@Bean
	public ServerEndpointExporter serverEndpointExporter(){
		return new ServerEndpointExporter();
	}
}
WebSocket服务端, 用于与客户端通信:
  • 添加注解会自动回调:
  • session: 在WebSocket上下文中,session对象代表了一个打开的WebSocket会话。这个对象提供了与远程端点通信的方法和属性。
  • getBasicRemote(): 这是Session对象的一个方法,它返回一个RemoteEndpoint.Basic对象。RemoteEndpoint.Basic是一个接口,它提供了发送文本消息、二进制消息以及关闭连接等方法。
  • sendText(message): 这是RemoteEndpoint.Basic接口的一个方法,它用于向远程端点发送一个文本消息。参数message是一个字符串,代表了要发送的消息内容。
package com.sky.websocket;

import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * WebSocket服务
 */
@Component
// 定义WebSocket服务器端点的访问路径
@ServerEndpoint("/ws/{sid}")
public class WebSocketServer {

    //存放会话对象
    private static Map<String, Session> sessionMap = new HashMap();

    /**
     * 连接建立成功调用的方法
     */
    @OnOpen
    public void onOpen(Session session, @PathParam("sid") String sid) {
        System.out.println("客户端:" + sid + "建立连接");
        sessionMap.put(sid, session);
    }

    /**
     * 收到客户端消息后调用的方法
     *
     * @param message 客户端发送过来的消息
     */
    @OnMessage
    public void onMessage(String message, @PathParam("sid") String sid) {
        System.out.println("收到来自客户端:" + sid + "的信息:" + message);
    }

    /**
     * 连接关闭调用的方法
     *
     * @param sid
     */
    @OnClose
    public void onClose(@PathParam("sid") String sid) {
        System.out.println("连接断开:" + sid);
        sessionMap.remove(sid);
    }

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

}

前端实施:

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>WebSocket Demo</title>
</head>
<body>
    <input id="text" type="text" />
    <button onclick="send()">发送消息</button>
    <button onclick="closeWebSocket()">关闭连接</button>
    <div id="message">
    </div>
</body>
<script type="text/javascript">
    var websocket = null;
    // 生成随机id,防止重复
    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>
</html>

标签:触发,websocket,SpringTask,sid,WebSocket,message,连接
From: https://www.cnblogs.com/chj020415/p/18225760

相关文章

  • 基于WebSocket的modbus通信(一)- 服务器
    ModbusTcp协议是基于tcp的,但不是说一定要通过tcp协议才能传输,只要能传输二进制的地方都可以。比如WebSocket协议。但由于目前我只有tcp上面的modbus服务器实现,所以我必须先用tcp连接借助已有工具来验证我的服务器是否写正确。效果ModBusTCP协议报文ModBusTCP协议报文比较复......
  • golang开发 gorilla websocket的使用
    很多APP都需要主动向用户推送消息,这就需要用到长连接的服务,即我们通常提到的websocket,同样也是使用socket服务,通信协议是基本类似的,在go中用的最多的、也是最简单的socket服务就是gorilla/websocket,它有21.1K的star,足以说明它的受欢迎程度,它的github地址是https://github.com/g......
  • WebSocket服务搭建
    1、在NuGet包管理工具安装websocket包 2、添加自定义中间件app.UseWebSockets();app.UseMiddleware<CustomWebSocketMiddleware>();3、编写websocket中间件privatereadonlyRequestDelegate_next;privateILogger<CustomWebSocketMiddleware>_Logger;publicList<Web......
  • websocket实现消息实时通信
    后端代码实现1、导入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><version>3.2.5</version></dependency>2、创建websocket客户端对象。@Getter@Set......
  • vue + websocket + speak-tts 实现推送的告警消息弹框显示在右下角并语音播报出内容
    最近接了个项目需求,给设备配置语音加弹框告警。用户登录项目后不管在哪个页面,有告警就全局在右下角消息弹框加语音播报,下面浅介绍下我在开发中的流程以及遇到的坑!!!1、首先项目中安装speak-tts语音播报插件。npminstallspeak-tts2、创建一个全局的speech.js文件,文件中引入插......
  • 基于webapi的websocket聊天室(番外二)
    我比较好奇的是webapi服务器怎么处理http请求和websocket请求。有了上一篇番外的研究,这里就可以试着自己写个非常简易的webapi服务器来接收这两种请求。效果http请求消息打印响应解析websocket请求消息打印使用聊天室测试其实两种请求差不多,就只是一些头部字段......
  • websocket和http的区别
    1、websocket1.1介绍WebSocket是一种实时通信协议,它允许客户端和服务器之间进行双向通信,而不需要每次请求都重新建立连接。WebSocket是HTML5中的新功能,它建立在HTTP协议之上,通过握手协议来建立持久化的连接。WebSocket的握手协议比HTTP的握手协议更简单,因为WebSocket......
  • 基于webapi的websocket聊天室(番外一)
    上一篇我已经实现了聊天室,并且在协议中实现了4种类型的消息传输。其实还可以添加video,audio,live等等类型。不过假如把目前的协议看作RCP1.0版的话,这个版本就只支持有限的4种消息。精力有限啊。也许RCP2.0就可以把video,audio类型加进去?这不是这篇番外考虑的。而是我在定义和实现......
  • 基于webapi的websocket聊天室(四)
    上一篇实现了多聊天室。这一片要继续改进的是实现收发文件,以及图片显示。效果问题websocket本身就是二进制传输。文件刚好也是二进制存储的。文件本身的传输问题不太,但是需要传输文件元数据,比如文件名和扩展名之类的。这很必要,如果我们想知道怎么展示这个文件的话。比如这个......
  • java netty 实现 websocket 服务端和客户端双向通信 实现心跳和断线重连 完整示例
    javanetty实现websocket服务端和客户端双向通信实现心跳和断线重连完整示例maven依赖<dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.97.Final</version></dependency>服务端一个接口IGet......