Spring Boot笔记-利用Quartz进行定时任务,利用websocket推送到浏览器(界面为thymeleaf)
效果如下,浏览器输入URL:
等待一段时间,websocket主动推送
后端打印:
程序结构如下:
QuartzConfig.java
@Configuration
public class QuartzConfig {@Beanpublic JobDetail job(){return JobBuilder.newJob(QuartzJob.class).storeDurably().build();}@Beanpublic Trigger trigger(){CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("*/30 * * * * ?");return TriggerBuilder.newTrigger().forJob(job()).withSchedule(scheduleBuilder).build();}
}
WebSocketConfig.java
@Component
public class WebSocketConfig {@Beanpublic ServerEndpointExporter serverEndpointExporter(){return new ServerEndpointExporter();}
}
MyController.java
@Controller
public class MyController {@GetMapping("/")public String test(){return "index";}
}
QuartzJob.java
public class QuartzJob extends QuartzJobBean {@AutowiredGoodsRepository goodsRepository;@AutowiredWebSocket webSocket;@Overrideprotected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {String str = "";for(Goods goods : goodsRepository.getGoodsArrayList()){str += goods.toString();}webSocket.onMessage(str);}
}
Goods.java
@Data
public class Goods {Integer id;String name;Integer count;
}
GoodsRepository.java
@Repository
public class GoodsRepository {private static ArrayList<Goods> goodsArrayList = new ArrayList<>();static {Goods goods1 = new Goods();goods1.setId(1);goods1.setName("石油50L");goods1.setCount(100);goodsArrayList.add(goods1);Goods goods2 = new Goods();goods2.setId(1);goods2.setName("石油150L");goods2.setCount(100);goodsArrayList.add(goods2);Goods goods3 = new Goods();goods3.setId(1);goods3.setName("石油250L");goods3.setCount(100);goodsArrayList.add(goods3);Goods goods4 = new Goods();goods4.setId(1);goods4.setName("石油300L");goods4.setCount(100);goodsArrayList.add(goods4);}public ArrayList<Goods> getGoodsArrayList(){return goodsArrayList;}
}
WebSocket.java
@Component
@ServerEndpoint("/websocket")
public class WebSocket {//与某个客户端连接对话,通过此对客户端发送消息private Session session;//存放所有连接的客户端private static ConcurrentLinkedQueue<WebSocket> concurrentLinkedQueue = new ConcurrentLinkedQueue<>();@OnOpenpublic void onOpen(Session session){//默认客户端,没有重名this.session = session;concurrentLinkedQueue.add(this);System.out.println("【webSocket连接成功】当前连接人数为:" + concurrentLinkedQueue.size());}@OnClosepublic void onClose() {Iterator<WebSocket> iterator = concurrentLinkedQueue.iterator();while (iterator.hasNext()){WebSocket next = iterator.next();if(next == this){concurrentLinkedQueue.remove(next);}}}@OnErrorpublic void onError(Session session, Throwable throwable){System.out.println("error:");throwable.printStackTrace();}@OnMessagepublic void onMessage(String message){Iterator<WebSocket> iterator = concurrentLinkedQueue.iterator();while (iterator.hasNext()){WebSocket next = iterator.next();try {next.session.getBasicRemote().sendText(message);}catch (IOException e) {e.printStackTrace();}}}}
DemoApplication.java
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}
index.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>Title</title><script type="text/javascript">let ws = null;window.onload=function(){WebSocketTest();}function WebSocketTest(){if ("WebSocket" in window){alert("浏览器支持 WebSocket!");// 打开一个 web socketws = new WebSocket("ws://127.0.0.1:8080/websocket");ws.onmessage = function (evt){let received_msg = evt.data;alert("接收推送数据:" + received_msg);};ws.onclose = function(){// 关闭 websocketalert("连接已关闭...");};}else{// 浏览器不支持 WebSocketalert("浏览器不支持 WebSocket!");}}</script></head>
<body><h1>推送页面</h1></body>
</html>
源码打包下载地址:
https://github.com/fengfanchen/Java/tree/master/QuartzDemo
Spring Boot笔记-利用Quartz进行定时任务,利用websocket推送到浏览器(界面为thymeleaf)相关推荐
- Spring Boot 如何解决多个定时任务阻塞问题?
大家好,我是不才磊哥~ 最近长文撸多了,有点累,今天来点简单的. 今天这篇文章介绍一下Spring Boot 中 如何开启多线程定时任务? 为什么Spring Boot 定时任务是单线程的? 想要解释 ...
- spring boot项目中处理Schedule定时任务
默认,springboot已经支持了定时任务Schedule模块,所以一般情况已经完全能够满足我们的实际需求,一般来说,没有必要在加入其他类似于:quartz 另外,在这里提一个实际项目中,关于定时任 ...
- 在Spring Boot中使用@Scheduled实现定时任务
2019独角兽企业重金招聘Python工程师标准>>> 在Spring Boot中使用@Scheduled实现定时任务 之前没有使用Spring Boot的Java风格配置的时候,用 ...
- Spring/Spring boot正确集成Quartz及解决@Autowired失效问题
Spring/Spring boot正确集成Quartz及解决@Autowired失效问题 参考文章: (1)Spring/Spring boot正确集成Quartz及解决@Autowired失效问题 ...
- Flex通过Blazeds利用Remoteservice与后台java消息推送
Flex通过Blazeds利用Remoteservice与后台java消息推送 准备工作:Myeclipse中先建立一个Web project工程,然后导入Blazeds的文件,再转换为Flex项目类 ...
- Spring Boot笔记
1.什么是SpringBoot 1.简介 就是一个javaweb的开发框架 以前Spring的配置太多,太麻烦,为了提高开发效率,于是开始提倡"约定大于配置",进而衍生出一些一站式 ...
- Spring Boot中使用@Scheduled创建定时任务
我们在编写Spring Boot应用中经常会遇到这样的场景,比如:我需要定时地发送一些短信.邮件之类的操作,也可能会定时地检查和监控一些标志.参数等. 创建定时任务 在Spring Boot中编写定时 ...
- Spring Boot笔记-普通异常错误截取及构造错误页面
在web开发过程中,数据问题会有异常,会抛到页面上,这样造成用户体验差. 目前这个笔记是使用Spring Boot获取异常,并构造新的界面 程序运行截图如下: 另外一个: 这样的话就达到了页面友好的效 ...
- 关于Spring boot中的Quartz配置启动开关问题(启动、停止)
最近在做一个项目,项目中有多个模块,总体构架为SpringBoot +Quartz+其他(其他的不是重点啦). 问题提出: 项目中会有Quartz做的定时任务模块,至于怎么使用Quartz网上一搜一大 ...
最新文章
- 【python练习】基于socket的FTP程序 v1.1.0(支持多用户)
- swiper切换按钮位置改变_swiper插件自定义切换箭头按钮
- python plt画半对数坐标_特征工程大传:对数变换
- 网络拓扑故障诊断讲解总结
- 2、matplotlib中的 ax=fig.add_axes([0,0,1,1])详解
- ubuntu系统配置双网卡方法
- mac 程序员装机必备 一篇齐全
- css怎么实现三角形边框,css border实现的三角形图案
- 在ASP.NET中获取参数POST和GET方式提交的参数
- linux与RMB的关系,Ghost 与 Linux 的兼容性
- 计算机恢复桌面,桌面图标打开方式怎么还原_电脑图标打开方式恢复方法-win7之家...
- Apereo CAS 5.0.X 配置数据库认证方式
- 嵌入式课程设计:socket通信模拟服务器客户端实现文件传送(基于c++语言)
- VirtualBOX 虚拟机安装 OS X 10.9 Mavericks 及 Xcode 5,本人X220亲测
- 字符串内穿插{}使用
- Java项目—健身房管理系统(附源码+文档)
- 将GHOST后计算机驱动Standard PC改为ACPI Multiprocessor PC
- 中国古代兵器与兵书·铜兵生辉
- 校园BBS+校园贴吧 发帖 评论 点赞 回复 用户管理 好友管理 聊天的实现
- 虚拟机VMware启动出现 Boot Manager